Economie d’energie : Etape 1

C’est ici que la technique commence.

Pour gérer l’extinction et l’allumage des serveurs, nous allons utiliser Ansible, un outil magnifiquement puissant permettant d’automatiser à peu près tout ce que l’on souhaite, à condition de comprendre comment on procède.

La machine hébergeant Ansible sera le raspberry pi (pour sa faible consommation, il est parfait pour rester allumer h24)

Edit: En réalité, j’ai combiné les étapes 1 et 2, mais cela n’a pas d’importance.

Mise en place de Ansible

Pour commencer , crée une clef rsa publique qui permettra au raspberry de contacter les autres serveurs sans Mdp (crée la depuis un utilisateur « ansible » de préférence)

ssh-keygen -t rsa

Puis, n’entrez pas de pass phrase, appuyer simplement sur « entrée » jusqu’à ce qu’elle soit créée

La clef est récupérable simplement avec cette commande :

cat /home/ansible/.ssh/id_rsa.pub

Puis sur les serveurs cibles, utiliser ce magnifique script (en mettant bien sûr la clef rsa au bon endroit)

if [[ $(id -u) -ne 0 ]]
then
echo "**** Erreur ****"
echo "Vous devez être connecter en tant que root pour exécuter ce script"
exit 1
fi
echo "**** On s'assure que sudo est installe ****"
apt-get update && apt-get install sudo -y
echo "**** Création de l'utilisateur Ansible ****"
sudo useradd -md /home/ansible -s /bin/bash ansible 
echo "**** Ajout de la clé publique pour Ansible ****"
mkdir /home/ansible/.ssh
echo "CLEF RSA ICI" > /home/ansible/.ssh/authorized_keys
chown -R ansible:ansible /home/ansible/.ssh
chmod 0755 /home/ansible/.ssh
chmod 0400 /home/ansible/.ssh/authorized_keys
echo "**** Ajout du droit root via sudo pour ansible ****"
echo "# Allow ansible to execute any command without autentication" > /etc/sudoers.d/ansible
echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/ansible
chmod 0400 /etc/sudoers.d/ansible
echo "**** Fin, l'utilisateur ansible a été créé ****"
echo "Vous pouvez utiliser Ansible pour déployer les configurations"

Et là, magie, depuis l’utilisateur « ansible » de votre raspberry, vous pouvez vous connecter en ssh sans mot de passe (evidement le script est prévue pour une base Debian, penser à l’adapter pour d’autres versions de Linux)

Shutdown et Wol par Ansible

Les playbooks sont très simples :

Pour le shutdown.yml

---
- name: shutdown
hosts: "{{ group }}"
become: yes
become_user: root
tasks:
- name: shutdown
community.general.shutdown:

Et le wol.yml

---
- name: shutdown
hosts: "{{ group }}"
gather_facts: no
become: yes
become_user: root
tasks:
- name: Send a magic Wake-on-LAN packet
community.general.wakeonlan:
mac: "{{ mac }}"
delegate_to: localhost

Et le fichier inventaire, nommé sobrement « inventory », est dans un format extrêmement simple :

[nas]
192.168.3.202 mac=78:2b:cb:25:47:cd
[fw]
192.168.3.1 mac=00:e0:4c:76:bc:2e

La commande permettant de lancer un shutdown est donc :

ansible-playbook --extra-vars group=nas /home/ansible/shutdown.yml -i /home/ansible/inventory

et pour le Wol :

ansible-playbook --extra-vars group=nas /home/ansible/wol.yml -i /home/ansible/inventory

J’utilise ce format utilisant des extra-vars pour une simple raison, cela va permettre, via crontab, de gérer indépendamment l’extinction et l’allumage de chaque serveur, et le fait d’avoir une variable pour l’adresse Mac dans le fichier inventaire (indispensable pour le Wol), permet de ne pas avoir à la renseigner dans la commande.

Ce qui nous fait un cron de ce style pour le NAS :

La première partie finit ainsi, ce qui fonctionne déjà parfaitement, mais comme prévu, je me compliquerais encore la vie dans l’étape 2 sous peu