使用 Ansible 访问函数返回的字典项

Accessing dictionary item returned by function with Ansible

考虑将以下查找分配给变量:

my_var: "{{ lookup('community.general.consul_kv', 'my/var') }}"

上面的查找 return 是一个包含以下数据的字典:

{
  "key1": "value1",
  "key2": "value2"
}

如何访问 key1 的值并将其分配给 my_var?我尝试了这些变体:

my_var: "{{ lookup('community.general.consul_kv', 'my/var').key1 }}"

my_var: "{{ lookup('community.general.consul_kv', 'my/var')['key1'] }}"

my_var: "{{ (lookup('community.general.consul_kv', 'my/var')).key1 }}"

my_var: "{{ (lookup('community.general.consul_kv', 'my/var'))['key1'] }}"

全部 return 个空值。

永远记住 ansible/jinja2 神奇地将先前存储的 yaml/json 字符串表示重新解释为 lists/dicts。这是您调试查找内容时发生的情况。

您将值 my/var 作为包含两个键的字典的 json 字符串 表示形式存储在 consul 中。

如果您直接检查从查找中获得的值的类型,这将更加清晰:

- name: Check the var type returned by lookup
  debug:
    msg: "{{ lookup('community.general.consul_kv', 'my/var') | type_debug }}"

给出:

TASK [Check the var type returned by lookup] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "AnsibleUnsafeText"
}

如果您想直接处理所表示字典的键之一,则必须“强制”对 json 结构进行“神奇”的重新解释,即使用 from_json 过滤器。

- name: store my var
  set_fact:
    my_var: "{{ (lookup('community.general.consul_kv', 'my/var') | from_json).key1 }}"

或者,您可以通过一个中间变量,它将自动为您完成这项工作

- name: store my var
  vars:
    my_kv: "{{ lookup('community.general.consul_kv', 'my/var') }}"
  set_fact:
    my_var: "{{ my_kv.key1 }}"