Я хотел запустить команду в оболочке (в основном через доступную книгу воспроизведения), условие заключается в том, что если статус 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