Parallélisation de tâches sur de multiples serveurs avec Ansible
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