Использование оператора if else внутри модуля оболочки в ansible playbook

Я пытаюсь запустить оператор if else внутри модуля оболочки в доступном playbook, но похоже, что мой оператор else не выполняется в любом случае.

- name:  verify application/database processes are not running
      shell: if ps -eaf | egrep 'apache|http'|grep -v grep > /dev/null echo 'process_running';else echo 'process_not_running';fi
      ignore_errors: false
      register: app_process_check

Пожалуйста, поправьте меня здесь .

1
задан 18 November 2020 в 08:59
3 ответа

Исправьте оператор if-then-else . Ключевое слово , затем отсутствует. Я добавил ps параметр -x , чтобы включить « процессы, у которых нет управляющего терминала » (которых обычно нет на веб-серверах). Приведенный ниже сценарий работает должным образом

#!/bin/sh
if ps -axef | egrep 'apache|http' | grep -v grep > /dev/null; then
    echo 'process_running'
else
    echo 'process_not_running'
fi

Затем используйте сценарий в Ansible. Вы можете использовать Литеральный блочный скаляр , чтобы улучшить читаемость кода. Например,

    - name:  verify application/database processes are not running
      shell: |
        if ps -axef | egrep 'apache|http' | grep -v grep > /dev/null; then
            echo 'process_running'
        else
            echo 'process_not_running'
        fi
      ignore_errors: false
      register: app_process_check
    - debug:
        var: app_process_check.stdout

дает, если Apache работает

  app_process_check.stdout: process_running

, иначе

  app_process_check.stdout: process_not_running
2
ответ дан 4 January 2021 в 08:24

Вместо использования команды: / shell: рассмотрите модуль ansible.builtin.service_facts:. страница ansible.docs для service_facts

С этой страницы:

- name: Populate service facts
  service_facts:

- debug:
    var: ansible_facts.services

Оттуда вы можете получить доступ к различным фактам о настроенных службах.

ansible_facts.services ['httpd'] или ansible_facts. services ['apache']

0
ответ дан 4 January 2021 в 08:24

Если вы хотите только убедиться, что служба запущена, вам не нужно проверять ее самостоятельно, Ansible может сделайте это за вас.

- name: ensure apache is started
  service:
    name: apache2
    state: started

Ansible запустит его, если он не запущен, и ничего не будет делать, если он уже запущен.

Если вам нужно проверить это по другой причине, вы можете выполнить проверку в доступе вместо оболочки :

- name: check if apache is running
  shell: ps -eaf
  register: running_processes
  changed_when: >
    ('apache' in running_processes.stdout) or 
    ('httpd' in running_processes.stdout)

Впоследствии вы можете использовать это с running_processes.changed (или переместить саму проверку в следующую задачу).

3
ответ дан 4 January 2021 в 08:24

Теги

Похожие вопросы