Les modules Ansible pour les services
Lors de configuration de stack complète avec Ansible on se doit de gérer les services. Pour cela nous avons à notre disposition deux modules Ansible : service et service_facts. Le premier permet de configurer et le second de récolter des informations sur les services Linux/UNIX. Ces modules prennent en charge les systèmes d'initialisation Linux/Unix tels que systemd, BSD init, OpenRC, SysV, Solaris SMF, systemd et upstart.
Gérer les services avec le module service
Le module service comporte un certain nombre de paramètres dont les plus courant sont :
- name : le nom du service
- enabled : défini si le service doit démarrer au boot de la machine
- pattern : si la commande d'état ne fonctionne pas, ce paramètre permet de définir si un service est opérationnel ou pas
- sleep : lors de l'action
restarted
définit la tempo entre lesstop
etstart
- state : l'action sur le service :
started
,stopped
,restarted
oureloaded
(en cas de modification sur un fichier de configuration)
Un exemple de playbook permettant d'installer et de configurer nginx (simplifié) :
---
- name: gérer des services
hosts: all
become: true
tasks:
- name: Installation de nginx
package:
- name:
- nginx
- name: configuration de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
- name: Rechargement de la conf
service:
name: nginx
state: reloaded
- name: Verification nginx est démarré
service:
name: nginx
state: started
enabled: true
C'est un excellent point départ mais cela veut dire que notre playbook rechargera toujours le service nginx, même si la configuration n'a pas changé. Un moyen d'éviter cela est d'utiliser des handlers que j'ai documenté dans ce billet.
Utilisation des handlers pour affiner la gestion des services
Pour rappel un handler permet de lancer une action si une tache à apporté une modification au système (status changed).
Notre playbook devient donc :
---
- name: gérer des services
hosts: all
become: true
tasks:
- name: configuration de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify:
- reload nginx
- name: Verification nginx est démarré
service:
name: nginx
state: started
enabled: true
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
Comme pour le module package il existe des modules propre à chaque type de système d'initialisation qui comporte plus d'options:
Obtenir des informations sur un service : service_facts
Ansible met à disposition un module service_facts
permettant d'obtenir tout
plein d'infos sur un service.
Ce module ne prend aucun paramètre. Par contre il exige que les gather_facts ne soient pas désactivé!
Par exemple nous aimerions ouvrir les ports 80 et 443 que si le service firewall est actif. Notre playbook devient :
---
- name: gérer des services
hosts: all
become: true
tasks:
- name: configuration de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify:
- reload nginx
- name: Obtient les infos d'un service
service_facts:
- name: debug
debug:
var: ansible_facts.services["firewalld.service"]
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
Les services sont ajoutés à la variable ansible_facts
et contient la liste de
tous les services installés sur la machine. Donc si vous voulez accéder au
service firewalld, il faudra indiquer
ansible_facts.services["firewalld.service"]
.
TASK [debug] **********************************************************************************************
ok: [host1] => {
"firewalld.service": {
"name": "firewalld.service",
"source": "systemd",
"state": "running",
"status": "enabled"
}
}
On pourrait par exemple ajouter une tache qui ne se lance que si le service
firewalld est son status enabled
---
- name: gérer des services
hosts: all
become: true
tasks:
- name: configuration de nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify:
- reload nginx
- name: Obtient les infos d'un service
service_facts:
- name: autorise le flux https
ansible.posix.firewalld:
service: https
permanent: yes
state: enabled
when: ansible_facts.services["firewalld.service"].status == "enabled"
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
Si le service firewalld est désactivé alors sa configuration est skippé :
TASK [autorise le flux https] *****************************************************************************
skipping: [host1]
Il existe plein de cas d'usage de ce module qui simplifie l'écriture de playbook et les rends plus résiliant.
Voila pour aujourd'hui. Si vous voulez plus d'exemples d'utilisation d'Ansible je vous renvoie à mon introduction Ansible où la liste complète de tous les billets sur Ansible s'y trouve.