我想将文件复制到远程节点,但前提是该文件存在。我将其复制到/tmp/webapps/partner.war
我的任务是:
- local_action: stat path="/tmp/webapps/{{ application }}.war"
register: war
- name: Copy warfile
copy: src=/tmp/webapps/{{ application }}.war dest=/tmp/deploy/{{ stage }}/{{ application }}.war
when: war.stat.exists == true
但 stat 总是告诉我,该文件不存在。如果我手动运行 stat,它会显示该文件存在。
结果:
TASK: [deploy | stat path="/tmp/webapps/{{ application }}.war"] ***************
<127.0.0.1> REMOTE_MODULE stat path="/tmp/webapps/partner.war"
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367 && echo $HOME/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367']
<127.0.0.1> PUT /tmp/tmpzrV_Ne TO /var/lib/awx/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367/stat
<127.0.0.1> EXEC ['/bin/sh', '-c', u'LANG=C LC_CTYPE=C /usr/bin/python /var/lib/awx/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367/stat; rm -rf /var/lib/awx/.ansible/tmp/ansible-tmp-1433920640.68-144173277081367/ >/dev/null 2>&1']
ok: [example.com -> 127.0.0.1] => {"changed": false, "stat": {"exists": false}}
我做错了什么? :/
答案1
Ansible 塔用途普鲁特它提供了一个很酷的界面来创建chroot
和类似的监狱。在Tower 文档他们指出:
3.5. 由于 PRoot 问题,Playbook 无法访问必要数据
当运行读取和写入某些禁止目录中信息的剧本时,用户可能会遇到 PRoot 问题。PRoot在 jail
ansible-playbook
内运行命令chroot
。在这种情况下,正在运行的剧本无法查看其他剧本或磁盘上的敏感数据,如果剧本希望访问该信息,就会出现问题。要微调 PRoot 的使用,可以设置某些变量:# Enable proot support for running jobs (playbook runs only). AWX_PROOT_ENABLED = False # Command/path to proot. AWX_PROOT_CMD = 'proot' # Additional paths to hide from jobs using proot. AWX_PROOT_HIDE_PATHS = [] # Additional paths to show for jobs using proot. AWX_PROOT_SHOW_PATHS = []
答案2
顺便说一句,我在尝试查找角色的“文件”目录中的文件时遇到了类似的问题(不涉及 Tower)。我通常会将它们引用为“../files/something”,但这对 local_action 统计数据不起作用。相反,这有效:
- name: check for optional config file
local_action: stat path={{ role_path }}/files/{{ inventory_hostname }}/some_file
register: optional_file
(所以我想这个故事的寓意是:使用本地文件的完整路径)
答案3
@ralph-bolton solution 建议的另一个 FWIW 解决方案。我的文件位于角色的“文件”文件夹中,并在变量中引用:
vars:
install_root_cert_pem: home-root-ca.crt
最终被找到并正确测试:
local_action: "stat path={{ role_path }}/files/{{ install_root_cert_pem }}"