[英]Ansible shell task with pgrep keeps failing, works in normal shell
我在ansible-2.0.1.0-2.el7.noarch
(但也試過1.9.4
)並且我正在嘗試運行這個劇本:
- hosts: all
remote_user: root
tasks:
- shell:
pgrep --full 'sleep' && pkill --full 'sleep' || true
但我得到了:
# ansible-playbook -i aaa.ini aaa.yaml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.122.100]
TASK [command] *****************************************************************
fatal: [192.168.122.100]: FAILED! => {"changed": true, "cmd": "pgrep --full 'sleep' && pkill --full 'sleep' || true", "delta": "0:00:00.158772", "end": "2016-05-05 00:33:49.072139", "failed": true, "rc": -15, "start": "2016-05-05 00:33:48.913367", "stderr": "", "stdout": "385", "stdout_lines": ["385"], "warnings": []}
NO MORE HOSTS LEFT *************************************************************
to retry, use: --limit @aaa.retry
PLAY RECAP *********************************************************************
192.168.122.100 : ok=1 changed=0 unreachable=0 failed=1
當我直接運行命令時,它可以工作:
host # ssh root@192.168.122.100
vm # pgrep --full 'sleep' && pkill --full 'sleep' || true
vm # echo $?
0
請問你對我做錯了什么?
按照@ Dag的回答更新 ,這對我來說是破譯的:
$ ansible localhost -m shell -a "pgrep --list-full -f process_that_does_not_exists"
localhost | SUCCESS | rc=0 >>
828 /usr/bin/python /usr/bin/ansible localhost -m shell -a pgrep --list-full -f process_that_does_not_exists
835 /usr/bin/python /usr/bin/ansible localhost -m shell -a pgrep --list-full -f process_that_does_not_exists
836 /usr/bin/python /usr/bin/ansible localhost -m shell -a pgrep --list-full -f process_that_does_not_exists
所以帶有&& pkill ...
的命令&& pkill ...
實際上是在殺死一些Ansible的進程。 看起來我必須添加一些過濾才能安全地工作。
從輸出中可以看出,命令返回-15。 這意味着該流程已終止。
如果我在localhost上執行你的命令,我實際上是在殺死我自己的ansible運行。
[dag@moria ~]$ ansible localhost -m shell -a 'pgrep -f 'sleep' && pkill -f 'sleep' || true'
Terminated
所以你從一個劇本中做同樣的事情,並且正在殺死Ansible的一部分進程,但不是太多,所以它可以正確地報告一些輸出和返回代碼。 (我實際上也在我自己的系統上殺死了主要的調用進程!)
我遇到了類似的問題,並通過將腳本放入.sh文件並執行sh xxx.sh
修復它。
只是抬頭,在ansible中使用script
或command
模塊而不是shell
的最佳做法可能是最好的做法: Notes - shell - 在節點中執行命令
Ansible的shell模塊運行腳本(或等效)
bash -c "your-whole-script-as-one-quoted-string"
因此,如果您的腳本包含pkill -f killpattern
它不僅會匹配您要殺死的進程,還會匹配運行pkill命令的shell進程 - 即ansible步驟本身。
要解決這個問題,你需要做這樣的事情:
for i in $(pgrep -f killpattern | grep -v -x $$) ; do kill $i ; done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.