使用 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 }}"
考虑将以下查找分配给变量:
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 }}"