web-dev-qa-db-fra.com

Ansible tâche pour confirmer si un processus est en cours d'exécution

Ansible 2.1

Dans le livre de jeu, j'ai lancé un processus:

- name: Start Automation Agent, and enable start on boot
  service: name=mongodb-mms-automation-agent state=started enabled=yes

D'après le récapitulatif de la lecture, il semble que le processus ait démarré avec succès.

TASK [install : Start automation agent, and enable start on boot] **************
changed: [server1]

Cependant, lorsque vous vous connectez à l'hôte distant et effectuez une ps, le processus n'est pas en cours d'exécution. Vérification sur le journal de processus, il avait échoué un pré-requis (prévu).

Comment écrire une tâche dans un livre de jeu pour confirmer que le processus a démarré avec succès?

9
Howard Lee

Vous pouvez vérifier avec le filtre failed Jinja2 après avoir exécuté votre commande qui vérifie si le processus est en cours d'exécution.

Voici un exemple qui utilise le résultat de la commande systemctl status Apache2 pour décider si Apache est en cours d'exécution:

- name: Check if Apache is running
  command: systemctl status Apache2
  ignore_errors: yes
  changed_when: false
  register: service_Apache_status

- name: Report status of Apache
  fail:
    msg: |
      Service Apache2 is not running.
      Output of `systemctl status Apache2`:
      {{ service_Apache_status.stdout }}
      {{ service_Apache_status.stderr }}
  when: service_Apache_status | failed

Si la commande de la première tâche a échoué, la deuxième tâche échouera et montrera pourquoi la première tâche a échoué.
Le code de retour est stocké dans service_Apache_status.rc.

Exemple de sortie d'un échec:

TASK: [Check if Apache is running] *********************** 
failed: [localhost] => {"changed": false, "cmd": ["systemctl", "status", "Apache2"], "delta": "0:00:00.009379", "end": "2016-06-06 15:17:27.827172", "rc": 3, "start": "2016-06-06 15:17:27.817793", "stdout_lines": ["* Apache2.service", "   Loaded: not-found (Reason: No such file or directory)", "   Active: inactive (dead)"], "warnings": []}
stdout: * Apache2.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
...ignoring

TASK: [Report status of Apache] ***************************
failed: [localhost] => {"failed": true}
msg: Apache2 is not running
systemctl status Apache2 output:
* Apache2.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

Voici une méthode différente (mais peut-être moins fiable), utilisant pgrep, pour vérifier si le processus est en cours d'exécution:

- name: Check if Apache is running
  Shell: pgrep Apache2
  ignore_errors: yes
  changed_when: false
  register: service_Apache_status

- name: Report status of Apache
  fail:
    msg: |
      Service Apache2 is not running.
      Return code from `pgrep`:
      {{ service_Apache_status.rc }}
  when: service_Apache_status.rc != 0
10
Deltik

C'est ce que je fais maintenant:

- name: Confirm Automation Agent is running
  command: service mongodb-mms-automation-agent status
  register: agent_status
  failed_when: "'NOT' in agent_status.stdout"
  changed_when: False

failed_when est introduit dans 1.4. changed_when: False est utilisé pour supprimer le statut de modification. En savoir plus .

4
Howard Lee