Ansible 变量优先级哈希

标签 ansible ansible-playbook ansible-2.x

Ansible 版本:2.0.0.2

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

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

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

调试.yml 是我们的剧本文件。
---
- name: debug
  hosts: debug
  roles:
    - debug

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

库存/调试 是我们要使用的库存文件。
[debug]
test.localdomain

角色/调试/任务/main.yml 打印出 foo.bar 多变的。
---
- debug: msg="{{foo.bar}}"

角色/调试/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"
    ]
}

我的错误在哪里?

最佳答案

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

  • 角色默认值
  • 库存变量
  • 库存组变量
  • 库存主机变量
  • 剧本 group_vars
  • 剧本 host_vars
  • 主办事实
  • 注册变量
  • 设置事实
  • 玩 vars
  • 播放 vars_prompt
  • 播放 vars_files
  • 角色和包含变量
  • block 变量(仅适用于 block 中的任务)
  • 任务变量(仅用于任务)
  • 额外变量

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

    role defaults需要存放在目录defaults .因此,只需重命名您的文件夹 varsdefaults你应该得到你预期的行为。

    关于Ansible 变量优先级哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35365133/

    相关文章:

    python - 如何使用 Ansible 在服务器上安装 Python 版本

    ansible - 在ansible中获取Caller Playbook目录名

    ansible - ansible host_vars 如何工作?

    ansible - 如何在 Ansible 中打破 `with_lines` 循环?

    Ansible:对任务失败执行清理

    Ansible/Jinja2 如何将 key 附加到字典列表中

    ansible - ansible 如何在命名空间中搜索模块?

    ansible - 错误!在 Ansible Controller 上找不到 vars 文件 vars

    Ansible 获取 list 主机组的主机名和 IP

    json - 通过将 dict2items 和 JMESPath 与 ansible 结合,从复杂的 json 查询键