使用其他字典值在字典中传递变量

问题描述 投票:0回答:1

当使用另一个字典值作为参数时,如何将包含变量的值分配给字典键。

示例

---
- name: Test vars
  hosts: ['localhost']
  vars:
    foo:
      a: "foo a value"
      b: "{{ a }}"
  tasks:
  - name: Fix owneship and permission issue with sudoers file
    debug:
      msg: Print {{ foo.b }}

我尝试过以下方法:

vars:
  foo:
    a: " foo a value"
    b: "{{ foo.a }}"
vars:
  foo:
    a: " foo a value"
    b: "{{ foo['a'] }}"
vars:
  foo:
    a: " foo a value"
    b: "{{ a }}"

以上都不起作用。

ansible
1个回答
2
投票

您可以仅使用 YAML,通过几个节点锚点/别名节点来满足此要求。

在 YAML 语法中,您可以在值之前添加锚点,然后可以通过别名节点引用它。

锚点由

&
指示器表示:

some_key: &anchor_name value

虽然别名由

*
指示符表示:

some_other_key: *anchor_name

因此,鉴于任务:

- debug:
    var: foo.b
  vars:
    foo:
      a: &foo_a "foo a value"
      b: *foo_a

这产生了预期的结果:

ok: [localhost] => 
  foo.b: foo a value

但是,事实上,它只是一个锚点和别名,您将无法从文字加变量组成值或基于多个变量组成,例如如果你愿意的话

####
# Please note that this is a counterexample and won't work
####

mydict:
  foo: "example {{ mydict.bar }}"
  bar: 123

####
# Please note that this is a counterexample and won't work
####

mydict:
  foo: "{{ mydict.bar }}{{ mydict.baz }}"
  bar: 123
  baz: 456

您别无选择,因为这是 Ansible 不打算允许的事情:

这是预期的,我们不打算改变。您无法创建自引用变量。

引自 Sivel,Ansible 的维护者,在他们的问题跟踪器上

© www.soinside.com 2019 - 2024. All rights reserved.