使用数组样式检查主机属性时出现Ansible错误

时间:2014-10-27 19:00:29

标签: ansible ansible-playbook

当我使用此配置时,我有一个site.yml playbook:

- hosts: target
  tags:
    - setup_target
  tasks:
    - name: See some data
      debug: msg={{ hostvars[inventory_hostname][ansible_lsb].codename }}

Ansible报告错误:

PLAY [target] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [target]

TASK: [See some data] ********************************************************* 
fatal: [target] => One or more undefined variables: dict object has no element {u'release': u'14.04', u'major_release': u'14', u'codename': u'trusty', u'id': u'Ubuntu', u'description': u'Ubuntu 14.04.1 LTS'}

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/robe/site.retry

target                     : ok=1    changed=0    unreachable=1    failed=0  

但如果我使用点样式,就像这样:

---
# The main playbook to deploy

# setup our database
- hosts: target
  tags:
    - setup_target
  tasks:
    - name: See some data
      debug: msg={{ hostvars[inventory_hostname].ansible_lsb.codename }}

输出正常:

PLAY [target] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [target]

TASK: [See some data] ********************************************************* 
ok: [target] => {
    "msg": "trusty"
}

PLAY RECAP ******************************************************************** 
target                     : ok=2    changed=0    unreachable=0    failed=0 

然后,有什么不同?对我来说,两者都是平等的?

1 个答案:

答案 0 :(得分:4)

  

然后,有什么不同?对我来说,两者都是平等的?

这取决于dicts / hashes如何在Python中运行 - 以及扩展,它们如何在jinja2和Ansible中工作。

如果您有一个名为data的词典并且您想要foo元素的值,则可以像这样访问它:

data["foo"]

如果省略引号,则需要一个名为foo的变量。

data[foo] # does not work (so far)

jinja2还允许你使用点样式:

data.foo

让我们假装“foo”元素的值是数字42.这些都是真的:

data["foo"] = 42
data[foo] # does not work
data.foo = 42

现在,如果你有一个名为foo的变量怎么办?在下面的例子中,我们将把关键'foo'的值仍然是42,而'bar'将是13。

foo = "bar"
data["foo"] = 42
data[bar] = 13
data.foo = 42

要将其转换为原始案例,请注意inventory_hostnameansible_lsb都是变量,而不是字符串。更令人困惑的是,ansible_lsb是一本字典。这意味着你原来的方括号样式扩展如下:

hostvars["inventory_hostname"][{u'release': u'14.04', u'major_release': u'14', u'codename': u'trusty', u'id': u'Ubuntu', u'description': u'Ubuntu 14.04.1 LTS'}]["codename"]

糟糕。作为词典的关键词的dict进入递归的同类相食龟。

这就是你的“点缀”风格。

hostvars["inventory_hostname"]["ansible_lsb"]["codename"]

也可以稍微翻译一下,以使其更加清晰:

lsb = hostvars["inventory_hostname"]["ansible_lsb"]
lsb["codename"]

这显然是你的意图。