Ceci est une ancienne révision du document !
Table des matières
Version : 2020.01
Dernière mise-à-jour : 2020/05/27 16:51
DOF502 - Les Commandes ansible, ansible-playbook et ansible-galaxy
Contenu du Module
- DOF502 - Les Commandes ansible, ansible-playbook et ansible-galaxy
- LAB #5 - Débuter avec Ansible
- La Commande ansible
- LAB #6 - La Commande ansible-playbook
- Playbook Files
- Tasks
- Handlers
- Modules
- Modules pour des Paquets
- Modules pour des Fichiers
- Modules pour le Système
- Inventory Files
- Privilèges
- Création de Groupes
- LAB #7 - La Commande ansible-galaxy
- Utiliser des Rôles avec un Play Book
- Ansible Galaxy
LAB #5 - Débuter avec Ansible
La Commande ansible
Utilisez la commande ansible pour vérifier si la machine TargetA fonctionne :
trainee@ansible:~$ ansible all -i 10.0.2.10, -m ping [WARNING]: Platform linux on host 10.0.2.10 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. 10.0.2.10 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
Important : Cette commande indique à Ansible qu'elle doit exécuter le module indiqué par l'option -m dans tous (all) les serveurs indiqués par l'option -i. La virgule placée après l'adresse IP indique à la commande ansible que la valeur est une adresse IP et non le nom d'un fichier.
Les options de la commande ansible sont :
trainee@ansible:~$ ansible --help Usage: ansible <host-pattern> [options] Define and run a single task 'playbook' against a set of hosts Options: -a MODULE_ARGS, --args=MODULE_ARGS module arguments --ask-vault-pass ask for vault password -B SECONDS, --background=SECONDS run asynchronously, failing after X seconds (default=N/A) -C, --check don't make any changes; instead, try to predict some of the changes that may occur -D, --diff when changing (small) files and templates, show the differences in those files; works great with --check -e EXTRA_VARS, --extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON, if filename prepend with @ -f FORKS, --forks=FORKS specify number of parallel processes to use (default=5) -h, --help show this help message and exit -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated -l SUBSET, --limit=SUBSET further limit selected hosts to an additional pattern --list-hosts outputs a list of matching hosts; does not execute anything else -m MODULE_NAME, --module-name=MODULE_NAME module name to execute (default=command) -M MODULE_PATH, --module-path=MODULE_PATH prepend colon-separated path(s) to module library (default=['/home/trainee/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']) -o, --one-line condense output --playbook-dir=BASEDIR Since this tool does not use playbooks, use this as a subsitute playbook directory.This sets the relative path for many features including roles/ group_vars/ etc. -P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using -B (default=15) --syntax-check perform a syntax check on the playbook, but do not execute it -t TREE, --tree=TREE log output to this directory --vault-id=VAULT_IDS the vault identity to use --vault-password-file=VAULT_PASSWORD_FILES vault password file -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program's version number and exit Connection Options: control as whom and how to connect to hosts -k, --ask-pass ask for connection password --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE use this file to authenticate the connection -u REMOTE_USER, --user=REMOTE_USER connect as this user (default=None) -c CONNECTION, --connection=CONNECTION connection type to use (default=smart) -T TIMEOUT, --timeout=TIMEOUT override the connection timeout in seconds (default=10) --ssh-common-args=SSH_COMMON_ARGS specify common arguments to pass to sftp/scp/ssh (e.g. ProxyCommand) --sftp-extra-args=SFTP_EXTRA_ARGS specify extra arguments to pass to sftp only (e.g. -f, -l) --scp-extra-args=SCP_EXTRA_ARGS specify extra arguments to pass to scp only (e.g. -l) --ssh-extra-args=SSH_EXTRA_ARGS specify extra arguments to pass to ssh only (e.g. -R) Privilege Escalation Options: control how and which user you become as on target hosts -s, --sudo run operations with sudo (nopasswd) (deprecated, use become) -U SUDO_USER, --sudo-user=SUDO_USER desired sudo user (default=root) (deprecated, use become) -S, --su run operations with su (deprecated, use become) -R SU_USER, --su-user=SU_USER run operations with su as this user (default=None) (deprecated, use become) -b, --become run operations with become (does not imply password prompting) --become-method=BECOME_METHOD privilege escalation method to use (default=sudo), valid choices: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ] --become-user=BECOME_USER run operations as this user (default=root) --ask-sudo-pass ask for sudo password (deprecated, use become) --ask-su-pass ask for su password (deprecated, use become) -K, --ask-become-pass ask for privilege escalation password Some modules do not make sense in Ad-Hoc (include, meta, etc)
Démarrez maintenant les quatre machines Web01, Web02, Web03 et Web04. Si vous participez à une FAD, utilisez les commandes suivantes :
trainee@ansible:~$ exit déconnexion Connection to localhost closed. desktop@server16:~$ VBoxManage startvm Web01 --type headless Waiting for VM "Web01" to power on... VM "Web01" has been successfully started. desktop@server16:~$ VBoxManage startvm Web02 --type headless Waiting for VM "Web02" to power on... VM "Web02" has been successfully started. desktop@server16:~$ VBoxManage startvm Web03 --type headless Waiting for VM "Web03" to power on... VM "Web03" has been successfully started. desktop@server16:~$ VBoxManage startvm Web04 --type headless Waiting for VM "Web04" to power on... VM "Web04" has been successfully started. desktop@server16:~$ ssh -l trainee localhost -p 2222 trainee@localhost's password: trainee Linux ansible.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Apr 12 07:42:09 2020 from 10.0.2.2 trainee@ansible:~$
Rappelez-vous que les quatre machines virtuelles WebXX importées sont dans le même réseau NAT que la machine Ansible et ont la même configuration ssh et sudo que la machine TargetA :
Machine | Nom d'hôte | Adresse IP |
---|---|---|
Web01 | web01.i2tch.loc | 10.0.2.11 |
Web02 | web02.i2tch.loc | 10.0.2.12 |
Web03 | web03.i2tch.loc | 10.0.2.13 |
Web04 | web04.i2tch.loc | 10.0.2.14 |
Modifiez le fichier /etc/hosts de la machine Ansible :
trainee@ansible:~$ su - Mot de passe : fenestros root@ansible:~# vi /etc/hosts root@ansible:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 ansible.i2tch.loc ansible 10.0.2.9 ansible.i2tch.loc ansible 10.0.2.10 targeta.i2tch.loc targeta 10.0.2.11 web01.i2tch.loc web01 10.0.2.12 web02.i2tch.loc web02 10.0.2.13 web03.i2tch.loc web03 10.0.2.14 web04.i2tch.loc web04 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters root@ansible:~# exit déconnexion trainee@ansible:~$
Important : Notez que le mot de passe fenestros ne sera pas en clair.
Utilisez la commande scp pour copier le fichier authorized_keys de la machine virtuelle ansible vers les machines virtuelles Web01, Web02, Web03 et Web04 :
trainee@ansible:~$ scp .ssh/authorized_keys trainee@web01.i2tch.loc:/home/trainee/.ssh/authorized_keys The authenticity of host 'web01.i2tch.loc (10.0.2.11)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web01.i2tch.loc,10.0.2.11' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 trainee@web01.i2tch.loc's password: authorized_keys 100% 701 645.8KB/s 00:00 trainee@ansible:~$ scp .ssh/authorized_keys trainee@web02.i2tch.loc:/home/trainee/.ssh/authorized_keys The authenticity of host 'web02.i2tch.loc (10.0.2.12)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web02.i2tch.loc,10.0.2.12' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 trainee@web02.i2tch.loc's password: authorized_keys 100% 701 768.3KB/s 00:00 trainee@ansible:~$ scp .ssh/authorized_keys trainee@web03.i2tch.loc:/home/trainee/.ssh/authorized_keys The authenticity of host 'web03.i2tch.loc (10.0.2.13)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web03.i2tch.loc,10.0.2.13' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 trainee@web03.i2tch.loc's password: authorized_keys 100% 701 1.0MB/s 00:00 trainee@ansible:~$ scp .ssh/authorized_keys trainee@web04.i2tch.loc:/home/trainee/.ssh/authorized_keys The authenticity of host 'web04.i2tch.loc (10.0.2.14)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web04.i2tch.loc,10.0.2.14' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 trainee@web04.i2tch.loc's password: authorized_keys
Vérifiez que vous pouvez vous connecter aux machines virtuelles Web01, Web02, Web03 et Web04 sans entrer de mot de passe :
trainee@ansible:~$ ssh -l trainee web01 Debian GNU/Linux 9 Linux web01.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Apr 12 10:41:27 2020 from 10.0.2.9 trainee@web01:~$ exit déconnexion Connection to web01 closed. trainee@ansible:~$ ssh -l trainee web02 The authenticity of host 'web02 (10.0.2.12)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web02' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 Linux web02.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Jan 29 12:02:10 2019 trainee@web02:~$ exit déconnexion Connection to web02 closed. trainee@ansible:~$ ssh -l trainee web03 The authenticity of host 'web03 (10.0.2.13)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web03' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 Linux web03.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Jan 29 12:02:34 2019 trainee@web03:~$ exit déconnexion Connection to web03 closed. trainee@ansible:~$ ssh -l trainee web04 The authenticity of host 'web04 (10.0.2.14)' can't be established. ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'web04' (ECDSA) to the list of known hosts. Debian GNU/Linux 9 Linux web04.i2tch.loc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Jan 29 12:02:57 2019
Utilisez ensuite la commende ansible avec le module ping :
trainee@ansible:~$ ansible all -i web01, -m ping [WARNING]: Platform linux on host web01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } trainee@ansible:~$ ansible all -i web02, -m ping [WARNING]: Platform linux on host web02 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web02 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } trainee@ansible:~$ ansible all -i web03, -m ping [WARNING]: Platform linux on host web03 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web03 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } trainee@ansible:~$ ansible all -i web04, -m ping [WARNING]: Platform linux on host web04 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web04 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
Utilisez de nouveau la commande ansible afin de vérifier le statut des machines :
trainee@ansible:~$ ansible all -i web01,web02,web03,web04 -m ping [WARNING]: Platform linux on host web04 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web04 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [WARNING]: Platform linux on host web01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [WARNING]: Platform linux on host web03 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web03 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [WARNING]: Platform linux on host web02 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web02 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
Important : Notez que les résultats ne sont pas retournés dans un ordre séquentiel par rapport à la commande exécutée. En effet, ansible a paralléliser l'exécution des commandes.
Exécutez maintenant la commande uptime dans les machines web01, web02, web03 et web04 en utilisant le module command :
trainee@ansible:~$ ansible all -i web01,web02,web03,web04 -m command --args 'uptime' [WARNING]: Platform linux on host web03 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web03 | CHANGED | rc=0 >> 10:49:07 up 51 min, 1 user, load average: 0,00, 0,00, 0,00 [WARNING]: Platform linux on host web01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web01 | CHANGED | rc=0 >> 10:49:07 up 52 min, 1 user, load average: 0,00, 0,00, 0,00 [WARNING]: Platform linux on host web04 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web04 | CHANGED | rc=0 >> 10:49:07 up 51 min, 1 user, load average: 0,00, 0,00, 0,00 [WARNING]: Platform linux on host web02 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web02 | CHANGED | rc=0 >> 10:49:07 up 52 min, 1 user, load average: 0,16, 0,03, 0,01
Exécutez ensuite une commande pour installer apache2 dans les machines web01, web02, web03 et web04 en utilisant le module command. Vous devez voire la confirmation que le paquet a déjà été installé - apache2 is already the newest version :
trainee@ansible:~$ ansible all -i web01,web02,web03,web04 -m command --args 'sudo apt-get install -y apache2' [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo [WARNING]: Platform linux on host web03 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web03 | CHANGED | rc=0 >> Lecture des listes de paquets… Construction de l'arbre des dépendances… Lecture des informations d'état… apache2 is already the newest version (2.4.25-3+deb9u6). 0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour. [WARNING]: Platform linux on host web02 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web02 | CHANGED | rc=0 >> Lecture des listes de paquets… Construction de l'arbre des dépendances… Lecture des informations d'état… apache2 is already the newest version (2.4.25-3+deb9u6). 0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour. [WARNING]: Platform linux on host web04 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web04 | CHANGED | rc=0 >> Lecture des listes de paquets… Construction de l'arbre des dépendances… Lecture des informations d'état… apache2 is already the newest version (2.4.25-3+deb9u6). 0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour. [WARNING]: Platform linux on host web01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. web01 | CHANGED | rc=0 >> Lecture des listes de paquets… Construction de l'arbre des dépendances… Lecture des informations d'état… apache2 is already the newest version (2.4.25-3+deb9u6). 0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
Important : Notez l'utilisation de la commande sudo.
LAB #6 - La Commande ansible-playbook
La commande ansible-playbook permet d’insérer la configuration d'Ansible dans des fichiers afin de pouvoir ré-exécuter les mêmes jeux de commandes à chaque fois. La commande ansible-playbook utilisent des Playbook Files ainsi que des Inventory Files.
Playbook Files
Un Playbook File contient une liste de Plays qui regroupent des tâches, appelées des tasks. Chaque task est une commande à exécuter sur une machine cible :
Dans l'exemple suivant, le playbook contient deux Play commençant par le caractère - :
- hosts: all become : true tasks: - name: installer un paquet package: name=<paquet> state=present - name: groupe group: name: <nom_groupe> state: present - hosts: equilibrage01 become : true tasks: - name: installer un paquet package: name=<paquet> state=present
Dans cet exemple :
- Les deux sections hosts: sont dans une liste YAML. Chaque section est un dictionnaire YAML, aussi connu en tant que map ou hash. Le dictionnaire YAML contient trois champs - hosts:, become: et tasks:. Dans le deuxième task, le contenu de hosts est le nom d'un seul hôte. Ansible utilise l'Inventory File pour obtenir des informations concernant cet hôte,
- Le mot clef hosts: indique sur quel(s) hôte(s) les tasks doit(vent) être effectué(s). La valeur de hosts: est une valeur scalaire sous la forme d'une chaîne,
- Le mot clef become: est une valeur booléenne qui indique que les tâches doivent être accomplies par un utilisateur avec privilèges,
- Le mot clef tasks: contient une autre liste YAML qui spécifie les tâches à effectuer.
Tasks
Un task est une tâche individuelle qui doit être accomplie :
tasks: - name: installer un paquet package: name=<paquet> state=present - name: groupe group: name: <nom_groupe> state: present
Dans cet exemple :
- Chaque task est un dictionnaire YAML contentant un champs optionnel - name et un module Ansible - dans le cas ci-dessus, package ou group,
- Le module Ansible package est une valeur scalaire qui contient une chaîne qui stipule le paquet à installer. Le contenu est composé de deux paramètres - name et state. Dans le cas de ce module la valeur du paramètre state peut être latest, present, absent ou le numéro d'une version du paquet à installer,
- Le module Ansible group est un dictionnaire YAML qui contient deux champs - name et state.
Handlers
Un Handler est une tâche conditionnelle :
tasks: - name: configure copy: src: paquet.conf.local dest: /etc/paquet/paquet.conf owner: root group: root mode: 0644 notify: - restart service
Le mot clef notify appelle un handler identifié par restart service :
tasks: - name: configure copy: src: paquet.conf.local dest: /etc/paquet/paquet.conf owner: root group: root mode: 0644 notify: - restart service handlers: - name: restart service service: name=<paquet.service> state=restarted
Dans cet exemple :
- Ansible compare le fichier local paquet.conf.local avec le fichier /etc/paquet/paquet.conf dans le système ciblé,
- En cas de différences, Ansible copie le fichier paquet.conf.local vers /etc/paquet/paquet.conf et appelle le handler restart service,
- Dans le cas contraire, le handler n'est pas appelé.
Important : Notez que les handlers sont appelés après l'exécution de tous les tasks. Pour appeler un handler immédiatement, il convient d'utiliser meta: flush_handlers à l'emplacement voulu.
Modules
La liste complète des modules se trouve à cette adresse. Chaque module commence par vérifier si un task doit être effectué avant de l'entreprendre.
Modules pour des Paquets
- Le module Ansible package est généralement une valeur scalaire qui contient une chaîne qui stipule le paquet à installer ou bien un dictionnaire. Le contenu est composé de deux paramètres - name et state. Dans le cas de ce module la valeur du paramètre state peut être latest, present, absent ou le numéro d'une version du paquet à installer. Ce module utilise le gestionnaire des paquets de la distribution concernée,
- Le module Ansible pip est décrit par deux paramètres - name et virtualenv. Dans le cas de ce module la valeur du paramètre virtualenv indique la valeur de l'environnement virtuel,
- Le module Ansible gem est décrit par deux paramètres - name et state. Dans le cas de ce module la valeur du paramètre state est similaire à celle du module package.
Modules pour des Fichiers
- Le module Ansible copy copie un fichier du contrôleur vers un système distant. Ce module peut vérifier les propriétés du fichier telles son contenu, le propriétaire avec owner:, le groupe avec group: ou les permissions avec 0644,
- Le module Ansible template est similaire au module copy mais il met à jour le contenu avec des valeurs de variables qui lui sont fournies,
- Le module Ansible files crée ou supprime des fichiers et/ou des répertoires,
- Le module Ansible lineinfile trouve une ligne existante dans un fichier selon la valeur d'une expression régulière regexp: et compare cette ligne avec la valeur d'une ligne spécifiée par line:. Dans le cas où la ligne est différente de la valeur line:, Ansible modifie le fichier,
- Le module Ansible unarchive désarchive une archive sur le système distant. Avant de désarchiver l'archive, Ansible vérifie si le fichier spécifié par la valeur de creates existe ou pas. Dans le cas où le fichier n'existe pas, Ansible procède au désarchivage. Dans le cas contraire, Ansible considère que l'archive a déjà été désarchivé.
Modules pour le Système
Les modules les plus importants dans cette catégorie sont :
- service,
- cron:,
- user:,
- group.
Inventory Files
Un Ansible Inventory File :
- contrôle quels systèmes sont ciblés par ansible-playbook,
- permet des configurations par système,
- est un fichier au format INI,
- est stocké par défaut dans le répertoire /etc/ansible/hosts.
Dans un tel fichier, on peut trouver des listes simples :
web01 web02 web03 web04 web05
des plages :
web [01:05]
des sections :
[basededonnees] basededonnees01
et des adresses IP :
10.0.2.14
Par exemple, l'Inventory file pour quatre systèmes différents pourrait ressembler à l'exemple suivant :
... web01 ansible_hostname=10.0.2.11 ansible_user=trainee ... web02 ansible_hostname=10.0.2.12 ansible_user=trainee ... web03 ansible_hostname=10.0.2.13 ansible_user=trainee ... web04 ansible_hostname=10.0.2.14 ansible_user=trainee ...
Privilèges
Ansible a besoin d'obtenir les privilèges d'administration pour la plupart des tâches à accomplir. L'escalade des privilèges peut être configurée dans trois endroits différents grâce à l'utilisation :
- du mot clef become: dans un task auquel cas l'escalade des privilèges ne s'applique qu'à la taĉhe,
- du mot clef become: dans un play auquel cas l'escalade des privilèges s'applique à tous les tasks dans le play,
- des directives ansible_become=yes et ansible_become_user=<nom_utilisateur> dans le fichier Inventory File auquel cas l'escalade des privilèges s'applique à tous les play du serveur spécifié.
Notez qu'Ansible peut également utiliser d'autres mécanismes pour contrôler des systèmes :
- local - la connexion n'est pas effectuée par SSH car les tasks sont à effectuer sur le localhost,
- Winrm - le module Python Windows Remote Management qui peut être installé à côté d'Ansible et qui permet d'exécuter des commandes PowerShell,
- Docker - la commande docker exec. La configuration est effectuée par Ansible au lieu d'un DockerFile traditionnel.
Création de Groupes
Ansible permet le regroupement d'hôtes dans des groupes. Prenons l'exemple suivant :
... [apache] web01 web02 [nginx] web03 web04 [equilibrage] equilibrage01 ...
Le groupe apache contient deux machines, le groupe nginx contient deux machines tandis que le groupe equilibrage n'en contient qu'un. Toute configuration appliquée au groupe apache, par exemple, s'applique aux deux machines dans le groupe.
Dans cet exemple, les quatre machines web0X sont sous Debian et utilisent l'utilisateur trainee pour l'escalade des privilèges tandis que le système equilibrage01 est sous CentOS et utilise l'utilisateur root.
Afin qu'Ansible sache quel utilisateur utilisé avec ssh, il convient de créer des groupes supplémentaires :
... [apache] web01 web02 [nginx] web03 web04 [debian:children] web nginx [debian:vars] ansible_user=trainee [equilibrage] equilibrage01 [centos:children] equilibrage [centos:vars] ansible_user=root ...
Le groupe debian contient les deux groupes apache et nginx en tant qu'enfants. Toute configuration appliquée au groupe debian, s'applique aux quatre machines dans les groupes apache et nginx. Le groupe debian est configuré par une variable ansible_user=trainee.
Le groupe centos contient un seul groupe equilibrage en tant qu'enfant. Le groupe centos est configuré par une variable ansible_user=root.
Cette configuration permet de modifier le Playbook ainsi :
- hosts: all become : true tasks: - name: groupe group: name: <nom_groupe> state: present - hosts: apache become : true tasks: - name: installer Apache package: name=apache state=present - hosts: nginx become : true tasks: - name: installer Nginx package: name=nginx state=present - hosts: equilibrage become : true tasks: - name: installer HAProxy package: name=haproxy state=present
Dans cet exemple, la valeur du mot clef hosts: est le nom d'un groupe.
Important : Notez qu'il existe un groupe spécial appelé all. Ce groupe n'a pas besoin d'être défini et contient l'ensemble des hôtes références dans l'Inventory File
Dans la machine virtuelle Ansible, créez le fichier Inventory File suivant :
trainee@ansible:~$ vi inventory trainee@ansible:~$ cat inventory [basededonnees] web01 [dotcms] web02 web03 [equilibrage] web04 [debian:children] basededonnees dotcms equilibrage [debian:vars] ansible_user=trainee
Créez ensuite le Play Book suivant :
trainee@ansible:~$ vi playbook.yaml trainee@ansible:~$ cat playbook.yaml --- - hosts: basededonnees become: true tasks: - name: install package: name=postgresql state=installed - name: service service: name=postgresql state=started enabled=yes tags: service - hosts: dotcms become: true tasks: - name: install jre package: name=openjdk-8-jre state=installed - hosts: equilibrage become: true tasks: - name: install package: name=haproxy stated=installed - name: service service: name=haproxy state=started enabled=yes tags: service
Exécutez la commande ansible-playbook :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml PLAY [basededonnees] ********************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web01] TASK [install] ********************************************************************************************************************************************************** [DEPRECATION WARNING]: State 'installed' is deprecated. Using state 'present' instead.. This feature will be removed in version 2.9. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. changed: [web01] TASK [service] ********************************************************************************************************************************************************** ok: [web01] PLAY [dotcms] *********************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web03] ok: [web02] TASK [install jre] ****************************************************************************************************************************************************** ok: [web03] ok: [web02] PLAY [equilibrage] ********************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [install] ********************************************************************************************************************************************************** fatal: [web04]: FAILED! => {"changed": false, "msg": "Unsupported parameters for (apt) module: stated Supported parameters include: allow_unauthenticated, autoclean, autoremove, cache_valid_time, deb, default_release, dpkg_options, force, force_apt_get, install_recommends, only_upgrade, package, purge, state, update_cache, upgrade"} to retry, use: --limit @/home/trainee/playbook.retry PLAY RECAP ************************************************************************************************************************************************************** web01 : ok=3 changed=1 unreachable=0 failed=0 web02 : ok=2 changed=0 unreachable=0 failed=0 web03 : ok=2 changed=0 unreachable=0 failed=0 web04 : ok=1 changed=0 unreachable=0 failed=1
Notez l’avertissement ainsi que l'erreur.
Important : L'avertissement nous apprend que le mot clef installed devrait être remplacé par present.
Important : L'erreur indique qu'il existe une erreur de syntaxe dans le fichier playbook.yaml.
En consultant le fichier playbook.yaml, il existe une erreur à la ligne 19 - stated devrait être corrigé en state :
trainee@ansible:~$ nl playbook.yaml 1 --- 2 - hosts: basededonnees 3 become: true 4 tasks: 5 - name: install 6 package: name=postgresql state=installed 7 - name: service 8 service: name=postgresql state=started enabled=yes 9 tags: service 10 - hosts: dotcms 11 become: true 12 tasks: 13 - name: install jre 14 package: name=openjdk-8-jre state=installed 15 - hosts: equilibrage 16 become: true 17 tasks: 18 - name: install 19 package: name=haproxy stated=installed 20 - name: service 21 service: name=haproxy state=started enabled=yes 22 tags: service
Corrigez le fichier playbook.yaml aux lignes 6, 14 et 19 et remplacez le mot installed par present :
trainee@ansible:~$ vi playbook.yaml trainee@ansible:~$ cat playbook.yaml --- - hosts: basededonnees become: true tasks: - name: install package: name=postgresql state=present - name: service service: name=postgresql state=started enabled=yes tags: service - hosts: dotcms become: true tasks: - name: install jre package: name=openjdk-8-jre state=present - hosts: equilibrage become: true tasks: - name: install package: name=haproxy state=present - name: service service: name=haproxy state=started enabled=yes tags: service
Ré-exécutez la commande ansible-playbook :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml PLAY [basededonnees] ********************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web01] TASK [install] ********************************************************************************************************************************************************** ok: [web01] TASK [service] ********************************************************************************************************************************************************** ok: [web01] PLAY [dotcms] *********************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web03] ok: [web02] TASK [install jre] ****************************************************************************************************************************************************** ok: [web02] ok: [web03] PLAY [equilibrage] ********************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [install] ********************************************************************************************************************************************************** changed: [web04] TASK [service] ********************************************************************************************************************************************************** ok: [web04] PLAY RECAP ************************************************************************************************************************************************************** web01 : ok=3 changed=0 unreachable=0 failed=0 web02 : ok=2 changed=0 unreachable=0 failed=0 web03 : ok=2 changed=0 unreachable=0 failed=0 web04 : ok=3 changed=1 unreachable=0 failed=0
Important : Notez que seul web04 a été modifié.
Il est possible de limiter l'action de la commande ansible-playbook avec l'option -l. Exécutez la commande ansible-playbook en limitant l'action d'ansible-playbook au groupe equilibrage :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml -l equilibrage PLAY [basededonnees] ********************************************************************************************************************************************************* skipping: no hosts matched PLAY [dotcms] *********************************************************************************************************************************************************** skipping: no hosts matched PLAY [equilibrage] ********************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [install] ********************************************************************************************************************************************************** ok: [web04] TASK [service] ********************************************************************************************************************************************************** ok: [web04] PLAY RECAP ************************************************************************************************************************************************************** web04 : ok=3 changed=0 unreachable=0 failed=0
Bien évidement il est aussi possible de limiter à une seule machine :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml -l web04 PLAY [basededonnees] **************************************************************************************************************************************************** skipping: no hosts matched PLAY [dotcms] *********************************************************************************************************************************************************** skipping: no hosts matched PLAY [equilibrage] ****************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [install] ********************************************************************************************************************************************************** ok: [web04] TASK [service] ********************************************************************************************************************************************************** ok: [web04] PLAY RECAP ************************************************************************************************************************************************************** web04 : ok=3 changed=0 unreachable=0 failed=0
Notez que dans le fichier playbook.yaml se trouvent deux lignes dont le mot clef est tags:. Cette étiquette permet de limiter l'action de la commande ansible-playbook aux seuls services :
... - name: service service: name=postgresql state=started enabled=yes tags: service ... - name: service service: name=haproxy state=started enabled=yes tags: service
Exécutez de nouveau la commande ansible-playbook en limitant l'action aux seuls services :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml --tags service PLAY [basededonnees] **************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web01] TASK [service] ********************************************************************************************************************************************************** ok: [web01] PLAY [dotcms] *********************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web02] ok: [web03] PLAY [equilibrage] ****************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [service] ********************************************************************************************************************************************************** ok: [web04] PLAY RECAP ************************************************************************************************************************************************************** web01 : ok=2 changed=0 unreachable=0 failed=0 web02 : ok=1 changed=0 unreachable=0 failed=0 web03 : ok=1 changed=0 unreachable=0 failed=0 web04 : ok=2 changed=0 unreachable=0 failed=0
Il est aussi possible de combiner les options –tags et -l :
trainee@ansible:~$ ansible-playbook -i inventory playbook.yaml --tags service -l equilibrage PLAY [basededonnees] **************************************************************************************************************************************************** skipping: no hosts matched PLAY [dotcms] *********************************************************************************************************************************************************** skipping: no hosts matched PLAY [equilibrage] ****************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] TASK [service] ********************************************************************************************************************************************************** ok: [web04] PLAY RECAP ************************************************************************************************************************************************************** web04 : ok=2 changed=0 unreachable=0 failed=0
LAB #7 - La Commande ansible-galaxy
Utiliser des Rôles avec un Play Book
Les Rôles permettent la création d'une bibliothèque réutilisable.
Un Rôle est un répertoire contenant les sous-répertoires suivants :
- defaults
- contient des variables par défaut de basses priorités qui peuvent être sur-chargées par des variables ailleurs,
- files,
- contient des fichiers à déployer aux systèmes distants,
- handlers,
- contient les handlers,
- meta,
- contient entre autre des informations sur des dépendances entre les Rôles,
- tasks,
- contient les actions à effectuer,
- templates,
- contient des fichiers qui peuvent être customisé avec des variables avant d'être déployés,
- var,
- contient des variables de configuration de haute priorité, difficilement sur-chargées par des variables ailleurs.
Important : Notez que seul le répertoire tasks est obligatoire.
Notez que le module copy: ne référence un fichier que par son nom et son éventuelle extension :
... copy: src: myfile.conf ...
Ansible recherche ce fichier dans plusieurs répertoires dans l'ordre qui suit :
- le répertoire files du Rôle,
- le répertoire tasks du Rôle,
- le répertoire du Rôle lui-même,
- le répertoire files du répertoire dans lequel se trouve le fichier playbook.yaml,
- le répertoire dans lequel se trouve le fichier playbook.yaml.
Par exemple :
. ├── 5-myfile.conf ├── files │ └── 4-myfile.conf ├── playbook.yaml ├── roles └── dotcms ├── 3-myfile.conf ├── defaults │ └── main.yaml ├── files │ └── 1-myfile.conf ├── handlers │ └── main.yaml ├── tasks │ ├── 2-myfile.conf │ └── main.yaml └── templates ├── context.xml └── dotcms.service
Dans le cas de l'utilisation de Rôles, le fichier playlist.yaml devient plus simplifié. Par exemple :
- hosts: basededonnees become: true roles: - basededonnees - hosts: dotcms become: true roles: - java - dotcms - hosts: equilibrage become: true roles: - equilibrage
Ansible Galaxy
Ansible Galaxy est un dépôt de Rôles créées par des tierces personnes. Ce dépôt peut être consulté à l'adresse https://galaxy.ansible.com/ :
Recherchez le mot clef java :
Appliquez le filtre Download Count :
Consultez la première dans la liste :
Copiez la commande d'installation :
Important : Notez que la convention utilisée pour les noms est nom_utilisateur.rôle.
Dans la machine Ansible, collez la commande copiée et exécutez-la :
trainee@ansible:~$ ansible-galaxy install geerlingguy.java - downloading role 'java', owned by geerlingguy - downloading role from https://github.com/geerlingguy/ansible-role-java/archive/1.9.5.tar.gz - extracting geerlingguy.java to /home/trainee/.ansible/roles/geerlingguy.java - geerlingguy.java (1.9.5) was installed successfully
Consultez maintenant le répertoire /home/trainee/.ansible/roles/geerlingguy.java :
trainee@ansible:~$ su - Mot de passe : fenestros root@ansible:~# apt-get install tree ... root@ansible:~# exit trainee@ansible:~$ tree /home/trainee/.ansible/roles/geerlingguy.java /home/trainee/.ansible/roles/geerlingguy.java ├── defaults │ └── main.yml ├── LICENSE ├── meta │ └── main.yml ├── molecule │ └── default │ ├── molecule.yml │ ├── playbook.yml │ ├── tests │ │ └── test_default.py │ └── yaml-lint.yml ├── README.md ├── tasks │ ├── main.yml │ ├── setup-Debian.yml │ ├── setup-FreeBSD.yml │ └── setup-RedHat.yml ├── templates │ └── java_home.sh.j2 └── vars ├── Debian-8.yml ├── Debian-9.yml ├── Fedora.yml ├── FreeBSD.yml ├── RedHat-6.yml ├── RedHat-7.yml ├── Ubuntu-12.yml ├── Ubuntu-14.yml ├── Ubuntu-16.yml └── Ubuntu-18.yml 8 directories, 23 files
Important : Notez que dans ce cas il n'y a pas eu de dépendances. Par contre la commande ansible-galaxy sait résoudre et gérer les dépendances.
Créez maintenant un fichier Play Book pour utiliser ce Rôle :
trainee@ansible:~$ vi playbook_java.yaml trainee@ansible:~$ cat playbook_java.yaml --- - hosts: all become: true roles: - geerlingguy.java
Exécutez la commande ansible-playbook :
trainee@ansible:~$ ansible-playbook -i inventory playbook_java.yaml PLAY [all] ************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************** ok: [web04] ok: [web02] ok: [web03] ok: [web01] TASK [geerlingguy.java : Include OS-specific variables for Fedora or FreeBSD.] ****************************************************************************************** skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : Include version-specific variables for CentOS/RHEL.] ******************************************************************************************* skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : Include version-specific variables for Ubuntu.] ************************************************************************************************ skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : Include version-specific variables for Debian.] ************************************************************************************************ ok: [web04] ok: [web01] ok: [web02] ok: [web03] TASK [geerlingguy.java : Define java_packages.] ************************************************************************************************************************* ok: [web04] ok: [web01] ok: [web02] ok: [web03] TASK [geerlingguy.java : include_tasks] ********************************************************************************************************************************* skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : include_tasks] ********************************************************************************************************************************* included: /home/trainee/.ansible/roles/geerlingguy.java/tasks/setup-Debian.yml for web04, web01, web02, web03 TASK [geerlingguy.java : Ensure 'man' directory exists.] **************************************************************************************************************** skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : Ensure Java is installed.] ********************************************************************************************************************* changed: [web04] changed: [web03] changed: [web02] changed: [web01] TASK [geerlingguy.java : include_tasks] ********************************************************************************************************************************* skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] TASK [geerlingguy.java : Set JAVA_HOME if configured.] ****************************************************************************************************************** skipping: [web04] skipping: [web01] skipping: [web02] skipping: [web03] PLAY RECAP ************************************************************************************************************************************************************** web01 : ok=5 changed=1 unreachable=0 failed=0 web02 : ok=5 changed=1 unreachable=0 failed=0 web03 : ok=5 changed=1 unreachable=0 failed=0 web04 : ok=5 changed=1 unreachable=0 failed=0
Important : Notez qu'Ansible a pu localiser le Rôle grâce à la valeur de la variable Ansible ANSIBLE_ROLES_PATH. La valeur par défaut de cette variable est ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles.
<html>
Copyright © 2020 Hugh NORRIS
</html>