关于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"
}

预测的结论

    1. 首先,可以通过vars.<定义名>引用已定义的变量

 

    1. 另外,只要使用<定义名>也可以进行引用

 

    但是,如果定义名中包含vars,就无法使用第二种方法,因为会与Ansible内部使用的变量名重叠。

所以我必须引用vars.vars.var1!

bannerAds