2016-08-04 106 views
2

我想在使用Ansible的主機上調用Perl腳本。 Perl腳本必須由特定用戶「PresenceUser」執行。我看到的是,雖然Ansible報告沒有錯誤腳本未能執行和/或完成作業。Ansible shell和perl腳本失敗

我已經添加到執行此操作的任務是這樣的。

- name: Extract out Presence Collector application [Failing] 
    shell: perl extract.pl PresenceCollector_{{ app_version }}.tbz 
    become_user: PresenceUser 
    args: 
    chdir: "{{ app_path }}" 
    tags: 
    - application_install 
    register: result 

- debug: var=result.stdout_lines 
    tags: 
    - application_install 

從Ansible結果表明該

TASK [presencecollector : Extract out Presence Collector application [Failing]] 
    task path: /home/vagrant/ansible/roles/presencecollector/tasks/main.yml:171 
    <10.157.7.30> ESTABLISH SSH CONNECTION FOR USER: ipasupport 
    <10.157.7.30> SSH: EXEC ssh -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 10.157.7.30 '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo /tmp/ansible-tmp-1470308291.94-99052579867678 `" && echo ansible-tmp-1470308291.94-99052579867678="` echo /tmp/ansible-tmp-1470308291.94-99052579867678 `") && sleep 0'"'"'' 
    <10.157.7.30> PUT /tmp/tmptI8322 TO /tmp/ansible-tmp-1470308291.94-99052579867678/command 
    <10.157.7.30> SSH: EXEC sftp -b - -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 '[10.157.7.30]' 
    <10.157.7.30> ESTABLISH SSH CONNECTION FOR USER: ipasupport 
    <10.157.7.30> SSH: EXEC ssh -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 10.157.7.30 '/bin/sh -c '"'"'chown -R PresenceUser /tmp/ansible-tmp-1470308291.94-99052579867678/ && sleep 0'"'"'' 
    <10.157.7.30> ESTABLISH SSH CONNECTION FOR USER: ipasupport 
    <10.157.7.30> SSH: EXEC ssh -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 10.157.7.30 '/bin/sh -c '"'"'setfacl -R -m u:PresenceUser:rX /tmp/ansible-tmp-1470308291.94-99052579867678/ && sleep 0'"'"'' 
    <10.157.7.30> ESTABLISH SSH CONNECTION FOR USER: ipasupport 
    <10.157.7.30> SSH: EXEC ssh -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 -tt 10.157.7.30 '/bin/sh -c '"'"'sudo -H -S -p "[sudo via ansible, key=npvufcaonbexvxpysfwyugmowdjszfvb] password: " -u PresenceUser /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-npvufcaonbexvxpysfwyugmowdjszfvb; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /tmp/ansible-tmp-1470308291.94-99052579867678/command'"'"'"'"'"'"'"'"' && sleep 0'"'"'' 
    <10.157.7.30> ESTABLISH SSH CONNECTION FOR USER: ipasupport 
    <10.157.7.30> SSH: EXEC ssh -C -vvv -F ssh.cfg -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ipasupport -o ConnectTimeout=30 10.157.7.30 '/bin/sh -c '"'"'rm -f -r /tmp/ansible-tmp-1470308291.94-99052579867678/ > /dev/null 2>&1 && sleep 0'"'"'' 
changed: [pres7] => {"changed": true, "cmd": "perl extract.pl PresenceCollector_1.0_PC_529.tbz", "delta": "0:00:00.095483", "end": "2016-08-04 11:30:09.972859", "invocation": {"module_args": {"_raw_params": "perl extract.pl PresenceCollector_1.0_PC_529.tbz", "_uses_shell": true, "chdir": "/home/PresenceUser/1.0_PC_22.0/", "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2016-08-04 11:30:09.877376", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []} 

調試輸出顯示什麼都沒有。

TASK [presencecollector : debug] *********************************************** 
task path: /home/vagrant/ansible/roles/presencecollector/tasks/main.yml:180 
ok: [pres7] => { 
    "result.stdout_lines": [] 
} 

如果我以PresenceUser身份登錄到該主機,則可以成功手動執行該命令。

我試着用Ansible「command」模塊,並得到了相同的結果。

我注意到的一點是,即使我指定了「shell」模塊,它表明模塊名稱是「command」?

有沒有一種方法可以進一步調試Ansible試圖執行命令時發生了什麼。

+0

我試過的一件事是看到,如果我在shell模塊中運行'perl -c extract.pl'命令並獲得結果。奇怪的Perl檢查完成,但我看到「extract.pl synxtax OK」在stderr?我猜這個問題是在Perl腳本本身中的:-( –

+0

嘗試在'args'之後放置'become_user'我不確定Ansible是否會在shell命令中應用'args:chdir',如果它沒有直接定義 –

+0

字典中列出的鍵的順序是不相關的,YAML在被Ansible處理之前被解析成一個Python字典,所以你不能控制鍵的順序 – larsks

回答

0

嘗試引用傳遞給shell模塊的整個值並將stderror重定向到stdout。例如:

- name: Extract out Presence Collector application 
    shell: "perl extract.pl PresenceCollector_{{ app_version }}.tbz 2>&1" 
    become_user: PresenceUser 
    args: 
    chdir: "{{ app_path }}" 
    tags: 
    - application_install 
    register: result 
+0

我嘗試了不帶引號和單/雙 - 同樣的結果。我同意這個命令更合適。我決定改用shell來查看它是否會改變事情。 –

+0

好的,也許你的腳本只輸出到stderr而不是stdout?你可以嘗試在命令行末尾添加2>&1嗎? (這將需要外殼模塊) – Filipe