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 installer Kexec et le script kexec-reboot sur son serveur.
Kexec permet de rebooter son serveur Linux et d’appliquer un nouveau kernel à chaud.
C’est très intéressant sur un serveur dédié, car cela veut dire que vous ne redémarrez pas le serveur lui-même, mais seulement le système d’exploitation. Sur une machine virtuelle, le gain est peu perceptible et la technique ne marche pas forcément.
Ça réduit grandement votre temps d’indisponibilité.
Pour vous donner une idée, le blog est maintenant héberger sur un HP ProLiant DL320e Gen8 v2 pour le moment.
Un redémarrage complet de la bête prend presque 5 minutes soit 300 secondes.
Avec Kexec, un redémarrage se fait en moins de 5 secondes. Je divise donc mon temps d’indisponibilité par 60 !!!
Léger prérequis, votre kernel doit être compilé avec le support de kexec et sans protection contre l’exécution en mémoire.
Les kernels que je fais moi même sont parfaitement compatibles (GRKERNSEC_KMEM désactivée).
Vous pouvez les télécharger ici.
Installer Kexec et Kexec-reboot :
Cette procédure est censée marcher sur n’importe quelle distribution GNU/Linux.
Comme d’habitude, je ferais tout sur Debian.
Installez les prérequis :
apt-get install kexec-tools ruby
Maintenant Kexec est installé, vous pouvez déjà redémarrer à chaud, MAIS, il faudrait se taper toute l’injection du kernel à la main et si vous êtes aussi larvaire que moi, vous n’avez pas envie de faire ça.
Téléchargez kexec-reboot et rendez la commande exécutable :
cd /usr/bin wget https://raw.githubusercontent.com/error10/kexec-reboot/master/kexec-reboot chmod +x kexec-reboot
Vous pouvez choisir un kernel manuellement et redémarrez avec la commande suivante :
kexec-reboot -i
Ou vous pouvez choisir le kernel le plus récent automatiquement et redémarrer avec la commande suivante :
kexec-reboot -lr
Installer Kexec et Kexec-reboot avec un playbook ansible :
Dans un premier temps, éditez votre fichier hosts avec la commande suivante :
nano /etc/ansible/hosts
Et ajoutez tous vos serveurs dédiés dans une section dédiée (vive la répétition) :
[baremetal] serveur1:22 ansible_connection=ssh ansible_user=ansible serveur2:22 ansible_connection=ssh ansible_user=ansible
Maintenant, créez un nouveau playbook :
nano /etc/ansible/playbooks/kexec.yml
Et remplissez-le avec ceci :
- hosts: baremetal
become: yes
become_method: sudo
tasks:
- name: Check needed softwares
apt: name={{ item }} state=present
with_items:
- kexec-tools
- ruby
notify: test
- name: Copy kexec-reboot
copy: src=/etc/ansible/ressources/softs/kexec-reboot dest=/usr/bin/kexec-reboot owner=root group=root mode=744 backup=yes
notify: test
handlers:
- name: test
shell: kexec-reboot -l
Créez un dossier pour sauvegarder vos scripts et téléchargez kexec-reboot :
mkdir -p /etc/ansible/ressources/softs/ cd /etc/ansible/ressources/softs/ wget https://raw.githubusercontent.com/error10/kexec-reboot/master/kexec-reboot && chmod +x kexec-reboot
Lancez enfin le playbook :
cd /etc/ansible/ ansible-playbook playbooks/kexec.yml
Voilà pour le déploiement sur tous vos serveurs.
Intégrer kexec-reboot dans un playbook ansible :
Voici maintenant un exemple de playbook qui vérifiera si un redémarrage est en attente sur tous vos serveurs.
Si un redémarrage est en attente et que kexec-reboot est présent alors il utilisera cette commande, sinon il utilisera simplement la commande reboot du système :
- hosts: all
become: yes
become_method: sudo
tasks:
- 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
shell: 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
Et voilà, c’est tout pour aujourd’hui 🙂

