Ansible 变量优先级哈希



Ansible 版本:2.0.0.2

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

我将重现真实情况,因此让我们考虑以下目录层次结构:

├── 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

这一点上,我希望在调试剧本运行期间,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"
    ]
}

我的错误在哪里?

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

  • 角色默认值
  • 库存变量
  • 库存group_vars
  • 库存host_vars
  • 剧本group_vars
  • 行动手册host_vars
  • 主机事实
  • 已注册的变量
  • set_facts
  • 玩变量
  • 玩vars_prompt
  • 播放vars_files
  • 角色和包含变量
  • 变量(仅适用于块中的任务(
  • 任务
  • 变量(仅适用于任务(
  • 额外的变量

角色变量优先于主机变量。

角色默认值需要存储在目录defaults 中。因此,只需将文件夹重命名vars defaults,您应该获得预期的行为。

最新更新