我想在 shell 中运行一个命令(基本上通过 ansible playbook),条件是,如果 ps 状态给出非零退出代码,则需要运行另一个命令。我不想将其拆分为两个任务,一个用于检查 ps 状态,另一个用于执行命令。相反,使用 if/else 条件,可以将其合并为单个任务吗?
ps -ef | grep -v grep | grep httpd
如果上述命令以非零状态退出,则我需要触发下面给出的另一个命令。我如何将这两个命令合并为一个并将其作为单个任务包含?
nohup /root/scripts/httpd.sh start &
答案1
解决方案
这会实现你想要的效果:
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 &
请注意,我们既没有 sleep 进程,也没有 httpd 进程:
$ ps -eaf|grep -E "[s]leep|[h]ttpd"
$
现在我们运行剧本:
$ 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
这次运行剧本不会做任何事情:
$ 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