按Playbook目录解析本地文件?

时间:2017-09-06 02:46:23

标签: ansible

我有the following Ansible role,它只执行以下操作:

  1. 创建一个临时目录。
  2. 将Goss(一种服务器测试工具)下载到该临时目录中。
  3. 上传主Goss YAML文件进行测试。
  4. 上传其他目录以进行其他测试。
  5. 以下是我正在使用它的几个地方:

    具体来说,这些剧本上传了一个名为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)中重现这一点。

1 个答案:

答案 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订单。

要回答您的问题,您必须选择:

  1. 使用在角色范围内不存在的文件名。像:

    goss_file: local_goss.yml
    
  2. 提供绝对路径。例如,您可以使用:

    goss_file: '{{ playbook_dir }}/goss.yml'
    
  3. 如果路径是绝对的,Ansible不会应用搜索逻辑。