Ansible 命令任务遇到“Exec 格式错误”

Sad*_*nny 8 ansible

我编写了这个 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 }}"
Run Code Online (Sandbox Code Playgroud)

它适用于包含的 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"
Run Code Online (Sandbox Code Playgroud)

这个想法是在远程框上使用用户“myappname”(由“myappname_server”正确别名,我运行的其他播放效果很好)在将目录更改为“/”后运行“/home/myappname/bin/run”家/我的应用程序名称/bin”。如果我手动执行此操作,一切正常,即目录存在,文件可读,脚本工作等,一切都很好。但是如果我执行脚本,生成的ansible 执行代码似乎有问题。是我和我的配置希望如此)?它是 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   
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情:

  • 在目录后玩斜线
  • 在远程机器上使用相对和绝对路径
  • 在我的任务中使用和不使用 sudo 和 sudo_user

我知道我使用的所有其他 ansible 模块与来自某些相邻剧本的同一批变量一起工作得很好。还有内置的东西,比如组、用户、文件、apt、取消归档、复制。请注意,其中许多还要求组/用户的内容是正确的,所以我知道这也很好。

/编辑:我也知道运行脚本的路径是正确的,因为如果我重命名运行脚本并运行剧本,我会收到另一个错误(“msg:[Errno 2]没有这样的文件或目录”,正如预期的那样) . 所以它实际上是在尝试运行现有的运行脚本,但失败了。

但似乎没有任何效果。发生了什么,最后一段生成的 EXEC 东西有什么问题?谢谢你的时间。

the*_*ude 13

如果您尝试运行的是 shell 脚本,请检查:


use*_*686 0

“Exec 格式错误”简单来说意味着您试图执行一个内核无法识别为有效程序的文件 - 它的格式不合适。在这种情况下,这似乎适用于rm目标服务器。

直接 SSH 到服务器并验证是否rm有效;用于file $(which rm)检查其格式(与其他工具(如)进行比较mkdir)。以防万一,也做同样的/usr/bin/python事情。也许它是从不同的体系结构系统复制的,或者从不同的操作系统复制的,或者完全充满了垃圾。