2016-02-12 134 views
1

如果没有明确表达,请随时提出建议或直接编辑我的问题。如何在Ansible中使用嵌套变量(字典键)?

我在Ansible宣布一些像这样的嵌套变量:

# vars/main.yml 
parent_key: 
    child_key1: "child_value1" 
    child_key2: "Resolving: {{ child_key1 }}" 

但Ansible说:child_key1 not defined或类似的东西。

然而,这也不起作用:

# vars/main.yml 
parent_key: 
    child_key1: "child_value1" 
    child_key2: "Resolving: {{ parent_key.child_key1 }}" 

Ansible说像Could not template ...

Ansible 1.9.4和Ansible 2.0.0.2的结果几乎相同。

如何在child_key2中使用child_key1的值,当它们都嵌套在parent_key下时?

注意,如果没有嵌套键相同的概念正常工作:

# vars/main.yml (without nesting at all) 
child_key1: "child_value1" 
child_key2: "Resolving: {{ child_key1 }}" 

回答

2

你不能。这确实在早期的Ansible版本中工作,但Ansible现在阻止了这一点。

问题是你试图引用一个对象,它在某种程度上是在被定义的过程中。

this bug report on Github有些用户正在讨论这个话题。


至于解决方案...两者的组合如何。像这样:

key1: &key1 "child_value1" 

parent_key: 
    child_key1: *key1 
    child_key2: "Resolving: {{ key1 }}" 

是的,这是丑陋的,但至少可以防止你重复的价值观。

+0

这很棒,适合我。我可以同情删除该功能的原因,所以这是一个很大的妥协。 – Neil

+0

你能解释一下在这种情况下'&'和'*'运算符是什么? – Neil

+0

这是一个锚点和对YAML一部分的锚点的引用。你可以玩它[这里](http://yaml-online-parser.appspot.com/?yaml=key1%3A+%26key1+%22child_value1%22%0A%0Aparent_key%3A%0A++child_key1%3A+* key1%0A ++ child_key2%3A +%22Resolving%3A +%7B%7B + key1 +%7D%7D%22&type = json),在右边你会看到Ansible解析YAML后得到的评估对象。 – udondan