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

De Linux Server Wiki
Aller à la navigation Aller à 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

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

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

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

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

playbook

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