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
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