Назад | Перейти на главную страницу

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

Я хотел запустить команду в оболочке (в основном через доступную книгу воспроизведения), условие заключается в том, что если статус ps дает ненулевой код выхода, ему необходимо запустить другую команду. Я не хотел разделять это на две задачи: одна для проверки статуса ps, а другая для выполнения команды. Можно ли объединить это в одну задачу вместо использования условия if / else?

ps -ef | grep -v grep | grep httpd

Если вышеприведенная команда завершается с ненулевым статусом, мне нужно запустить другую команду, указанную ниже. Как я могу объединить эти две команды как одну и включить это как одну задачу?

nohup /root/scripts/httpd.sh start &

Решение

Это делает то, что вы хотите:

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

НОТА: Я использую команду sleep 1000 в качестве замены для вашего процесса демона Apache, httpd.

Пример выполнения

$ cat pb.yml
- name: Hello Ansible - quick start
  hosts: all
  connection: local

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

Обратите внимание, что у нас нет ни спящего, ни httpd процесса:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
$

Теперь запускаем playbook:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Теперь у нас идет процесс сна:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34422     1   0  2:00AM ttys000    0:00.00 /bin/bash -c ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &
  501 34425 34422   0  2:00AM ttys000    0:00.00 sleep 1000

Теперь, если мы сбросим все и сделаем то же самое, но на этот раз откроем окно редактирования с именем файла httpd "подделать" grep [h]ttpd:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd

Запуск playbook на этот раз ничего не даст:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

По-прежнему только наше окно редактирования с открытым файлом httpd:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd