Aller au contenu principal

Les modules Ansible pour les services

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.