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 🙂