Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.
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 🙂



(3 votes, moyenne: 3,33 sur 5)