首页 > 解决方案 > 更改 Ansible 查找文件的位置

问题描述

我的目录结构看起来像这样

playbooks/
  Foo.yml
  tasks/
    Task1.yml
    Task2.yml
    AllTasks.yml

剧本Foo.yml有一个- import_tasks: tasks/AllTasks.yml任务。AllTasks.yml

- import_tasks: tasks/Task1.yml
- import_tasks: tasks/Task2.yml

当我执行 playbook 时,这工作得很好Foo.yml。但是当我执行位于其他地方的剧本时(所以不是直接在这个playbooks目录中),导入不再起作用。这样做的原因是它们相对于导入的 playbook 的位置导入。

使用其他模块的任务也会发生同样的情况,例如复制。他们寻找与剧本位置相关的文件。

有没有办法让我的任务适用于位于不同目录中的剧本?

我知道有一个playbook_dir变量很遗憾我无法覆盖。我也遇到过inventory_dir,但无论出于何种原因,没有定义一个。

一种引用与引用文件相关的文件的方法会起作用。例子:

- import_tasks: "{{ current_dir }}/Task1.yml"
- import_tasks: "{{ current_dir }}/Task2.yml"

与该项目的清单文件相关的东西也可以工作。例子:

- import_tasks: "{{ inventory_dir }}/playbooks/tasks/Task1.yml"
- import_tasks: "{{ inventory_dir }}/playbooks/tasks/Task2.yml"

后一种方法将迫使我在整个项目中添加这些路径。

标签: ansible

解决方案


问:很遗憾我无法覆盖 playbook_dir 变量

A:变量playbook_dir可以按预期工作(但在这种情况下不需要它;请参阅该行下的第二部分)

shell> cd /scratch/tmp
shell> cat Foo.yml
- hosts: localhost
  tasks:
    - import_tasks: "{{ playbook_dir }}/tasks/AllTasks.yml"
shell> cat tasks/AllTasks.yml
- import_tasks: "{{ playbook_dir }}/tasks/Task1.yml"
- import_tasks: "{{ playbook_dir }}/tasks/Task2.yml"
shell> cat tasks/Task1.yml 
- debug:
    msg: Task1.yml
shell> cat tasks/Task2.yml 
- debug:
    msg: Task2.yml
shell> cd /tmp
shell> pwd
/tmp
shell> ansible-playbook /scratch/tmp/Foo.yml

PLAY [localhost] ****

TASK [debug] ****
ok: [localhost] => {
    "msg": "Task1.yml"
}

TASK [debug] ****
ok: [localhost] => {
    "msg": "Task2.yml"
}

PLAY RECAP ****
localhost: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

问:更改 Ansible 查找文件的位置

答:无需更改。默认值工作正常。请参阅Ansible 中的搜索路径。下面的变量ansible_search_path的值解释了路径为何起作用

shell> cat Foo.yml
- hosts: localhost
  tasks:
    - debug:
        var: ansible_search_path
    - import_tasks: tasks/AllTasks.yml

shell> cat tasks/AllTasks.yml
- debug:
    var: ansible_search_path
- import_tasks: Task1.yml
- import_tasks: Task2.yml

shell> cat tasks/Task1.yml
- debug:
    msg: Task1.yml

shell> cat tasks/Task2.yml
- debug:
    msg: Task2.yml

    "ansible_search_path": [
        "/scratch/tmp"
    ]

    "ansible_search_path": [
        "/scratch/tmp/tasks",
        "/scratch/tmp"
    ]

    "msg": "Task1.yml"

    "msg": "Task2.yml"

推荐阅读