« Parallélisation de tâches sur de multiples serveurs avec Ansible » : différence entre les versions

Aller à la navigation Aller à la recherche
(Page créée avec « Category:serveur Category:debian »)
 
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Category:serveur]]
[[Category:serveur]]
[[Category:debian]]
[[Category:debian]]
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 :
<pre>aptitude install ansible</pre>
Sur les serveurs ? Vous n'avez besoin de rien de plus que les paquets minimaux de python 2.x.
<pre>aptitude install python</pre>
=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 <code>/etc/ansible/hosts</code>. Vous pouvez cependant utiliser n'importe quel fichier et le préciser lors de l'invocation de ansible.
Exemple de fichier dans ~/hosts :
<pre>
[node1]
vm1.domain.tld
vm2.domain.tld
[node2]
vm3.domain.tld
vm4.domain.tld
</pre>
=invocation=
<pre>ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" all</pre>
Avec cette commande, on applique une directive ansible à toutes les machines (<code>all</code>) contenues dans le fichier <code>~/hosts</code>. La directive appel le module ansible <code>file</code> afin de créer (<code>state=touch</code>) le fichier <code>/tmp/test</code>
Pour appliquer la directive uniquement aux VMs de node1 :
<pre>ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" node1</pre>
Pour appliquer la directive uniquement a VM1 :
<pre>ansible -i ~/hosts -m file -a "path=/tmp/test state=touch" vm1.domain.tld</pre>
Si nous voulons supprimer ce fichier :
<pre>ansible -i ~/hosts -m file -a "path=/tmp/test state=absent" all</pre>
=Vérifier si tous les outils nécessaire à ansible sont bien installés (ansible_facts checking)=
<pre>ansible -i ~/hosts --user=root -m setup vm1.domain.tld</pre>
=playbook=
==Playbook de mise à jour de serveur avec aptitude==
Ce playbook nécessite la présence des paquets suivant sur les serveurs cibles :
<pre>debian-goodies lsb-release</pre>
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 :
<pre>
---
- 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)
</pre>
Invocation :
<pre>ansible-playbook -i ~/hosts debian_upgrade.yml --limit=node1</pre>
4 231

modifications

Menu de navigation