我的清单中有多个以'my_var_ *'开头的dict变量。我想将它们组合成一个名为“ my_var”的字典
在我的剧本中,我使用“ set_fact:”来创建“ my_var”变量,方法是尝试使用选择过滤器和匹配正则表达式从“ hostvars ['localhost']”中提取匹配变量,但join仅适用于字符串。
variables.yml
my_var_1:
element1: value11
element2: value12
my_var_2:
element1: value21
element2: value22
playbook.yml
- hosts: localhost
connection: local
gather_facts: False
tasks:
- set_fact:
my_var: "{{ hostvars['localhost'] | select('match', '^my_var_*') | join(', ' }}"
- debug:
msg: "{{ my_var }}"
是否可以将这些“ dict”变量连接成这样的“数组”?
my_var:
- element1: value11
element2: value12
- element1: value21
element2: value22
甚至可能
my_var:
- name: 1
element1: value11
element2: value12
- name: 2
element1: value21
element2: value22
您非常接近,但是正如您指出的那样,join
字符串上的方法用于连接字符串。您想要附加列表,您可以使用+
运算符来完成。
还有其他一些问题:
表达方式:
hostvars['localhost'] | select('match', '^my_var_*')
将产生一个看起来像这样的列表:
[
"my_var_1",
"my_var_2"
]
...这不是您想要的。您需要这些变量的值,而不是键名。我们可以使用dict2items
过滤器和selectattr
过滤器来生成所需的数据:
---
- hosts: localhost
gather_facts: false
tasks:
- name: set facts on localhost
set_fact:
my_var_1:
element1: value11
element2: value12
my_var_2:
element1: value21
element2: value22
- hosts: localhost
gather_facts: false
tasks:
- name: merge vars into my_var
set_fact:
my_var: "{{ hostvars['localhost']|dict2items|selectattr('key', 'match', '^my_var_')|map(attribute='value')|list }}"
- name: show content of my_var
debug:
var: my_var
这将产生以下输出:
TASK [show content of my_var] ************************************************************************************
ok: [localhost] => {
"my_var": [
{
"element1": "value11",
"element2": "value12"
},
{
"element1": "value21",
"element2": "value22"
}
]
}
如果您摆脱map(attribute='value')
过滤器,则会得到:
TASK [show content of my_var] *****************************************************************************************
ok: [localhost] => {
"my_var": [
{
"key": "my_var_1",
"value": {
"element1": "value11",
"element2": "value12"
}
},
{
"key": "my_var_2",
"value": {
"element1": "value21",
"element2": "value22"
}
}
]
}
这并不是您要求的第二个选项,但它确实包含键名和值。
补充说明:
在上面,我使用了一个单独的运行set_fact
来设置这些变量的值,因为该解决方案仅在变量是宿主变量(又称“事实”)而不是全局变量时才有效。您没有在问题中显示如何设置这些变量,所以我不知道这是否能按编写的方式工作。
在正则表达式,*
是指“前面的字符0次或更多次”,所以表达^my_var_*
会匹配my_var
,my_var_1
,my_var______________
,my_varfoo
,等等。您只需编写^my_var_
即可选择感兴趣的变量名(这将选择以text开头的任何内容my_var_
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句