Le blog de Genma
Vous êtes ici : Accueil » Informatique & Internet » GNU/Linux, Logiciels Libres » Jouons avec Ansible et Virtualbox

Jouons avec Ansible et Virtualbox

D 11 septembre 2017     H 09:00     A Genma     C 3 messages   Logo Tipee

TAGS : Ansible Virtualisation

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.

3 Messages

  • Je gère environ 150 serveurs linux avec Ansible. Pour rien au monde, je le supprimerai !

    Tu peux aussi utiliser Vagrant pour créer de bout en bout ta VM, puis lancer tes configurations. Deployer des applications, c’est aussi facile.
    Bref de multiples possibilités : L’effort fait pour un serveur, est le même pour 1000


  • mais j’ai des soucis de VM.
    Je n’arrive pas à avoir les deux cartes réseaux (NAT et réseau privé hôte) actives simultanément.
    J’ai configuré la VM Débian avec interface graphique. Après lancement, j’ai une carte réseau fonctionnelle, si je connecte l’autre cela déconnecte la première et vice versa.
    Quand une carte est active, elle est fonctionnelle (i.e. accès internent OK dans le cas du NAT, ping à partir de l’hôte OK dans le cas du réseau privé hôte).
    Après recherche, j’ai essayé de paramétrer la carte réseau hôte dans /etc/network/interfaces de la VM, sans plus de succès.
    Pour info, la machine hôte est un portable en Linux Mint avec accès Net via Freebox par Wifi.
    Une idée ??
    En tout cas, l’article est claire et didactique, merci pour avoir pris le temps de l’écrire et de la partager


  • Pour faire suite à mon message précédent et ma difficulté à avoir les deux cartes réseau actives et fonctionnelles, voici les étapes :

    1 - Ajouter dans les paramètres de Virtualbox un réseau privé hôte avec activation du DHCP (Fichier-> Paramètres -> Réseau -> Réseau hôte uniquement)

    2 - Configurer le réseau de la VM avec deux cartes (Carte 1 : NAT, Carte 2 : Réseau privé hôte avec pour nom le réseau défini en 1)

    3 - Sur la VM Debian installée avec interface graphique :
    3.1 - Ajouter deux profils réseau (icône réseau -> une des deux cartes -> paramètres filaires -> ajout profil)
    3.2 - Associer une carte à un des profils créé et l’autre à l’autre
    3.3 - Supprimer le profil initial (wired connection 1)

    4 - Valider la configuration (la machine hôte peut pinguer la VM et inversement ; la VM peut pinguer Google par ex.)

    Finalement, ça parait logique d’avoir deux profils réseau pour avoir deux cartes.
    Par contre, je ne peux pas expliquer pourquoi ça ne marche pas dans les deux sens d’association si on garde le profil présent initialement.

    Enfin, si on veut faire une installation purement serveur (ie sans interface graphique) et passer par la ligne de commande, il faut peut-être chercher du côté de nmcli.
    En effet, la commande nmcli seule (sans paramètre) permet de bien voir les deux cartes et leur association avec les deux profils.
    Après, je n’ai pas cherché plus loin pour définir des profils et les associés aux cartes en ligne de commande.

    Si jamais ça peut aider quelqu’un, ce sera ma petite participation.

    Merci encore pour l’article