Bonjour à tous,

Aujourd’hui on va voir comment gérer les mises à jour de BSD / Linux / Windows avec Ansible.

 

Ansible est bien connu pour le déploiement de masse. Ce que l’on oublie souvent de dire en revanche c’est que Ansible est utile sur n’importe quelle infrastructure du moment que vous avez plusieurs serveurs (même si il n’y en a que 2-3).

 

Et même si vous n’avez que des Windows ça reste utile, vous faite un petit Debian sous Hyper-V / virtualbox ou budgétez un Raspberry Pi 0 à 20€ avec les accessoires et vous aurez quelque chose qui vous permet de gagner beaucoup de temps. Pour les windowsiens qui débarquent, je vous conseille quand même de jeter un œil à tous les articles que j’ai fait sur Ansible pour mieux comprendre la bête.

 

Les playbooks :

Comme d’hab, j’ai tout mis sur Github pour préserver l’indentation, le YAML étant toujours aussi strict 🙂

 

Mettre à jour FreeBSD avec Ansible :

Dans le fichier hosts, on définit le groupe de serveurs FreeBSD comme ceci, on indique également le chemin de l’exécutable de Python :

[freebsd]
IP ansible_connection=ssh ansible_user=ansible

[freebsd:vars]
ansible_python_interpreter="/usr/local/bin/python"

 

Ensuite, on créer un playbook qui fera la mise à jour par pkg.

Je ne suis pas totalement satisfait du truc, le module pkg de Ansible dispose de bien moins d’options que les modules apt ou yum par exemple.

- hosts: freebsd
  become: yes
  become_method: sudo
  tasks:
   - name: upgrade all servers
     pkgng: name=* state=present

   - name: Check if a reboot is required
     register: reboot
     stat: path=/var/run/reboot-required get_md5=no

   - name: Check if kexec is used
     register: kexec
     stat: path=/usr/bin/kexec-reboot get_md5=no

   - name: Reboot the server using reboot
     command: /sbin/reboot
     when: reboot.stat.exists == true and kexec.stat.exists == false

   - name: Reboot the server using kexec
     shell: kexec-reboot -lr
     when: reboot.stat.exists == true and kexec.stat.exists == true

 

 

Mettre à jour CentOs / Rhel avec Ansible :

Maintenant, le playbook pour mettre à jour tout ce qui utilise YUM :

- hosts: centos
  become: yes
  become_method: sudo
  tasks:
   - name: upgrade all servers
     yum: name=* state=latest update_cache=yes

   - name: Check if a reboot is required
     register: reboot
     stat: path=/var/run/reboot-required get_md5=no

   - name: Check if kexec is used
     register: kexec
     stat: path=/usr/bin/kexec-reboot get_md5=no

   - name: Reboot the server using reboot
     command: /sbin/reboot
     when: reboot.stat.exists == true and kexec.stat.exists == false

   - name: Reboot the server using kexec
     shell: kexec-reboot -lr
     when: reboot.stat.exists == true and kexec.stat.exists == true

 

Mettre à jour Debian / Ubuntu avec Ansible :

Maintenant, le playbook pour mettre à jour tout ce qui utilise APT.

Il est bien plus complet et prends en charge needrestart.

- hosts: debian
  become: yes
  become_method: sudo
  tasks:
   - name: updates servers
     apt: update_cache=yes

   - name: upgrade servers
     apt: upgrade=dist dpkg_options='force-confold,force-confdef'

   - name: Check if a reboot is required
     register: reboot
     stat: path=/var/run/reboot-required get_md5=no

   - name: Check if kexec is used
     register: kexec
     stat: path=/usr/bin/kexec-reboot get_md5=no

   - name: Reboot the services
     shell: needrestart -ra -l
     when: reboot.stat.exists == false

   - name: Reboot the server using reboot
     command: /sbin/reboot
     when: reboot.stat.exists == true and kexec.stat.exists == false

   - name: Reboot the server using kexec
     shell: kexec-reboot -lr
     when: reboot.stat.exists == true and kexec.stat.exists == true

 

Un point sur les playbooks FreeBSD / Linux :

Comme vous l’aurez vu, tous les playbooks supportent le redémarrage par Kexec si disponible et Debian oblique l’installation de needrestart.

 

Mettre à jour Windows Serveur avec Ansible :

Créez un playbook pour rechercher et ensuite installer les mises à jour :

- hosts: windows
  tasks:
   - name: Search updates
     win_updates: category_names={{ item }} state=searched log_path=c:/ansible_wu.txt
     with_items:
       - SecurityUpdates
       - CriticalUpdates
       - UpdateRollups

   - name: Install updates
     win_updates:
       category_names: ['SecurityUpdates','CriticalUpdates','UpdateRollups']
     register: update_result

   - name: reboot if required
     win_reboot:
       shutdown_timeout_sec: 1200
       reboot_timeout_sec: 1200
     when: update_result.reboot_required

 

Mise à jour d’une infrastructure complète :

Créez simplement un playbook qui appelle les autres, ça évite d’en lancer 4 :

- include: update-apt-servers.yml
- include: update-pkgng-servers.yml
- include: update-yum-servers.yml
- include: update-windows-servers.yml

 

Conclusion :

Comme vous le voyez, c’est relativement simple d’utiliser Ansible pour mettre à jour son infrastructure.

Tous les playbooks redémarrent les machines si nécessaire automatiquement. Quand Kexec est disponible on l’utilise, quand Needrestart est disponible on l’utilise aussi.

Pour Windows, si un reboot est effectué on attend 20 minutes que le serveur émerge pour ne pas faire planter le playbook 🙂