Parallélisation de tâches sur de multiples serveurs avec Ansible

De Linux Server Wiki
Sauter à la navigation Sauter à la recherche


Déjà eu besoin d’exécuter la même action sur plusieurs serveur ? Vous venez de voir qu'une grosse faille de sécurité a été corrigé dans apache et vous réalisez que vous devez mettre à jour votre parc de 200 machines ? Et en plus de ça vous êtes flemmard et vous n'avez pas envie de monter une infrastructure client-serveur pour maintenir les machies à jour ? Ansible est fait pour vous. Ansible utilise ssh pour communiquer avec les serveurs et ne nécessite l'installation d'aucun autre paquet pour fonctionner.

Sur votre machine locale :

aptitude install ansible

Sur les serveurs ? Vous n'avez besoin de rien de plus que les paquets minimaux de python 2.x.

aptitude install python

1 configuration

Le fichier principal d'ansible est le fichier d'inventaire dans lequel vous listez les différentes machines à gérer avec ansible. Par défaut, ce fichier est /etc/ansible/hosts. Vous pouvez cependant utiliser n'importe quel fichier et le préciser lors de l'invocation de ansible.

Exemple de fichier dans ~/hosts :

[node1]
vm1.domain.tld
vm2.domain.tld

[node2]
vm3.domain.tld
vm4.domain.tld

2 invocation

ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" all

Avec cette commande, on applique une directive ansible à toutes les machines (all) contenues dans le fichier ~/hosts. La directive appel le module ansible file afin de créer (state=touch) le fichier /tmp/test

Pour appliquer la directive uniquement aux VMs de node1 :

ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" node1

Pour appliquer la directive uniquement a VM1 :

ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" vm1.domain.tld

Si nous voulons supprimer ce fichier :

ansible -i ~/hosts -m file -a "path=/tmp/test state=absent" all

3 Vérifier si tous les outils nécessaire à ansible sont bien installés (ansible_facts checking)

ansible -i ~/hosts --user=root -m setup vm1.domain.tld

4 playbook

4.1 Playbook de mise à jour de serveur avec aptitude

Ce playbook nécessite la présence des paquets suivant sur les serveurs cibles :

debian-goodies lsb-release

Il vous permet de mettre à jour très facilement vos serveurs. Le fichier d'origine, quelque peu modifié, est accessible ici : https://gist.github.com/maethor/380676f6b1cec8cc7439#file-debian_upgrade-yml

debian_upgrade.yml :

---

- hosts: all
  remote_user: root
  tasks:
    - name: Update packages list
      apt: update_cache=yes
      when: ansible_os_family == 'Debian'

    - name: List packages to upgrade (1/2)
      shell: aptitude -q -F%p --disable-columns search "~U"
      register: updates
      changed_when: False
      when: ansible_os_family == 'Debian'

    - name: List packages to upgrade (2/2)
      debug: msg="{{ updates.stdout_lines | count }} packages to upgrade ({{ updates.stdout_lines | join(', ') }})"
      when: (ansible_os_family == 'Debian' and updates.stdout_lines)

    - name: Upgrade packages
      apt: upgrade=safe
      when: (ansible_os_family == 'Debian' and updates.stdout_lines)

    - name: Check what the new version is
      shell:  lsb_release -r | awk '{print $2}'
      changed_when: False
      register: new_release

    - name: Notify distribution version upgrade
      debug: msg="Debian has been upgraded from {{ ansible_lsb.release }} to {{ new_release.stdout }}"
      when: ansible_lsb.release != new_release.stdout

    - name: List services to restart (1/2)
      shell: checkrestart | grep ^service | awk '{print $2}'
      register: services
      changed_when: False
      when: ansible_os_family == 'Debian'

    - name: List services to restart (2/2)
      debug: msg="{{ services.stdout_lines | count }} services to restart ({{ services.stdout_lines | join (', ') }})"
      when: (ansible_os_family == 'Debian' and services.stdout_lines)

Invocation :

ansible-playbook -i ~/hosts debian_upgrade.yml --limit=node1