Variables Playboook中的Ansible集合\事实嵌套变量
我对这个问题已经研究了一段时间,找不到解决办法 我的剧本是:Variables Playboook中的Ansible集合\事实嵌套变量,variables,ansible,nested,set,fact,Variables,Ansible,Nested,Set,Fact,我对这个问题已经研究了一段时间,找不到解决办法 我的剧本是: -hosts:localhost 连接:本地 收集事实:错误 变量: vpc_堆栈_名称:“vpc-CF” 任务: -名称:获取有关堆栈的摘要信息 amazon.aws.cloudformation\u信息: 堆栈\u名称:“{{vpc\u堆栈\u名称}” 寄存器:vpc\u堆栈\u事实 -调试: var:“vpc_stack_facts.cloudformation['{{vpc_stack_name}}}].stack_输出['V
-hosts:localhost
连接:本地
收集事实:错误
变量:
vpc_堆栈_名称:“vpc-CF”
任务:
-名称:获取有关堆栈的摘要信息
amazon.aws.cloudformation\u信息:
堆栈\u名称:“{{vpc\u堆栈\u名称}”
寄存器:vpc\u堆栈\u事实
-调试:
var:“vpc_stack_facts.cloudformation['{{vpc_stack_name}}}].stack_输出['VPCID']”
-设定事实:
temp:{{vpc_stack_facts.cloudformation['{vpc_stack_name}}].stack_输出['VPCID']}”
我知道嵌入的{{vpc\u stack\u name}}
是错误的,是不允许的,但我不知道如何绕过它
我还没有掌握Ansible查找功能
提前谢谢你 如您所述,在Jinja上下文中使用Jinja表达式
{{vpc_stack_name}}
是不正确的。Ansible将尝试计算没有引号作为变量的任何文本。因此,您可以保持vpc\u stack\u name
变量的原样:[vpc\u stack\u name]
例如:
vars:
vpc_堆栈_名称:vpc-CF
任务:
-云信息:
堆栈\u名称:“{{vpc\u堆栈\u名称}”
寄存器:vpc\u堆栈\u事实
-设定事实:
临时变量:{{vpc_stack_facts['cloudformation'][vpc_stack_name | quote]['stack_outputs']['vpc']}”
-调试:
变量:临时变量
注意:在上面的示例中,我使用键asVPC
获取VPC ID作为输出
- 使用
符号代替点['']
访问dict项 - 已使用
围绕变量| quote
vpc_stack_name
ok: [localhost] => {
"temp_var": "vpc-1234ab5678c90d1e"
}
当您正在为
var
属性重建var名称时,debug
看起来正常。对于你的set_fact
你不能嵌套jinja2标记,只需使用保存相应值的var名称=>“{{vpc_stack_facts.cloudformation[vpc_stack_name].stack_outputs['VPCID']}”
。OP当前用于debug:var
的表达式是完全正确的(尽管我建议在本例中使用msg
,但不应引发错误。删除点符号只需要使用包含“特殊”字符(空格、破折号等)的变量或文字键名,而堆栈输出不需要它(尽管您完全可以选择)。”{{vpc_stack_facts.cloudformation[vpc_stack_name].stack_outputs.VPCID}“
将同时适用于set_fact
或debug:msg
是的问题是在Jinja上下文中为debug:msg
或set_fact
使用Jinja表达式。我意识到它也适用于点表示法,但有[]
似乎更加一致。这确实是一个意见问题;)我总是喜欢点符号而不是数组符号(不太详细),并且不关心混合。我的观点是:在这种情况下,您不必更改点符号,这实际上并不是解决OP问题的方法。我的意图不是说使用[]
或| quote
将解决OP的问题。如果听起来像这样,我更改了解释示例的顺序。谢谢@seshadri_c&Zeitounator这真是太好了!我没有意识到我在使用点符号和[]的组合!我盲目地跟随另一个示例以获得特定的堆栈输出!