簡體   English   中英

使用pgrep的Ansible shell任務保持失敗,在普通shell中工作

[英]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中使用scriptcommand模塊而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM