Skip to content

Commit d8a6d6d

Browse files
Maxence Maireauxjuliend88
authored andcommitted
Factory V1.5
1 parent 09d47ba commit d8a6d6d

File tree

263 files changed

+9318
-16668
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

263 files changed

+9318
-16668
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
.vagrant
55
Vagrantfile
66
silo*
7+
.DS_Store

Makefile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.DEFAULT_GOAL := help
2+
3+
create: heat-create ## create factory
4+
build-images: build-images ## build for images, please use argument : bundle=YOUR-BUNDLE-NAME
5+
build-os: build-os ## build for os, please us argument : os=YOUR-OS-NAME
6+
help: help ## Help
7+
8+
heat-create:
9+
bash -c "sh bin/heat.sh"
10+
11+
build-images:
12+
./bin/build-images.sh ${bundle}
13+
14+
build-os:
15+
./bin/build-os.sh ${os}
16+
17+
18+
help:
19+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

README.md

Lines changed: 120 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# OpenStack Image Factory
22

3-
Depuis plusieurs semaines, si vous nous suivez, vous avez pu voir passer les différents épisodes des [Stacks 5
3+
Si vous nous suivez, vous avez pu voir passer les différents épisodes des [Stacks 5
44
Minutes](http://dev.cloudwatt.com/fr/recherche.html?q=5+minutes+stacks&submit=submit). Nous allons passer dans
55
les coulisses et vous expliquer comment construire les vôtres. Suivez le guide et faites attention où vous marchez.
66

77
## L'usine
88

99
Dans chaque épisode, vous trouverez des stacks HEAT, qui s'appuient sur des images serveur différentes. Ces images
10-
sont des Ubuntu Trusty Tahr, préparées avec une pile applicative complète, pour avoir un démarrage plus rapide.
10+
sont préparées avec une pile applicative complète, pour avoir un démarrage plus rapide.
11+
1112
La boîte à outils pour assembler ces images est full Open Source, simple et efficace :
1213

1314
* *Debian Jessie :* Comme système de référence pour l'usine.
@@ -18,108 +19,146 @@ d'images serveurs pour différentes plates-formes, notamment Openstack.
1819
particularité est de fonctionner sans agent.
1920
* *Shell :* What Else ?
2021

22+
2123
Pour faciliter la création de vos propres images, nous avons rassemblé notre chaîne de montage
22-
[dans un projet Github](https://github.com/cloudwatt/os_image_factory). Nous avons également pour vous un playbook
23-
Ansible et une stack HEAT qui vont vous fournir un serveur de build d'image avec tous les outils nécessaires. Pour un peu
24+
[dans un projet Github](https://github.com/cloudwatt/os_image_factory).
25+
26+
Nous vous avons également préparé une stack HEAT qui vont vous fournir un serveur de build d'image avec tous les outils nécessaires. Pour un peu
2427
plus de confort, nous avons ajouté un serveur Jenkins dans la boîte à outils. Donc, pour démarrer votre propre usine :
2528

2629
* Munissez vous de :
27-
* votre [compte Cloudwatt](https://www.cloudwatt.com/cockpit/#/create-contact), avec une [paire de clés existante](https://console.cloudwatt.com/project/access_and_security/?tab=access_security_tabs__keypairs_tab)
28-
* les outils [OpenStack CLI](http://docs.openstack.org/cli-reference/content/install_clients.html)
29-
* Faites un clone local du repository [os_image_factory](https://github.com/cloudwatt/os_image_factory)
30-
* Placez vous dedans
31-
* Lancez la stack HEAT qui va assembler l'usine :
32-
33-
```
34-
heat stack-create $FACTORY_NAME -f setup/os_image_factory.heat.yml -Pkeypair_name=$YOUR_KEYPAIR_NAME
35-
```
30+
* votre [compte Cloudwatt](https://www.cloudwatt.com/cockpit/#/create-contact),
31+
* une [paire de clés existante](https://console.cloudwatt.com/project/access_and_security/?tab=access_security_tabs__keypairs_tab)
32+
* Lancez la stack HEAT qui va assembler l'usine via le [OneClick](https://www.cloudwatt.com/fr/applications/) ou directement en recupérant le template Heat sur [le github de Cloudwatt](https://github.com/cloudwatt/os_image_factory/tree/master/setup)
3633

37-
Le provisionning de ce serveur se fait en partant d'une image de base Debian Jessie et en applicant le playbook
38-
Ansible ```setup/os_image_factory.playbook.yml```, cela prend donc quelques minutes. Pour minimiser les risques, nous
39-
avons pris le parti de n'autoriser que des connexions via SSH. Pour accéder au Jenkins de l'usine, il faut donc établir
34+
Le provisionning de ce serveur se fait en partant d'une image dites **bundle** avec l'ensemble des outils necessaires. Pour minimiser les risques, nous avons pris le parti de n'autoriser que des connexions via SSH. Pour accéder au Jenkins de l'usine, il faut donc établir
4035
un tunnel SSH avec forward de port, entre votre machine et le serveur de la stack :
4136

42-
4337
```
4438
ssh $FACTORY_IP -l cloud -i $YOU_KEYPAIR_PATH -L 8080:localhost:8080
4539
```
4640

47-
Pour finaliser l'installation, une opération manuelle est nécessaire. Il faut que votre usine d'assemblage d'image puisse
48-
interagir avec les API Openstack. Vous devez aller manuellement modifier le fichier ```/var/lib/jenkins/.profile```
49-
pour y insérer vos credentials Openstack.
41+
Vous devriez pouvoir accéder au Jenkins de l'usine en cliquant [ici](http://localhost:8080)
42+
43+
Pour finaliser l'installation, une opération manuelle est nécessaire. Vous devez aller manuellement chercher le contenu du fichier ```/var/lib/jenkins/secrets/initialAdminPassword``` via la connexion SSH lors de la première initialisation.
5044

5145
```
52-
# Fill these values to enable full throttle mode.
53-
export OS_USERNAME=""
54-
export OS_TENANT_NAME=""
55-
export OS_TENANT_ID=""
56-
export OS_PASSWORD=""
46+
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
5747
```
5848

59-
Puis, lancer ```sudo service jenkins restart```, de façon à ce que Jenkins prenne ces valeurs en compte. Si votre tunnel
60-
avec forward est toujours en place, vous devriez pouvoir accéder au Jenkins de l'usine en cliquant [ici](http://localhost:8080).
61-
62-
49+
Installer les plugins suggéré
50+
51+
![plugins](statics/plugins.png)
52+
53+
Entrez à présent vos informations qui serviront à sécuriser votre jenkins. Pour rappel celui-ci a connaissance de vos indentifiants Cloudwatt et est donc capable de piloter votre tenant.
54+
![info](statics/infos.png)
55+
56+
Jenkins est à présent initialisé.
57+
58+
Avant tout commençons par découvrir la chaine d'assemblage afin de maitriser le processus de bout en bout.
59+
6360
## La chaîne d'assemblage
64-
61+
62+
Sur le github de [Cloudwatt](https://github.com/cloudwatt/os_image_factory) vous trouverez l'ensemble de nos scripts.
6563
Dans le répertoire ```images/``` vous trouverez 4 fichiers, génériques pour toutes les images à assembler :
66-
67-
* ```ansible_local_inventory``` : fichier de définition de groupe Ansible, injecté par Packer dans les images à
68-
provisionner, pour permettre à Ansible de cibler le serveur.
69-
* ```build.packer.json``` : fichier de build Packer. Il prend des paramètres qui lui seront fournis par le playbook
70-
de pilotage de build.
71-
* ```build.playbook.yml``` : playbook Ansible de pilotage de build.
72-
* ```build.sh``` : Micro script shell pour faciliter l'utilisation du playbook de build
73-
74-
Les répertoires placés sous le répertoire ```images/``` sont des exemples de build. Pour écrire les vôtres, il
75-
vous suffit de respecter la norme suivante :
76-
77-
```
78-
images/
79-
my_bundle/ # <-- répertoire du build
80-
ansible/
81-
bootstrap.yml # <-- playbook de provisionning du serveur
82-
output/
83-
my_stack_heat.yml.j2 # <-- template à générer à la fin du build, couramment une stack HEAT
84-
build-vars.yml # <-- variables de description du build, exploité par Packer et le playbook de pilotage
85-
```
86-
64+
65+
* ```ansible_local_inventory``` : fichier de définition de groupe Ansible, injecté par Packer dans les images à
66+
provisionner, pour permettre à Ansible de cibler le serveur.
67+
* ```build.packer.json``` : fichier de build Packer. Il prend des paramètres qui lui seront fournis par le playbook
68+
de pilotage de build.
69+
* ```build.playbook.yml``` : playbook Ansible de pilotage de build.
70+
* ```build.sh``` : Micro script shell pour faciliter l'utilisation du playbook de build
71+
72+
Les répertoires placés sous ```images/``` sont des exemples de build. Pour écrire les vôtres, il vous suffit de respecter la norme suivante :
73+
74+
```
75+
images/
76+
my_bundle/ # <-- répertoire du build
77+
ansible/
78+
bootstrap.yml # <-- playbook de provisionning du serveur
79+
output/
80+
my_stack_heat.yml.j2 # <-- template à générer à la fin du build, couramment une stack HEAT
81+
build-vars.yml # <-- variables de description du build, exploité par Packer et le playbook de pilotage
82+
```
83+
8784
Les templates que vous placez dans le répertoire output de votre bundle seront interprétés par le playbook de pilotage
8885
de build. Nous l'utilisons pour générer des stacks HEAT en insérant au bon endroit l'ID de l'image serveur créée en cours de build :
89-
90-
```
91-
server:
92-
type: OS::Nova::Server
93-
properties:
94-
key_name: { get_param: keypair_name }
95-
image: {{ result_img_id }} <-- result_img_id entre moustache sera remplacé
96-
flavor: { get_param: flavor_name } par l'id de la nouvelle image serveur
97-
networks:
98-
```
99-
86+
87+
```
88+
server:
89+
type: OS::Nova::Server
90+
properties:
91+
key_name: { get_param: keypair_name }
92+
image: {{ result_img_id }} <-- result_img_id entre moustache sera remplacé
93+
flavor: { get_param: flavor_name } par l'id de la nouvelle image serveur
94+
networks:
95+
```
96+
10097
Le fichier ```build-vars.yml``` contient les variables fournies au playbook de pilotage de build. Dans sa
10198
plus simple expression, voici un exemple :
102-
99+
103100
```
104-
---
105-
bundle:
106-
name: bundle-trusty-lamp # <-- le nom de votre image
107-
img_base: ae3082cb-fac1-46b1-97aa-507aaa8f184f # <-- l'id glance de l'image de base à utiliser
108-
properties: # <-- les propriétés que vous souhaitez voir
109-
img_os: Ubuntu # appliquées sur l'image finale provisionnée
110-
cw_bundle: LAMP
111-
cw_origin: Cloudwatt
101+
bundle:
102+
name: bundle-trusty-lamp # <-- le nom de votre image
103+
img_base: ae3082cb-fac1-46b1-97aa-507aaa8f184f # <-- l'id glance de l'image de base à utiliser
104+
properties: # <-- les propriétés que vous souhaitez voir
105+
img_os: Ubuntu # appliquées sur l'image finale provisionnée
106+
cw_bundle: LAMP
107+
cw_origin: Cloudwatt
108+
hw_cpu_max_sockets: 1
109+
hw_rng_model :virtio
110+
111+
```
112+
113+
Maintenant que vous avez connaissance de l'ensemble des la chaine de montage d'un image, vous pouvez vous lancer dans la construction de votre propre image bundle.
114+
115+
## Fabrication image Bundle
116+
**1.** Assurez-vous d'avoir fait un copie du dếpot **os_image_factory** vers un dépôt Git distant; Github, Bitbucket, tout ce que vous utilisez.
117+
118+
**2.** Cliquez sur **"Créer un nouveau job"**
119+
120+
![start](statics/start.png)
121+
122+
**3.** Choisissez de faire un projet de type **free-style**
123+
124+
![name](statics/name.png)
125+
126+
**4.** Donnez maintenant un nom à votre projet, puis spécifiez le repos github à cloner pour lancer le build de votre image.
127+
128+
![config](statics/conf.png)
129+
130+
**5.** Configurez maintenant la commande à exécuter pour lancer votre build, si vous avez cloner notre repos [OS_image_factory](https://github.com/cloudwatt/os_image_factory.git)
131+
132+
**6.** En fin de page, choisissez **Exécuter un script shell** sous **Build**, puis saisissez les éléments suivants (remplacez `$ BUNDLE_DIR_NAME`):
133+
112134
```
113-
114-
115-
Une fois ceci fait, vous pouvez démarrer un build en lançant la commande suivante :
116-
135+
make build-images bundle=$YOUR_BUNDLE_DIR_NAME
136+
```
137+
```$YOUR_BUNDLE_NAME``` doit correspondre au nom du répertoire sous ```images/``` dans lequel vous avez créé votre
138+
bundle.
139+
![build](statics/build.png)
140+
141+
**7.** Sélectionnez **Archiver les artefacts** sous **Ajouter une action post-build** et saisir ```packer.latest.log, images/target/$BUNDLE_DIR_NAME/output/*``` . Cela n'est pas obligatoire, mais ca vous empêchera d'avoir des problèmes à générer le template HEAT ou les logs du playbook. En outre, les outputs sont enregistrés à chaque lancement de projet, ce qui signifie que vous pourrez retrouver les logs de vos anciennes actions.
142+
143+
**8.** Lancez maintenant votre projet
144+
145+
## Fabrication d'image OS
146+
147+
La factory nous sert aussi à fabriquer nos propres images d'OS que l'on propose aux clients de cloudwatt.
148+
Vous trouverez l'ensemble des scripts de création dans le répertoire **OS** sur le repo github [OS_image_factory](https://github.com/cloudwatt/os_image_factory.git)
149+
150+
La démarche pour fabriquer une image OS et image image bundle est là même, c'est juste la commande à lancer qui est un peu différente car effectivement il faut télécharger l'image au format QCOW2 et l'uploader dans votre glance avant de lancer le build.
151+
Voici comment faire, vous pouvez démarrer un build en lançant la commande suivante :
152+
117153
```
118-
images/build.sh $YOUR_BUNDLE_NAME
154+
make build-os os=$OS_DIR_NAME
119155
```
120156

121-
```$YOUR_BUNDLE_NAME``` doit correspondre au nom du répertoire sous ```images/``` dans lequel vous avez créé votre
122-
bundle.
157+
158+
Si vous avez regardé le script ```build.sh``` qui se trouve dans chaque répertoire des OS, vous avez pu remarqué qu'une suite de test unitaire était lancé afin de tester l'image dans notre environnement Openstack.
159+
Celle ci est ecrite en Python et vous retrouverez l'ensemble des scripts dans le répertoire **test-tools/pytesting_os**.
160+
Pour information rien ne vous empeche d'ajouter vos propres tests ou de modifier les notres si besoin.
161+
123162

124163
## L'entrepôt
125164

@@ -129,7 +168,7 @@ Lors d'un build, deux outputs sont attendus :
129168
assemblée est visible dans les traces d'exécution du script ```build.sh```.
130169

131170
* Les sorties des templates placés dans votre répertoire output : Une fois interprétés, ils sont placés dans le
132-
répertoire ```images/target/my_bundle/output```.
171+
répertoire **images/target/my_bundle/output**.
133172

134173
## Voici les clés
135174

@@ -139,4 +178,5 @@ le ```build.packer.json``` pour utiliser plutôt Puppet ou Chef.
139178

140179
Nous espérons que cela pourra vous servir pour bâtir vos propres architectures dans le futur.
141180

142-
Have fun. Hack in peace.
181+
-------
182+
Have fun. Hack in peace.

0 commit comments

Comments
 (0)