当我使用此配置时,我有一个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
然后,有什么不同?对我来说,两者都是平等的?
答案 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_hostname
和ansible_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"]
这显然是你的意图。