关于Ansible变量引用的方式,假设变量名为”vars”
当引用的变量被定义时,请参阅如下所示。
vars:
var1: hogehoge
vars.var1 → 答案错误
$ ansible -m debug -a "var=vars.var1" -e "@varfile1.yml" localhost
localhost | SUCCESS => {
"vars.var1": "VARIABLE IS NOT DEFINED!"
}
var1的变量 → 正确解答
$ ansible -m debug -a "var=vars.vars.var1" -e "@varfile1.yml" localhost
localhost | SUCCESS => {
"vars.vars.var1": "hogehoge"
}
为什么?
我試著去研究一下。
环境
environmentversionPython3.8.0Ansible2.9.3
可以查看一下vars
$ ansible -m debug -a "var=vars" -e "@varfile1.yml" localhost
localhost | SUCCESS => {
"vars": {
"ansible_check_mode": false,
"ansible_connection": "local",
"ansible_dependent_role_names": [],
"ansible_diff_mode": false,
"ansible_facts": {},
...
"playbook_dir": "/Users/answer_d/work/20200208_vars_test",
"role_names": [],
"vars": {
"var1": "hogehoge"
}
}
}
-
- varsにはそもそもAnsibleが内部的に使う色々な値が入ってる
- 定義した変数も一緒に入ってる
如果变量名不是”vars”,会发生什么?
var1: fugafuga
$ ansible -m debug -a "var=vars" -e "@varfile2.yml" localhost
localhost | SUCCESS => {
"vars": {
"ansible_check_mode": false,
...
"var1": "fugafuga"
}
}
在这种情况下,可以通过var1或vars.var1进行引用。
$ ansible -m debug -a "var=var1" -e "@varfile2.yml" localhost
localhost | SUCCESS => {
"var1": "fugafuga"
}
$ ansible -m debug -a "var=vars.var1" -e "@varfile2.yml" localhost
localhost | SUCCESS => {
"vars.var1": "fugafuga"
}
预测的结论
-
- 首先,可以通过vars.<定义名>引用已定义的变量
-
- 另外,只要使用<定义名>也可以进行引用
- 但是,如果定义名中包含vars,就无法使用第二种方法,因为会与Ansible内部使用的变量名重叠。
所以我必须引用vars.vars.var1!