orchestration lab #2 - ansible

DIY
durée du labo : 14 min
  1. 1. terraform et adresse IP
  2. 2. Construire l’instance EC2
  3. 3. Ansible
    1. 3.1. Lien entre adresse IP et ansible
  4. 4. Préparation de notre serveur
  5. 5. Tester le bon fonctionnement
  6. 6. à voir aussi

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 (cf 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 :

1
make 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 :

1
2
3
output "srv01-ip" {
value = "${aws_instance.test-srv-01.public_ip}"
}

On pourra obtenir la valeur avec la commande :

1
terraform 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 et terraform show
  • destruction : terraform destroy

Avec le Makefile, utilisez pour cette partie :

1
2
3
make clean
make plan
make 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 à :

1
2
3
4
5
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
srv01-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
2
3
4
5
- name: lab02
hosts: aws
become: true
become_user: root
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
tasks:
- name: upgrade all packages
yum:
name: '*'
state: latest
- name: install docker
yum:
name: docker
state: latest
- name: start docker daemon
service:
name: docker
state: started
enabled: yes
- name: get docker hello-world image
command: docker pull hello-world
- name: own permission for docker to ec2 user
user:
name: ec2-user
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 :

1
2
3
4
5
srv01_ip=$(terraform output srv01-ip)
cat > ansible/files/hosts <<EOF
[aws]
$srv01_ip
EOF

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 :

1
make prepare

ou

1
bash 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 :

1
2
3
4
ssh ec2-user@`terraform output srv01-ip`
docker version
docker run --rm hello-world
exit

Et voilà…

Pensez bien à arrêter votre serveur avec terraform destroy.

Photo Larisa Birta

Alexandre Chauvin Hameau

2017-11-27T16:00:26