【问题标题】:Ansible set_fact Nested Variables in Playboook剧本中的 Ansible set_fact 嵌套变量
【发布时间】:2021-01-08 06:14:33
【问题描述】:

我一直在研究这个问题,但找不到解决方案。

我的剧本是:

- hosts: localhost
  connection: local
  gather_facts: False
  vars:
    vpc_stack_name: "VPC-CF"

  tasks:
  - name: Get summary information about a stack
    amazon.aws.cloudformation_info:
      stack_name: "{{ vpc_stack_name }}"
    register: vpc_stack_facts

  - debug:
      var: "vpc_stack_facts.cloudformation['{{ vpc_stack_name }}'].stack_outputs['VPCID']"

  - set_fact:
      temp: "{{ vpc_stack_facts.cloudformation['{{ vpc_stack_name }}'].stack_outputs['VPCID'] }}"

我知道嵌入的{{ vpc_stack_name }} 是错误的并且不允许但不知道如何绕过它。

我还没有掌握 Ansible lookups

提前谢谢你!

【问题讨论】:

  • debug 看起来没问题,因为您正在为 var 属性重建一个 var 名称。对于您的set_fact,您不能嵌套 jinja2 标记,只需使用包含相应值的 var 名称 => "{{ vpc_stack_facts.cloudformation[vpc_stack_name].stack_outputs['VPCID'] }}"

标签: variables ansible nested set fact


【解决方案1】:

正如您所提到的,在 Jinja 上下文中使用 Jinja 表达式 {{ vpc_stack_name }} 是不正确的。 Ansible 将尝试评估任何不带引号的文本作为变量。因此,您可以保持 vpc_stack_name 变量原样:[vpc_stack_name]

例子:

  vars:
    vpc_stack_name: VPC-CF

  tasks:
  - cloudformation_info:
      stack_name: "{{ vpc_stack_name }}"
    register: vpc_stack_facts
  - set_fact:
      temp_var: "{{ vpc_stack_facts['cloudformation'][vpc_stack_name|quote]['stack_outputs']['VPC'] }}"
  - debug:
      var: temp_var

注意:在上面的示例中,我使用 VPC 作为密钥来获取 VPC ID 作为输出。

  • 使用 [''] 表示法而不是点 . 来访问字典项
  • 使用|quote 过滤变量vpc_stack_name

产量:

ok: [localhost] => {
    "temp_var": "vpc-1234ab5678c90d1e"
}

【讨论】:

  • OP 对debug: var 的当前表达式是完全正确的(尽管在这种情况下我宁愿建议使用msg 和下面的)并且不应该引发错误。仅在使用包含“特殊”字符(空格、破折号等)的变量或文字键名时才需要删除点符号,stack_outputs 不需要(尽管您完全可以选择)。 "{{ vpc_stack_facts.cloudformation[vpc_stack_name].stack_outputs.VPCID }}" 适用于 set_factdebug: msg
  • 是的,问题是在 debug: msgset_fact 的 Jinja 上下文中使用 Jinja 表达式。我意识到它也适用于点符号,但 [] 似乎更一致。跨度>
  • 这真的是一个见仁见智的问题;)我总是喜欢点符号而不是数组一(不那么冗长)并且不关心混合。我的观点是:在这种情况下您不必更改它,这实际上不是解决 OP 问题的方法。
  • 我的意图不是说使用[]|quote 将解决OP 的问题。以防听起来我改变了解释我的例子的顺序。
  • 谢谢@seshadri_c & Zeitounator 这真的很感激!我没有意识到我正在使用点符号和 [] 的组合!!!我盲目地遵循另一个示例来获取特定的堆栈输出!
猜你喜欢
  • 2015-08-20
  • 1970-01-01
  • 2022-10-21
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多