我编写了这个 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)
我试过这样的事情:
我知道我使用的所有其他 ansible 模块与来自某些相邻剧本的同一批变量一起工作得很好。还有内置的东西,比如组、用户、文件、apt、取消归档、复制。请注意,其中许多还要求组/用户的内容是正确的,所以我知道这也很好。
/编辑:我也知道运行脚本的路径是正确的,因为如果我重命名运行脚本并运行剧本,我会收到另一个错误(“msg:[Errno 2]没有这样的文件或目录”,正如预期的那样) . 所以它实际上是在尝试运行现有的运行脚本,但失败了。
但似乎没有任何效果。发生了什么,最后一段生成的 EXEC 东西有什么问题?谢谢你的时间。
the*_*ude 13
如果您尝试运行的是 shell 脚本,请检查:
它没有缺少顶部的shebang线,例如:
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)0755
)“Exec 格式错误”简单来说意味着您试图执行一个内核无法识别为有效程序的文件 - 它的格式不合适。在这种情况下,这似乎适用于rm
目标服务器。
直接 SSH 到服务器并验证是否rm
有效;用于file $(which rm)
检查其格式(与其他工具(如)进行比较mkdir
)。以防万一,也做同样的/usr/bin/python
事情。也许它是从不同的体系结构系统复制的,或者从不同的操作系统复制的,或者完全充满了垃圾。
归档时间: |
|
查看次数: |
17493 次 |
最近记录: |