Ansible Aufgabe, um zu bestätigen, ob ein Prozess ausgeführt wird

10

Ansible 2.1

Im Playbook habe ich einen Prozess gestartet:

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

Aus der Zusammenfassung des Spiels geht hervor, dass der Prozess erfolgreich gestartet wurde.

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

Wenn Sie sich jedoch beim Remote-Host anmelden und a ausführen ps, wird der Prozess nicht ausgeführt. Bei der Überprüfung des Prozessprotokolls ist eine der erforderlichen Voraussetzungen (beabsichtigt) fehlgeschlagen.

Wie schreibe ich eine Aufgabe in ein Playbook, um zu bestätigen, dass der Prozess erfolgreich gestartet wurde?

Howard Lee
quelle

Antworten:

12

Sie können mit dem failedJinja2-Filter überprüfen , nachdem Sie Ihren Befehl ausgeführt haben, der überprüft, ob der Prozess ausgeführt wird.

Hier ist ein Beispiel, das anhand der Ausgabe des Befehls systemctl status apache2entscheidet, ob Apache ausgeführt wird:

- 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

Wenn der Befehl der ersten Aufgabe fehlgeschlagen ist, schlägt die zweite Aufgabe fehl und zeigt an, warum die erste Aufgabe fehlgeschlagen ist.
Der Rückkehrcode wird in gespeichert service_apache_status.rc.

Beispielausgabe eines Fehlers:

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)

Hier ist eine andere (wenn auch möglicherweise weniger zuverlässige) Methode, um pgrepzu überprüfen, ob der Prozess ausgeführt wird:

- 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
quelle
Wie when: service_apache_status | failedfunktioniert das Sucht es nach einem failedToken in service_apache_status?
Howard Lee
2
@HowardLee: Ich glaube, es überprüft den Rückkehrcode, und wenn dies nicht der Fall ist 0, wird dies berücksichtigt failed.
Deltik
1
anstelle von ps | grep du könntest es versuchenpgrep apache2
madeddie
@madeddie: Ich mag es. Antwort aktualisiert, um vorzuschlagen pgrep!
Deltik
4

Das mache ich jetzt:

- 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_whenwird in 1.4 eingeführt. changed_when: Falsewird verwendet, um den Änderungsstatus zu unterdrücken. Lesen Sie mehr .

Howard Lee
quelle