tuto2: add parts on notify, playbooks, ...

This commit is contained in:
nemunaire 2018-03-30 18:58:37 +02:00 committed by Pierre-Olivier Mercier
parent d42ef0f5bc
commit e37d0532b0
1 changed files with 185 additions and 0 deletions

View File

@ -241,3 +241,188 @@ disposition](http://docs.ansible.com/ansible/latest/modules_by_category.html)
de copier vos fichiers de configuration à leur place et avec les bons droits
(`authorized_keys`, `.bashrc`, ...). Installez également les paquets que vous
aviez installé à la main (client DHCP, `htop`, ...).
Les notifications
-----------------
Au sein d'un *playbook*, il est possible de définir des tâches particulières
(nommées *handlers* dans le vocabulaire Ansible), qui ne seront exécutées que
si un changement à eu lieu. Par exemple, nous pourrions déclarer une tâche de
redémarrage du serveur web, seulement lorsque sa configuration est mise à
jour.
Pour se faire, il faut ajouter un élément `notify` à sa tâche :
<div lang="en-US">
```yaml
- name: template configuration file
template: src=template.j2 dest=/etc/httpd.conf
notify:
- restart cherokee
```
</div>
Puis, au même niveau que les *tasks*, on déclare nos *handlers* :
<div lang="en-US">
```yaml
handlers:
- name: restart cherokee
service: name=cherokee state=restarted
```
</div>
Il est attendu que le nom de la notification corresponde à l'attribut `name`
d'un handler.
Voir [la
documentation](http://docs.ansible.com/ansible/latest/playbooks_intro.html#handlers-running-operations-on-change)
pour davantage de détails et d'exemples.
La configuration de votre serveur SSH laisse à désirer. Corriger les problèmes
énoncés par ces deux articles :
- <https://ringyt.wordpress.com/2017/05/23/default-hardened-ssh-server-config/> ;
- <https://stribika.github.io/2015/01/04/secure-secure-shell.html>.
Mettez en place un *handler* pour relancer votre serveur SSH en cas de
modification de sa configuration.
Les variables
-------------
Les variables peuvent provenir de très nombreux emplacements : définies
spécifiquement pour l'hôte, chargées depuis des fichiers lié au groupe auquel
appartient la machine, liées à la recette ou à la tâche en cours d'exécution,
récupérée par un module (comme le module `setup`).
### Définition
#### Dans l'inventaire
<div lang="en-US">
```yaml
all:
hosts:
192.168.0.106
vars:
ntp_server: ntp.epitech.eu
```
</div>
Cet inventaire définit une variable `ntp_server` qui pourra ensuite être
utilisée par une recette installant un serveur NTP. Le cadre d'utilisation de
ce genre de variable est adapté lorsqu'un hôte ou un groupe d'hôte seulement
partagent des caractéristiques, comme par exemple leur localisation ou
datacenter de rattachement, etc.
#### Dans un *playbook*
De la même manière que dans l'inventaire, il est possible de définir des
variables dans une recette :
<div lang="en-US">
```yaml
- hosts: webservers
vars:
http_port: 80
```
</div>
Ces variables peuvent être placées dans un fichier, pour plus de lisibilité :
<div lang="en-US">
```yaml
- hosts: webservers
vars_files:
- /vars/webservers_common.yml
```
</div>
Le format correspond au sous arbre que l'on pourrait trouver sous `vars` :
<div lang="en-US">
```yaml
http_port: 80
https_port: 443
```
</div>
### Utilisation
#### Modèles
Ces variables peuvent être utilisées pour remplir un emplacement de texte dans
un modèle. Ansible utilise [Jinja2](http://jinja.pocoo.org/) comme moteur de
template, un format très courant dans le milieu du développement Python.
<div lang="en-US">
```
I'm running {{ ansible_system }} {{ ansible_os_family }} on {{ ansible_system_vendor }},
with {{ ansible_memory_mb.swap.free }} MB Swap available.
```
</div>
Ce format est relativement générique. Ainsi, pour accéder aux éléments d'une
table de hash/dictionnaire, on utilise le caractère `.` ;
Les crochets `[x]` sont utilisés principalement pour accéder aux éléments des
tableaux :
```
My first nameserver is: {{ ansible_dns.nameservers[0] }}.
```
ou d'un dictionnaire lorsque la clef doit être récupérée d'une variable :
```
My disks are: {% for disk in ansible_device_links.uuids %}
- {{ disk }}: {{ ansible_device_links.uuids[disk] }}, {{ ansible_device_links.ids[disk]|join(', ') }}
{% endfor %}
```
Notez dans ce dernier exemple l'utilisation d'un filtre `join` permettant
d'aplatir la liste retournée.
#### Dans les recettes
Au sein même de votre description YAML, vous pouvez utiliser la puissance de
Jinja2 :
<div lang="en-US">
```yaml
- hosts: webservers
vars_files:
- /vars/webservers_common.yml
- /vars/webservers_{{ ansible_os_family }}.yml
```
</div>
Dans cet exemple, les variables des fichiers `/vars/webservers_common.yml`,
puis celles de `/vars/webservers_Debian.yml` seront chargées dans le contexte.
#### Conditions
Une autre utilisation possible des variables est d'appliquer ou de passer des
tâches. Par exemple :
<div lang="en-US">
```yaml
tasks:
- name: "pkg setup (Debian)"
apt: name=chrony state=present
when: ansible_os_family == "Debian"
- name: "pkg setup (CentOS)"
yum: name=chrony state=present
when: ansible_os_family == "CentOS"
```
</div>
Vous trouverez bien d'autres cas d'utilisation dans [la
documentation](http://docs.ansible.com/ansible/latest/playbooks_conditionals.html).