Aller au contenu principal

Les modules Ansible pour les services

· 4 minutes de lecture
Stéphane ROBERT

logo ansible

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 les stop et start
  • state : l'action sur le service : started, stopped, restarted ou reloaded (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.