Jouons avec Ansible et Virtualbox
Prérequis : ce billet nécessite de connaître Virtualbox, savoir installer et connaître les commandes de base de Debian et avoir des bases en Ansible.
Virtualbox
Virtualbox est là pour me permettre d’avoir différentes machines Debian. J’en ai créer une par défaut, avec une installation minimale de Debian, j’ai ajouté SSH et y ai ajouté ma clef SSH de mon utilisateur de ma machine hôte.
J’ai deux machines virtuelles,
– debianAnsible01
– debianAnsible02
Chacune de ces machines a deux cartes réseaux :
– une carte eth0 en mode NAT : l’accès Internet de la machine hôte est alors partagé, je peux faire des mises à jour etc. La machine virtuelle voit Internet mais n’est pas vu du réseau local (elle est derrière un NAT qui est géré par VirtualBox). Retour ligne manuel
– une carte eth1 en mode Réseau Privé hôte sur vbonet0 : la machine est visible et voit la machine hôte et réciproquement. Cette interface réseau me sert pour me connecter en SSH depuis ma machine hôte sur la machine virtuelle.
Les IP des machines sur l’interface eth1 (qui sera utilisée par Ansible) sont donc :
– 192.168.56.102 Debian_Ansible01
– 192.168.56.103 Debian_Ansible02
On liste les machines de VirtualBox
$ VBoxManage list vms |grep Debian
"Debian_Ansible01" {f7e91481-b0db-4583-a2de-c3d04e81e4e3}
"Debian_Ansible02" {e0449d42-682f-41d0-be73-1816c0b8f334}
Ansible
Pour avoir une présentation détaillée et comprendre Ansible, je vous invite à lire le journal de Skhaen sur LinuxFr : Journal Déploiement et automatisation avec Ansible - partie 1
Je pars de l’étape où Ansible est installé sur ma machine hôte (qui fait tourner VirtualBox).
J’ai créé un fichier /etc/ansible/hosts
[virtualboxDebian]
Debian_Ansible01
Debian_Ansible02
Et dans mon fichier /etc/hosts j’ai les lignes
192.168.56.102 Debian_Ansible01
192.168.56.103 Debian_Ansible02
Jouons un peu
Démarrage des machines depuis la ligne de commande
VBoxManage startvm Debian_Ansible01
VBoxManage startvm Debian_Ansible02
Ping des différentes machines
$ ansible -m ping all --one-line
Debian_Ansible01 | SUCCESS => {"changed": false, "ping": "pong"}
Debian_Ansible02 | SUCCESS => {"changed": false, "ping": "pong"}
Pour avoir l’uptime des machines
$ ansible all -m command -u genma --args "uptime" --one-line
Debian_Ansible01 | SUCCESS | rc=0 | (stdout) 10:50:16 up 29 min, 1 users, load average: 0,00, 0,01, 0,03
Debian_Ansible02 | SUCCESS | rc=0 | (stdout) 10:50:16 up 25 min, 1 users, load average: 0,00, 0,01, 0,05
Remarque : l’option —one-line permet d’avoir le retour json sur une seule ligne et non sur plusieurs.
Ajout des paquets aux VM
Pour avoir des paquets d’installer sur tout les serveurs, Ansible me permet de l’automatiser facilement.
On commence par éditer un fichier /etc/ansible/roles/debian_complete_installation.yml pour y mettre le bloc suivant :
---
- hosts: all
remote_user: root
tasks:
- name: install common packages for all servers
apt:
update_cache=yes
state=latest
name={{item}}
with_items:
- curl
- htop
- sudo
- tar
- unzip
- vim
- wget
- whois
- screen
Après l’avoir enregistré, il suffit de lancer la commande suivante pour installer cette liste de paquets sur tout les serveurs :
ansible-playbook -i hosts /etc/ansible/roles/debian_complete_installation.yml
Mises à jour des VM via Ansible
Pour mettre à jour les VM via Ansible, on créer un fichier de template
/etc/ansible/roles/genma_apt_update.yml
---
- hosts: all
remote_user: root
tasks:
- name: update and upgrade apt packages
apt:
update_cache=yes
state=latest
upgrade=yes
Mise à jour des VM via Ansible
Après l’avoir enregistré, il suffira de lancer la commande suivante pour installer cette liste de paquets sur tout les serveurs :
ansible-playbook -i hosts /etc/ansible/roles/genma_apt_update.yml
Rappel : mon ficher hosts ne contient que mes machines Ansible pour l’instant.
Si on se connecte dans la VM, on voit bien que le apt-get update et upgrade a été lancé (on a les processus correspondant qui tournent).
Ansible renvoit sur la ligne de commande :
ansible-playbook -i hosts /etc/ansible/roles/genma_apt_update.yml
PLAY [all] *********************************************************
TASK [Gathering Facts] *********************************************
ok: [Debian_Ansible01]
ok: [Debian_Ansible02]
TASK [update and upgrade apt packages] ******************************
changed: [Debian_Ansible01]
changed: [Debian_Ansible02]
PLAY RECAP **********************************************************
Debian_Ansible01 : ok=2 changed=1 unreachable=0 failed=0
Debian_Ansible02 : ok=2 changed=1 unreachable=0 failed=0
Ansible et plusieurs groupes dans le hosts
Si mon fichier /etc/ansible/hosts contient plusieurs groupes et que je ne veux lancer un playbook que sur un groupe dédié, l’option est de la forme
--extra-vars="hosts=virtualboxDebian"
La commande pour lancer les mises à jour sera donc
ansible-playbook -i hosts /etc/ansible/roles/genma_apt_update.yml --extra-vars="hosts=virtualboxDebian"
Eteindre les machines
Pour éteindre les machines, là encore, on passe par un playbook Ansible
/etc/ansible/roles/genma_shutdown.yml
---
- hosts: all
remote_user: root
tasks:
- name: shutdown
command: /sbin/shutdown -h now
- name: wait go down
local_action: wait_for host={{ ansible_ssh_host }} port=22 state=stopped
Et quand on le lance :
ansible-playbook -i hosts /etc/ansible/roles/genma_shutdown.yml
PLAY [all] *********************************************************
TASK [Gathering Facts] *********************************************************
ok: [Debian_Ansible02]
ok: [Debian_Ansible01]
TASK [shutdown] *********************************************************
Sauvegarde de l’état des machines via un Snapshot Virtualbox
Prise de snapshot
VBoxManage snapshot Debian_Ansible01 take snapshot_VM_MAJ_par_Ansibe_OK
VBoxManage snapshot Debian_Ansible02 take snapshot_VM_MAJ_par_Ansibe_OK
Conclusion
Un premier tutoriel assez simple qui montre, je l’espère les possibilités d’Ansible, que personnellement je serai amené à utiliser de plus en plus régulièrement. D’autres tutoriaux seront donc amenés à être publier au fur et à mesure de mon apprentissage.