Tâche impossible pour confirmer si un processus est en cours d'exécution

10

Ansible 2.1

Dans le playbook, j'ai commencé un processus:

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

D'après la récapitulation 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é certains pré-requis (prévu).

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

Howard Lee
la source

Réponses:

12

Vous pouvez vérifier avec le failedfiltre 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 la sortie de la commande systemctl status apache2pour 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 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 manière différente (mais peut-être moins fiable) d'utiliser 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
Deltik
la source
Comment ça when: service_apache_status | failedmarche? Cherche-t-il un failedjeton service_apache_status?
Howard Lee
2
@HowardLee: Je crois qu'il vérifie le code retour, et si ce n'est pas le cas 0, il est pris en compte failed.
Deltik
1
au lieu de ps | grep vous pourriez essayerpgrep apache2
madeddie
@madeddie: J'aime ça. Réponse mise à jour pour suggérer pgrep!
Deltik
4

Voici 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_whenest introduit en 1.4. changed_when: Falseest utilisé pour supprimer le changement d'état. Lisez plus .

Howard Lee
la source