我有the following Ansible role,它只执行以下操作:
以下是我正在使用它的几个地方:
具体来说,这些剧本上传了一个名为goss.yml
的剧本旁边的本地文件和一个与剧本相邻的目录goss.d
。
不幸的是,似乎Ansible逻辑最近发生了变化,导致我的测试无法按预期工作。我的角色附带默认goss.yml
,当我在我的剧本中设置goss_file: goss.yml
时,它会上传degoss/files/goss.yml
而不是我的剧本旁边的高斯文件。
如果我将文件名传递给角色,有没有办法指定Ansible应该在playbook或当前工作目录的上下文中查找文件?
不再有效的实际角色逻辑是:
# deploy test files including the main and additional test files
- name: deploy test files
copy: src={{ item }} dest={{ degoss_test_root }} mode=0644 directory_mode=0755 setype=user_tmp_t
with_items: "{{ [goss_file] + goss_addtl_files + goss_addtl_dirs }}"
changed_when: degoss_changed_when
我在Ansible 2.3.2.0上,我可以在各个发行版(即CentOS 7,Ubuntu 14.04和Ubuntu 16.04)中重现这一点。
答案 0 :(得分:1)
Ansible首先在角色的范围内搜索相对路径,然后在playbook的范围内搜索。
例如,如果您要复制角色test.txt
中的文件r1
,搜索顺序为:
/path/to/playbook/roles/r1/files/test.txt
/path/to/playbook/roles/r1/test.txt
/path/to/playbook/roles/r1/tasks/files/test.txt
/path/to/playbook/roles/r1/tasks/test.txt
/path/to/playbook/files/test.txt
/path/to/playbook/test.txt
您可以通过search_path
调用ansible来检查您的ANSIBLE_DEBUG=1
订单。
要回答您的问题,您必须选择:
使用在角色范围内不存在的文件名。像:
goss_file: local_goss.yml
提供绝对路径。例如,您可以使用:
goss_file: '{{ playbook_dir }}/goss.yml'
如果路径是绝对的,Ansible不会应用搜索逻辑。