Jouons avec Ansible et Virtualbox

, par  Genma , popularité : 2%

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.