Ansible变量优先散列

时间:2016-02-12 14:33:00

标签: ansible ansible-playbook ansible-2.x

Ansible版本:2.0.0.2

我需要通过库存主机变量覆盖角色默认变量。据我所知,在Ansible Docs中阅读Variable Precedence: Where Should I Put A Variable?,这是可能的,但也许这可能不是最佳做法,但不幸的是,有些主机必须调整一些默认配置参数。

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

├── debug.yml
├── host_vars
│   └── test.localdomain
├── inventory
│   └── debug
└── roles
    └── debug
        ├── tasks
        │   └── main.yml
        └── vars
            └── main.yml

debug.yml 是我们的剧本文件。

---
- name: debug
  hosts: debug
  roles:
    - debug

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

---
foo:
  bar:
    - hey

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

[debug]
test.localdomain

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

---
- debug: msg="{{foo.bar}}"

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

---
foo:
  bar:
    - hello
    - world

此时,我希望在调试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   

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

> ansible test.localdomain -i inventory/debug -m debug -a 'msg="{{foo.bar}}"'
test.localdomain | SUCCESS => {
    "msg": [
        "hey"
    ]
}

我的错误在哪里?

1 个答案:

答案 0 :(得分:11)

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

  • 角色默认
  • 库存变量
  • inventory group_vars
  • 广告资源host_vars
  • playbook group_vars
  • playbook host_vars
  • 主持人事实
  • 已注册的vars
  • set_facts
  • 玩变种
  • play vars_prompt
  • play vars_files
  • 角色和包含广告
  • 阻止变量(仅适用于块中的任务)
  • 任务变量(仅适用于任务)
  • 额外的vars

role-vars优先于host-vars。

role defaults需要存储在目录defaults中。因此,只需将文件夹vars重命名为defaults即可获得预期的行为。