[![Linter Status](https://drone.auro.re/api/badges/Aurore/ansible/status.svg)](https://drone.auro.re/Aurore/ansible) # Recettes Ansible d'Aurore Dépendances requises : * Ansible 2.9 ou plus récent. ## Ansible 101 Si vous n'avez jamais touché à Ansible avant, voilà une rapide introduction. **Inventory** : c'est le fichier `hosts` d'inventaire. Il contient la définition de chaque machine et le regroupement. Quand on regroupe avec un `:children` en réalité on groupe des groupes. Chaque machine est annoncée avec son hostname. Il faut pouvoir SSH sur cette machine avec ce hostname, car c'est ce qu'Ansible fera. **Playbook** : c'est une politique de déploiement. Il contient les associations des rôles avec les machines. L'idée au Crans est de regrouper par thème. Exemple, le playbook `monitoring.yml` va contenir toutes les définitions machines-rôles qui touchent au monitoring. Cela permet de déployer manuellement tout le monitoring sans toucher au reste. **Rôle** : un playbook donne des rôles à des machines. Ces rôles sont tous dans le dossier `roles/`. Un rôle installe un service précis sur un serveur. Il est préférable d'être atomique sur les rôles plutôt d'en coder un énorme qui sera difficilement maintenable. *Exemples de rôle* : activer les backports pour ma version de Debian, installer NodeJS, déployer un serveur prometheus, déployer une node prometheus… **Tâche** : un rôle est composé de tâches. Une tâche effectue une et une seule action. Elle est associée à un module Ansible. *Exemples de tâche* : installer un paquet avec le module `apt`, ajouter une ligne dans un fichier avec le module `lineinfile`, copier une template avec le module `template`… Une tâche peut avoir des paramètres supplémentaires pour la réessayer quand elle plante, récupérer son résultat dans une varible, mettre une boucle dessus, mettre des conditions… N'oubliez pas d'aller lire l'excellent documentation de RedHat sur tous les modules d'Ansible ! ### Gestion des groupes de machines Pour la liste complète, je vous invite à lire le fichier `hosts`. * pour tester les versions de Debian, ```YAML ansible_lsb.codename == 'stretch' ``` * pour tester si c'est un CPU Intel x86_64, ```YAML ansible_processor[0].find('Intel') != -1 and ansible_architecture == 'x86_64' ``` Pour les fonctions (`proxy-server`, `dhcp-dynamique`…) il a été choisi de ne pas faire de groupe particulier mais plutôt de sélectionner/enlever les machines pertinentes directement dans les playbooks. ### Lister tout ce que sait Ansible sur un hôte Lors du lancement d'Ansible, il collecte un ensemble de faits sur les serveurs qui peuvent ensuite être utilisés dans des variables. Pour lister tous les faits qu'Ansible collecte nativement d'un serveur on peut exécuter le module `setup` manuellement. ``` ansible proxy.adm.auro.re -m setup --ask-vault-pass ``` ## Exécution d'Ansible ### Configurer la connexion au vlan adm Envoyer son agent SSH peut être dangereux ([source](https://heipei.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/)). On va utiliser plutôt `ProxyJump`. Dans la configuration SSH : ``` Host *.adm.auro.re *.pve.auro.re # Accept new host keys StrictHostKeyChecking accept-new # Use passerelle to connect to administration VLANs ProxyJump passerelle.auro.re ``` Il faut sa clé SSH configurée sur le serveur que l'on déploit. ```bash ssh-copy-id proxy.adm.auro.re ``` ### Lancer Ansible Il faut `python3-netaddr` sur sa machine. Pour tester le playbook `base.yml` : ```bash ansible-playbook --ask-vault-pass base.yml --check ``` Vous pouvez ensuite enlever `--check` si vous voulez appliquer les changements ! Si vous avez des soucis de fingerprint ECDSA, vous pouvez ignorer une première fois (dangereux !) : `ANSIBLE_HOST_KEY_CHECKING=0 ansible-playbook...`. ### Ajouter tous les empruntes de serveur ```bash #!/bin/bash for ip in `cat hosts|grep .adm.auro.re`; do ssh-copy-id -i ~/.ssh/id_rsa.pub $ip done ``` ### Passage à Ansible 2.10 (release: 30 juillet) Installez la version de développement d'ansible pour faire fonctionner les playbooks de ce repo, ainsi que les collections suivantes : ```bash ansible-galaxy collection install community.general ansible-galaxy collection install ansible.posix ``` Si vous n'arrivez pas à entrer votre _become password_ (bug dans ansible?), un workaround est le suivant : `$ export ANSIBLE_BECOME_PASS=''` Notez l'espace au début pour ne pas log la commande dans votre historique shell.