orchestration lab 2 - ansible
Après avoir fait un petit tour avec terraform afin de construire une VM sur amazon EC2, je vous propose de la configurer à la suite avec ansible. Ceci sera donc une brique vous permettant d’industrialiser la création de plusieurs VM si besoin et de préparer leur usage futur. Ici, on va préparer un prochain labo docker, puisque celui-ci m’a été demandé chaleureusement par Stefano.
On reprend la base du précédent labo (gestion de VM sur aws avec terraform), on y ajoute :
- de quoi récupérer proprement l’adresse IP de notre VM construite sur aws EC2
- la création d’un fichier host pour ansible
- l’execution d’ansible sur notre VM fraîchement créée afin de la mettre à jour et d’installer quelques briques pour docker (le daemon, docker-compose) ainsi que quelques images pour tester le bon fonctionnement de l’ensemble
Vous trouverez les fichiers sur mon github si vous voulez tester en même temps, il faudra utiliser les fichiers dans le répertoire lab2-ansible
.
Je vous propose d’utiliser un fichier Makefile (on ne se refait pas) pour travailler dans ce lab, si vous ne connaissez pas cet outil, le contenu est assez simple à lire, je vous présente les commandes ci-après si vous souhaitez le faire d’une autre façon.
Ce lab vous sera facturé par aws environ 2 centimes.
Si vous êtes préssés et pour executer l’ensemble du lab après avoir modifié les fichiers de clés :
1make lab02
L’execution de l’ensemble (création avec terraform + préparation avec ansible) prend environ 2 minutes.
terraform et adresse IP
L’objet ici est de récupérer des paramètres sur notre serveur construit, bien sûr comme tout est orchestré, pas moyen de prévoir à l’avance ce que va nous octroyer aws. Ici on va simplement récupérer l’adresse IP du serveur, paramètre indispensable au paramétrage via ansible ensuite.
terraform nous propose d’extraire ces variables via le bloc output
, il suffit de définir le nom de la variable et comment la récupérer, on ajoute à notre fichier terraform la section suivante pour collecter l’adress IP du serveur nommé test-srv-01
:
1output "srv01-ip" {
2 value = "${aws_instance.test-srv-01.public_ip}"
3}
On pourra obtenir la valeur avec la commande :
1terraform output srv01-ip
Construire l’instance EC2
Sur la base du fichier aws.tf
, nous allons construire notre VM ; les fichiers aws-keys.tf
et ssh-keys.tf
doivent être modifiés pour refléter votre configuration.
Pour mémoire, les phases terraform à enchaîner pour la construction sont :
- préparation :
terraform plan
- execution :
terraform apply
- statut :
terraform refresh
etterraform show
- destruction :
terraform destroy
Avec le Makefile, utilisez pour cette partie :
1make clean
2make plan
3make apply
Pour l’instant, nous ne sommes pas allés plus loin que lors de notre dernier labo, mais vous remarquerez dans la sortie de l’apply que nous récupérons bien l’adresse ip de notre serveur. Vous devez avoir quelque chose équivalent à :
1Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
2
3Outputs:
4
5srv01-ip = 52.214.2.104
Ansible
Ansible est un outil de paramétrage assez sympa qui permet de façon simple d’exectuer des commandes normées sur différents serveurs, quel que soit le système d’exploitation utilisé sur ces derniers. Ici nous avons besoin de piloter un linux, mais ansible sait s’adapter entre les différentes variantes et même piloter du Windows si besoin. Un des intérêt principal est de pouvoir executer des commandes similaires sur un grand nombre de serveurs, ce qui simplifie grandement les tâches d’administration, d’installation, du supervision…
Le langage de paramétrage est assez simple, les actions s’enchaînent et sont décrites avec des modules, lorsqu’aucun n’est disponible pour ce que l’on souhaite effectuer, il est possible de lancer directement des commandes.
Le playbook proposé ici est assez simple, il met à jour le système puis installe quelques composants pour docker. Les grandes lignes sont :
pour l’entête :
- on utilise la section
aws
du fichier des hosts - on execute des commandes en utilisant sudo et l’utilisateur
root
- l’utilisateur de connexion est
ec2-user
1- name: lab02
2 hosts: aws
3 become: true
4 become_user: root
5 remote_user: ec2-user
pour les tâches :
- upgrade de tous les packages avec yum
- installation du package docker proposé par aws
- configuration du service docker pour un démarrage au boot de notre serveur
- récupération de l’image docker
hello-world
+ d’autres dans le fichier complet - ajout de la permission d’utiliser docker pour l’utilisateur
ec2-user
1 tasks:
2 - name: upgrade all packages
3 yum:
4 name: '*'
5 state: latest
6
7 - name: install docker
8 yum:
9 name: docker
10 state: latest
11
12 - name: start docker daemon
13 service:
14 name: docker
15 state: started
16 enabled: yes
17
18 - name: get docker hello-world image
19 command: docker pull hello-world
20
21 - name: own permission for docker to ec2 user
22 user:
23 name: ec2-user
24 groups: docker
Lien entre adresse IP et ansible
Pour que ceci fonctionne, il faut mettre dans le fichier des hosts utilisé par ansible de l’adresse que nous avons pris soin d’extraire de notre serveur dans terraform. Ceci est pris en charge par le petit script lab02.sh, vous pourrez faire autrement dans la vraie vie :
1srv01_ip=$(terraform output srv01-ip)
2cat > ansible/files/hosts <<EOF
3[aws]
4$srv01_ip
5EOF
Vous remarquerez que nous ajoutons l’adresse dans la section aws
Préparation de notre serveur
Il nous suffit d’enchaîner toutes ces actions suite à la construction du serveur, pour cela :
1make prepare
ou
1bash lab02.sh
L’execution d’ansible ici nécessite le positionnement de la variable d’environnement permettant de ne pas tenir compte de la signature ssh de notre serveur : ANSIBLE_HOST_KEY_CHECKING=False
. En effet, puisqu’il vient d’être crée, votre client ssh n’a pas encore celle-ci dans son fichier known_hosts
.
Tester le bon fonctionnement
Se connecter sur le serveur avec ssh puis tester le bon fonctionnement du hello-world de docker :
1ssh ec2-user@`terraform output srv01-ip`
2docker version
3docker run --rm hello-world
4exit
Et voilà…
Pensez bien à arrêter votre serveur avec terraform destroy
.
Photo from Larisa Birta