如何访问从cli传递的所有ansible extra-vars列表? (变量的变量)

时间:2015-12-22 11:20:18

标签: ansible ansible-playbook

我在使用变量变量方式从我的playbook访问extra-vars时遇到问题。 例如,我创建了一个包含内容的group_vars / mygroup.yml文件:

MYVAR=AAAA

然后我调用命令并传递extra-vars:     ansible-playbook -i test playbook.yml --extra-vars“MYVAR = BBB”

我需要从存在变量列表中获取MYVAR的实际值。我试着这样做:

- debug: var=hostvars[inventory_hostname]['MYVAR']

......我得到了

TASK: [test | debug var=AAA] *******************************
ok: [192.168.1.21] => {
    "var": {
        "AAA": "BBB"
    }
}

TASK: [test | debug var=hostvars[inventory_hostname]['AAA']] ***
ok: [192.168.1.21] => {
    "var": {
        "hostvars[inventory_hostname]['AAA']": "AAA"   // ← THIS IS THE PROBLEM
    }
}

如何获得从cli传递的AAA的实际值? 请不要直接使用名称来使用AAA,因为这是更复杂逻辑的一部分,当我有一个已注册变量列表而我不能使用它们的名字时。

hostvars[inventory_hostname][**item**] ← variable of variable

提前谢谢。

更新:也许Ansible已经支持这样的事情了?:

VARNAME: APP_ENV
APP_ENV: blabla
debug: var=${VARNAME} // blabla expected

更新2:问题解释github gist

3 个答案:

答案 0 :(得分:1)

TLDR; - debug: msg="{{ AAA|default(hostvars[inventory_hostname]['AAA']) }}"在定义时使用变量AAA,否则使用hostvar(groupvar)AAA

#./main.yml
---
- hosts: all
  gather_facts: false
  tasks:
    - debug: msg="{{ foo }}"
    - debug: msg="{{ hostvars[inventory_hostname]['foo'] }}"
    - debug: msg="{{ foo|default(hostvars[inventory_hostname]['foo']) }}"

#./inventory
[one]
localhost ansible_connection=local

#./group_vars/one
---
foo: "bar"

ansible-playbook -i inventory -e "foo=whatever" main.yml

PLAY [all] ********************************************************************

TASK: [debug msg="{{ foo }}"] *************************************************
ok: [localhost] => {
    "msg": "whatever"
}

TASK: [debug msg="{{ hostvars[inventory_hostname]['foo'] }}"] *****************
ok: [localhost] => {
    "msg": "bar"
}

TASK: [debug msg="{{ foo|default(hostvars[inventory_hostname]['foo']) }}"] ****
ok: [localhost] => {
    "msg": "whatever"
}

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

答案 1 :(得分:0)

命令行额外定义不是hostvars的一部分。

您可以通过{{ MYVAR }}

访问该内容
- debug: msg="{{ MYVAR }}"

答案 2 :(得分:0)

现在,在ansible 2.0发布后,the problem from gist example消失了:

ansible-playbook -i localhost.ini test.yml --extra-vars="AAA=BBB"
TASK [debug]     *****************
ok: [localhost] => (item=AAA) => {
    "item": "AAA",
    "msg": "BBB"
}

所以,就像@chrism said一样,这是一个错误。