如何基于dict变量名称的正则表达式将多个dict变量组合到数组中

我的清单中有多个以'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"
            }
        }
    ]
}

这并不是您要求的第二个选项,但它确实包含键名和值。


补充说明:

  1. 在上面,我使用了一个单独的运行set_fact来设置这些变量的值,因为该解决方案仅在变量是宿主变量(又称“事实”)而不是全局变量时才有效。您没有在问题中显示如何设置这些变量,所以我不知道这是否能按编写的方式工作。

  2. 在正则表达式,*是指“前面的字符0次或更多次”,所以表达^my_var_*会匹配my_varmy_var_1my_var______________my_varfoo,等等。您只需编写^my_var_即可选择感兴趣的变量名(这将选择以text开头的任何内容my_var_)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式匹配Unicode变量名称

JavaScript变量名称正则表达式

Oracle SQL 正则表达式 - 在正则表达式查询中传递变量名称

将多个替换正则表达式组合到一个程序中

如何使用变量名中的多个正则表达式对数据框进行子集化?

如何使用扫描仪基于正则表达式将值分配给多个变量

基于正则表达式拆分JSON密钥以存储在多个变量中

python中的正则表达式(多个变量)

正则表达式,提取变量名

将变量粘贴到正则表达式中

javascript正则表达式将字符串前缀为变量名jupyter

如何使用javascript中的正则表达式提取数组中代数表达式的系数和变量?

如何形成正则表达式以识别变量名的正确声明

正则表达式(C#)-如何匹配以冒号开头的变量名

如何在javascript中用正则表达式引用所有变量名

使用正则表达式从R中的bspline-coeffiecient提取变量名

Javascript Regex:如何将变量放入正则表达式中?

如何将split与存储在变量中的正则表达式一起使用?

如何将正则表达式的不同结果(使用grep?)检索到变量中?

如何将BASH变量插入PERL正则表达式替换中?

如何将正则表达式捕获组存储为vim脚本中的变量?

如何通过组合多个正则表达式来形成正则表达式

与变量名称一起使用时,tcl正则表达式无法正常工作

组合多个正则表达式

在 perl 中组合多个正则表达式

将单词从列表组合到带有单词边界的单个正则表达式

使用r中的循环创建基于正则表达式的变量

如何将额外的变量组合到数组/方法中?

如何将包含字符串数组的变量放入正则表达式C#