Ansible变量优先散列

dav*_*ave 3 ansible ansible-playbook ansible-2.x

Ansible版本:2.0.0.2

我需要通过库存主机变量覆盖角色默认变量.据我所知读变量优先级:我应该在哪里放置变量?在Ansible Docs中,它是可能的,但也许它不是最佳实践,但不幸的是,有些主机必须调整一些默认配置参数.

我将重现真实案例,所以让我们考虑以下目录层次结构:

??? debug.yml
??? host_vars
?   ??? test.localdomain
??? inventory
?   ??? debug
??? roles
    ??? debug
        ??? tasks
        ?   ??? main.yml
        ??? vars
            ??? main.yml
Run Code Online (Sandbox Code Playgroud)

debug.yml是我们的playbook文件.

---
- name: debug
  hosts: debug
  roles:
    - debug
Run Code Online (Sandbox Code Playgroud)

host_vars/test.localdomain包含我想要优先于默认值的变量.

---
foo:
  bar:
    - hey
Run Code Online (Sandbox Code Playgroud)

库存/调试是我们将要使用的库存文件.

[debug]
test.localdomain
Run Code Online (Sandbox Code Playgroud)

roles/debug/tasks/main.yml打印出foo.bar变量.

---
- debug: msg="{{foo.bar}}"
Run Code Online (Sandbox Code Playgroud)

roles/debug/vars/main.yml包含默认角色变量.

---
foo:
  bar:
    - hello
    - world
Run Code Online (Sandbox Code Playgroud)

此时,我希望在调试playbook运行期间,foo.bar的值是[ "hey" ],但显然我错了:

> ansible-playbook debug.yml -i inventory/debug

PLAY [debug] **********************************

TASK [setup] **********************************
ok: [test.localdomain]

TASK [debug : debug] **************************
ok: [test.localdomain] => {
    "msg": [
        "hello", 
        "world"
    ]
}

PLAY RECAP *************************************
test.localdomain : ok=2    changed=0    unreachable=0    failed=0   
Run Code Online (Sandbox Code Playgroud)

从ansible cli 运行调试模块给了我预期的结果,所以我很确定主机变量被正确评估,但可能由于某种原因它们没有优先于默认角色变量.

> ansible test.localdomain -i inventory/debug -m debug -a 'msg="{{foo.bar}}"'
test.localdomain | SUCCESS => {
    "msg": [
        "hey"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?

udo*_*dan 11

问题是您没有使用角色默认变量,而是使用角色变量.再次查看文档列表:

  • 角色默认值
  • 库存变量
  • 库存group_vars
  • 库存host_vars
  • playbook group_vars
  • playbook host_vars
  • 主持人事实
  • 注册的变种
  • set_facts
  • 玩变种
  • 玩vars_prompt
  • 玩vars_files
  • 角色并包括变量
  • 阻止变量(仅适用于块中的任务)
  • 任务变量(仅适用于任务)
  • 额外的变种

role-vars优先于host-vars.

角色默认值需要存储在目录中defaults.因此,只需将文件夹重命名varsdefaults您就可以获得预期的行为.