我編寫了這個 ansible 任務來在遠端流浪盒上運行一個進程。 (嗯,實際上 ansible 檔案本身要長得多,但這是一個複製器僅有的運行啟動腳本。
---
- hosts: myappname_server
vars_files:
- install_myappname_vars.yaml
gather_facts: false
sudo: true
sudo_user: "{{ project_name }}"
tasks:
- name: Restart application
command: "{{ project_target_dir_env }}/run"
args:
chdir: "{{ project_target_dir_env }}"
它適用於包含的 vars 檔案中的這些 vars:
---
project_name: myappname
project_source_dir_files: files/myappname
project_source_dir_env: "{{ project_source_dir_files }}/environment_files"
project_target_root: /home/myappname
project_target_dir_env: "{{ project_target_root }}/bin"
這個想法是在遠端盒子上使用用戶“myappname”(由“myappname_server”正確別名,我運行的其他遊戲運行得很好)在將目錄更改為“/”後運行“/home/myappname/bin/run”主目錄/myappname/bin」。如果我手動執行此操作,則一切正常,即目錄存在,文件可讀,腳本工作等,一切都很好。但是如果我執行腳本,ansible執行程式碼的產生似乎出了問題。是我和我的配置希望如此)嗎?它是安可的嗎?
我用 -vvvv 運行它以獲得大量資訊:
monsterkill@monsterkill-ub-dt:~/playbooks$ ansible-playbook install_myappname_restart.yaml -vvvv
PLAY [myappname_server] **********************************************************
TASK: [Restart application] ***************************************************
<vagrant1> ESTABLISH CONNECTION FOR USER: vagrant
<vagrant1> REMOTE_MODULE command chdir=/home/myappname/bin /home/myappname/bin/run
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'mkdir -p /tmp/ansible-tmp-1422343063.07-259463565013754 && chmod a+rx /tmp/ansible-tmp-1422343063.07-259463565013754 && echo /tmp/ansible-tmp-1422343063.07-259463565013754'"]
<vagrant1> PUT /tmp/tmpBduhE7 TO /tmp/ansible-tmp-1422343063.07-259463565013754/command
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'chmod a+r /tmp/ansible-tmp-1422343063.07-259463565013754/command'"]
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', u'/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via ansible, key=ucmsbsauynfzeeyxwdmgfduwovdneeqg] password: " -u myappname /bin/sh -c \'"\'"\'echo SUDO-SUCCESS-ucmsbsauynfzeeyxwdmgfduwovdneeqg; /usr/bin/python /tmp/ansible-tmp-1422343063.07-259463565013754/command\'"\'"\'\'']
<vagrant1> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/home/monsterkill/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'IdentityFile=/home/monsterkill/insecure_private_key', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', 'vagrant1', "/bin/sh -c 'rm -rf /tmp/ansible-tmp-1422343063.07-259463565013754/ >/dev/null 2>&1'"]
failed: [vagrant1] => {"cmd": ["/home/myappname/bin/run"], "failed": true, "rc": 8}
msg: [Errno 8] Exec format error
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/monsterkill/install_myappname_restart.yaml.retry
vagrant1 : ok=0 changed=0 unreachable=0 failed=1
我嘗試過類似的事情:
- 在目錄後面使用斜杠
- 與遠端電腦上的相對和絕對路徑一起使用
- 在我的任務中使用或不使用 sudo 和 sudo_user
我知道我使用的所有其他 ansible 模組與來自一些相鄰劇本的相同一堆變數都運作得很好。還有內建的東西,如群組、使用者、檔案、apt、取消存檔、複製。請注意,其中許多也要求群組/使用者內容正確,所以我知道這也很好。
/edit:我也知道運行腳本的路徑是正確的,因為如果我重命名運行腳本並運行劇本,我會收到另一個錯誤(“msg:[Errno 2]沒有這樣的文件或目錄”,如預期) 。所以它實際上嘗試運行現有的運行腳本,但失敗了。
但似乎沒有任何作用。發生了什麼事,最後產生的 EXEC 內容有什麼問題?謝謝你的時間。
答案1
如果您嘗試執行的是 shell 腳本,請檢查:
它沒有缺少頂部的 shebang 線,例如:
#!/usr/bin/env bash
- 使用者 ansible 將以其執行權限運作(例如 mode
0755
)
答案2
一般來說,ansible 中的「exec 格式錯誤」可能意味著:
- 從字面上看,您給 ansible 執行的程式不是可執行檔。
- ansible 發現一個標記為可執行檔的文件,該文件實際上並不是可執行的,並嘗試執行它。
換句話說:它幾乎總是意味著權限不正確,但它可能在兩個方向上發生(特權不足或特權過高的檔案可能會以不同的方式導致執行錯誤)。
就我個人而言,我發現當我在某些目錄上執行“chmod 777 /etc/ansible/facts/..”之類的操作時,會出現這樣的錯誤。
答案3
「Exec 格式錯誤」簡單來說意味著您試圖執行一個核心無法識別為有效程式的檔案 - 它的格式不合適。在這種情況下,這似乎適用於rm
目標伺服器。
直接 SSH 到伺服器並驗證是否rm
有效;用於file $(which rm)
檢查其格式(與其他工具(如mkdir
)進行比較)。/usr/bin/python
以防萬一,也做同樣的事情。也許它是從不同的體系結構系統複製的,或者從不同的作業系統複製的,或者完全充滿了垃圾。
答案4
檢查其
#!/usr/bin/env bash
位於 1 行。就我而言,ansible 由於第 2 行中的內容而給出了錯誤