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 🙂