Installer Kexec pour redémarrer ses serveurs plus rapidement (+ Ansible)

1/52/53/54/55/5 (Pas encore de note)
Loading...
I

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 🙂

 

A propos de l'auteur

Nicolas Simond

Ingénieur Systèmes et Réseaux et guitariste hard rock et metal à mes heures perdues.
Je suis le créateur et l'unique rédacteur d'Abyss Project, c'est ici que je note la plupart de mes procédures et quelques divagations.

Si vous l'article vous a aidé, pensez à me payer un café :)

Subscribe
Notify of
guest

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

1 Commentaire
Plus récents
Plus anciens Populaires
Inline Feedbacks
View all comments