![Logo Ansible](images/logo-ansible.svg) # ansible-vault Sécuriser les données sensibles. * La commande `ansible-vault` permet la création de conteneurs chiffrés pour les variables sensibles. ```nohighlight $ ansible-vault create test.yaml Vault password: ``` * Le choix d'un un mot de passe est obligatoire lors de la création du fichier. Le contenu en clair : ```nohighlight mon_super_mot_de_passe: 12345678 ``` devient après chiffrement : ```nohighlight $ cat test.yaml $ANSIBLE_VAULT;1.1;AES256 62366463643661313763313135376434303535646637653237633233306663623635643761643161 3834383236386535366533303733613838653836623661340a383263633435336234333335343539 30333664666364613731666666636235373633346463353766356364623039656262363238363830 3236656664353565620a303034643732636166376535386436616231653363386334663065326337 3561 ``` Le mot de passe sera demandé lors de chacune des exécutions du playbook : ```nohighlight $ ansible-playbook mon-playbook.yaml –ask-vault-pass Vault password: ``` ### Travaux pratiques ![Travaux pratiques](images/tp.gif) [TP Ansible vault](travaux-pratiques/tp-ansible-vault.html) ![Logo Ansible](images/logo-ansible.svg) # Notions avancées ## Surcharge de variables * Ansible permet la déclaration de variables en de multiples endroits. * Ansible supporte la surcharge de variables, cette surcharge dépend de l’endroit où les variables sont déclarées. Ordre de priorité croissant lors de la surcharge : * role defaults * inventory file or script group vars * inventory group_vars/all * playbook group_vars/all * inventory group_vars/* * playbook group_vars/* * inventory file or script host vars * inventory host_vars/* * playbook host_vars/* * host facts / cached set_facts * play vars * play vars_files * role vars (defined in role/vars/main.yaml) * task vars (only for the task) * include_vars * set_facts / registered vars * role (and include_role) params * include params * extra vars (always win precedence) ## register + debug + verbosity ```yaml - shell: /usr/bin/uptime register: result - name: Display uptime debug: var: result verbosity: 2 # affiché à partir du niveau -vv - name: Display all variables/facts known for a host debug: var: hostvars[inventory_hostname] verbosity: 4 # affiché à partir du niveau -vvvv ``` ## Niveau de verbosité ```nohighlight $ ansible-playbook -i ./hosts playbook.yaml ``` ```nohighlight $ ansible-playbook -vv -i ./hosts playbook.yaml ``` ```nohighlight $ ansible-playbook -vvvv -i ./hosts playbook.yaml ``` ## Check mode (« Dry Run ») * Simulation de l'exécution d'un Playbook. * Aucun changement n'est effectué sur les hosts lors du check. * Utiliser l’option `--check`. * _Attention_ ! Certains modules sont incompatibles avec le Check mode. Forcer ou non une tâche en check : `check_mode: yes/no` ```yaml tasks: - name: this task will make changes to the system even in check mode command: /something/to/run --even-in-check-mode check_mode: no - name: this task will always run under checkmode and not change the system lineinfile: line: "important config" dest: /path/to/myconfig.conf state: present check_mode: yes ``` ## Autres options de ansible-playbook Option | Description - | - `--list-hosts` | Affiche les machines concernées par le Play `--list-tags` | Affiche les tags disponibles `--list-tasks` | Affiche les tâches qui seront exécutées `--step` | Demande confirmation avant l'exécution de chaque tâche `--syntax-check` | Analyse syntaxique du Playbook (sans l'exécuter) ## Tester du code Ansible ![Logo Molecule](images/logo-molecule.png) * Permet de tester des Roles Ansible https://molecule.readthedocs.io/en/latest/ ![Logo TestInfra](images/logo-testinfra.svg) Création de tests unitaire en langage Python ```python def test_passwd_file(host): passwd = host.file("/etc/passwd") assert passwd.contains("root") assert passwd.user == "root" assert passwd.group == "root" assert passwd.mode == 0o644 ``` Combiné avec GitLab-CI/Jenkins et Docker, il permet d'automatiser le test de code Ansible. https://testinfra.readthedocs.io/en/latest/ ## Ansible Lint * Permet de détecter les comportements et les pratiques qui peuvent être améliorés. https://ansible-lint.readthedocs.io/en/latest/ ## Ansible en mode Pull * Ansible fonctionne traditionnellement en mode `Push`. * Il est possible de passer en mode `Pull` à l'aide de la commande `ansible-pull`. * Intérêt du mode Pull - Adresser un grand nombre de machines, - Remediation des systèmes en continu. * Pré-requis du mode Pull * Playbooks disponibles sur un dépôt git, * Ansible installé sur chaque machine cible. https://docs.ansible.com/ansible/latest/cli/ansible-pull.html https://github.com/ansible/ansible-examples/blob/master/language_features/ansible_pull.yaml ## Développer un module personnalisé `./library/mymodule.py` ```python #!/usr/bin/python from ansible.module_utils.basic import * def main(): module = AnsibleModule(argument_spec={}) response = {"hello": "world"} module.exit_json(changed=False, meta=response) if __name__ == '__main__': main() ``` https://blog.toast38coza.me/custom-ansible-module-hello-world/ https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html ## Utiliser un module personnalisé `playbook-demo-mymodule.yaml` ```yaml - hosts: web tasks: - name: Test that my module works mymodule: register: result - debug: var=result ``` ```nohighlight $ ansible-playbook -i ./hosts playbook-demo-mymodule.yaml ... TASK [Test that my module works] *********************************************** ok: [web2.formation.sii.fr] ok: [web1.formation.sii.fr] TASK [debug] ******************************************************************* ok: [web1.formation.sii.fr] => { "result": { "changed": false, "meta": { "hello": "world" } } } ok: [web2.formation.sii.fr] => { "result": { "changed": false, "meta": { "hello": "world" } } } ... ``` ## Ansible Tower * Interface Web propriétaire pour le lancement de playbooks. * Accès à l’historique des playbooks lancés et aux logs d'exécution. * Gestion des utilisateurs et de l'inventaire. * Pilotable via API. https://www.ansible.com/products/tower ### Tableau de bord d'Ansible Tower ![Tower dashboard](images/tower-dashboard.png) ### AWX * Version opensource de Ansible Tower (sous licence Apache 2.0.) * AWX est à Ansible Tower ce que Fedora est à Red Hat Enterprise Linux. * Non recommandé pour les environnements de production. * Aucun support n'est fourni par Red Hat. https://www.ansible.com/products/awx-project