【问题标题】:Create list with jijna2 regex_search - NoneType problem使用 jijna2 regex_search 创建列表 - NoneType 问题
【发布时间】:2021-12-24 21:33:58
【问题描述】:

我面临两个问题:

问题 1。 我正在尝试使用 jinja2 regex_search 过滤列表,但我也得到 None 匹配。

问题 2。 新列表的每个元素似乎都是一个元素的列表(sigth !!!)。

我的代码。

- name: Regex_Search Test
  hosts: localhost

  vars:
    my_list:
      - app-be-dev01-2
      - app-be-dev02-2
      - app-be-dev02-3
      - app-be-dev03-2
      - app-foo-2
      - app-be-dev04-1
      - app-be-dev04-2

  tasks:
  - name: Varsmng
    set_fact:
      customer_instances: >-
         {%       for instance in my_list  -%} {{ customer_instances | default([]) + [ instance | string | regex_search('app-be-(.*)-([0-9]*)', '\1' ) ]  }}
         {%-      endfor %}

  - name: Debug
    debug:
      msg:
       - "customer_instances:  {{ customer_instances }}"

我的输出。

TASK [Varsmng] ****************************************************************************************************************************************
task path: /home/cin0633a/progetti/ansible/testenv/test.yml:19
ok: [localhost] => {
    "ansible_facts": {
        "customer_instances": "[[u'dev01']][[u'dev02']][[u'dev02']][[u'dev03']][None][[u'dev04']][[u'dev04']]  "
    }, 
    "changed": false

如您所见,每个元素都有一个双方括号。我可以避免None 值吗?

【问题讨论】:

    标签: regex ansible jinja2 nonetype


    【解决方案1】:

    您会得到每个元素的列表,因为当您在表达式中使用替换功能和捕获组时,regex_search 返回一个列表。

    $ ansible localhost -m debug -e toto=bla-bli-blo -a "msg={{ toto | regex_search('(bla).*') }}"
    localhost | SUCCESS => {
        "msg": "bla-bli-blo"
    }
    $ ansible localhost -m debug -e toto=bla-bli-blo -a "msg={{ toto | regex_search('(bla).*', '\\1') }}"
    localhost | SUCCESS => {
        "msg": [
            "bla"
        ]
    }
    

    你会得到 None 值,因为有些项目与你的正则表达式不匹配。

    您可以通过使用特定过滤器而不是复杂的 jinja2 模板的更好方法 IMO 获得结果。以下剧本:

    - name: Regex_Search Test
      hosts: localhost
      gather_facts: false
    
      vars:
        my_list:
          - app-be-dev01-2
          - app-be-dev02-2
          - app-be-dev02-3
          - app-be-dev03-2
          - app-foo-2
          - app-be-dev04-1
          - app-be-dev04-2
    
        searchreg: >-
          app-be-(.*)-([0-9]*)
    
        my_filtered_list: >-
          {{
            my_list |
            select('regex', searchreg) |
            map('regex_replace', searchreg, '\1')
          }}
    
      tasks:
        - debug:
            var: my_filtered_list
    

    给予:

    PLAY [Regex_Search Test] *****************************************************************************
    
    TASK [debug] *****************************************************************************
    ok: [localhost] => {
        "my_filtered_list": [
            "dev01",
            "dev02",
            "dev02",
            "dev03",
            "dev04",
            "dev04"
        ]
    }
    
    PLAY RECAP *****************************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    • 注意 1:如果您想要独特的环境结果,可以通过管道传递 unique 过滤器
    • 注意2:如果您使用的是ansible list 过滤器才能获得实际结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      相关资源
      最近更新 更多