【问题标题】:Resolve Local Files by Playbook Directory?通过 Playbook 目录解析本地文件?
【发布时间】:2017-09-06 14:36:21
【问题描述】:

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

  1. 创建一个临时目录。
  2. 将服务器测试工具 Goss 下载到该临时目录中。
  3. 为测试上传一个主要的 Goss YAML 文件。
  4. 为其他包含的测试上传其他目录。

这是我使用它的几个地方:

具体来说,这些 playbook 会上传与 playbook 相邻的名为 goss.yml 的本地文件,以及与 playbook 相邻的目录 goss.d

不幸的是,最近 Ansible 逻辑似乎发生了变化,导致我的测试无法按预期工作。我的角色附带一个默认的goss.yml,似乎当我在我的剧本中设置goss_file: goss.yml 时,它会上传degoss/files/goss.yml,而不是与我的剧本相邻的Goss 文件。

如果我将文件名传递给角色,有没有办法指定 Ansible 应在剧本或当前工作目录的上下文中查找文件?

不再起作用的实际角色逻辑是这样的:

# 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)重现这一点。

【问题讨论】:

  • 在文件名前加上./?
  • 试过这个没用。

标签: ansible


【解决方案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

您可以通过 ANSIBLE_DEBUG=1 调用 ansible 来检查您的 search_path 订单。

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

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

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

    goss_file: '{{ playbook_dir }}/goss.yml'
    

如果路径是绝对路径,Ansible 不会应用搜索逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多