Ansible 可变优先级哈希
Ansible Variable Precedence Hashes
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
inventory/debug 是我们要使用的库存文件。
[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 的 运行 debug module 给了我预期的结果,所以我很确定主机变量被正确评估,但也许由于某种原因它们'没有优先于默认角色变量。
> 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
- 角色并包含变量
- 块变量(仅适用于块中的任务)
- 任务变量(仅针对任务)
- 额外变量
角色变量优先于主机变量。
role defaults需要存放在目录defaults
中。因此,只需将文件夹 vars
重命名为 defaults
,您就应该得到预期的行为。
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
inventory/debug 是我们要使用的库存文件。
[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 的 运行 debug module 给了我预期的结果,所以我很确定主机变量被正确评估,但也许由于某种原因它们'没有优先于默认角色变量。
> 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
- 角色并包含变量
- 块变量(仅适用于块中的任务)
- 任务变量(仅针对任务)
- 额外变量
角色变量优先于主机变量。
role defaults需要存放在目录defaults
中。因此,只需将文件夹 vars
重命名为 defaults
,您就应该得到预期的行为。