Tarea para confirmar si se está ejecutando un proceso

10

Ansible 2.1

En el libro de jugadas, comencé un proceso:

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

Desde el resumen del juego, parece que el proceso ha comenzado con éxito.

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

Sin embargo, cuando inicie sesión en el host remoto y haga un ps, el proceso no se está ejecutando. Comprobando en el registro del proceso, había fallado algún requisito previo (previsto).

¿Cómo escribo una tarea en un libro de jugadas para confirmar que el proceso ha comenzado con éxito?

Howard Lee
fuente

Respuestas:

12

Puede verificar con el failedfiltro Jinja2 después de ejecutar su comando que verifica si el proceso se está ejecutando.

Aquí hay un ejemplo que usa la salida del comando systemctl status apache2para decidir si Apache se está ejecutando:

- 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 falla el comando de la primera tarea, la segunda tarea fallará y mostrará por qué la primera tarea falló.
El código de retorno se almacena en service_apache_status.rc.

Ejemplo de salida de una falla:

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)

Aquí hay una manera diferente (aunque posiblemente menos confiable), usando pgrep, para verificar si el proceso se está ejecutando:

- 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
fuente
¿Cómo when: service_apache_status | failedfunciona? ¿Busca una failedficha service_apache_status?
Howard Lee
2
@HowardLee: Creo que verifica el código de retorno, y si no lo está 0, se considera failed.
Deltik
1
en lugar de ps | grep que podrías probarpgrep apache2
madeddie
@madeddie: me gusta. Respuesta actualizada para sugerir pgrep!
Deltik
4

Esto es lo que hago ahora:

- 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_whense introduce en 1.4. changed_when: Falsese usa para suprimir el cambio de estado. Leer más .

Howard Lee
fuente