Ansible 指令任務遇到“Exec 格式錯誤”

Ansible 指令任務遇到“Exec 格式錯誤”

我編寫了這個 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 行中的內容而給出了錯誤

相關內容