在 regex_search 或 regex_findall 中匹配多个字符串会给出不应匹配的其他字符串

问题描述 投票:0回答:2

虽然我已经检查过以前的类似问题,但似乎没有一个适用于我。 只要我们的基础设施的其余部分不会更新,我们就使用 Ansible 版本 2.9。 我有这个列表,我需要在它下面过滤两个字符串。

kvm_list:
  - abcdefabcfgh.domain.example
  - deffghabc.domain.example
  - abcblabla.domain.example
  - kabcxyz.domain.example
  - kesanu.domain.example
  - kesbapo.domain.example
  - kextoet.domain.example
  - kptfkom.domain.example
  - kgitblabla.domain.example
  - kgitblubblub.domain.example
- name: "get them devtools"
  hosts: localhost
  ignore_errors: True
  tasks: 
    - set_fact:
         devtools: "{{ kvm_list | string | regex_search('kgit.*|kes.*', multiline=True)}}"
    
    - debug: var=devtools

当尝试上面的方法时,我得到了下面的结果:

TASK [debug] **************************************************************************************************************************
ok: [localhost] => {
"msg":"kesanu.domain.example','kesbapo.domain.example','kextoet.domain.example','kptfkom.domain.example','kgitblabla.domain.example','kgitblubblub.domain.example]"
}
不应包括

Kextoet
kptfkom

当纯粹在正则表达式(https://regex101.com/)上测试它时,它可以工作,当在ansible中测试它时,它不起作用。

使用

regex_findall
时,我得到相同的结果。

对一个字符串进行正则表达式搜索时,它是正确的。

如果有人可以提出一些提示或指出显而易见的问题,我将不胜感激。

ansible ansible-2.x
2个回答
5
投票

select
过滤器可以实现:

- set_fact:
    devtools: "{{ kvm_list | select('match','k(?:git|es)') }}"
ok: [localhost] => {
    "devtools": [
        "kesanu.domain.example",
        "kesbapo.domain.example",
        "kgitblabla.domain.example",
        "kgitblubblub.domain.example"
    ]
}

0
投票

另一种更动态的方法可能是维护模式列表,而不是对它们进行硬编码。

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    URLs:
      - abc.example.com
      - foo.example.com
      - bar.example.com
      - kpax.example.com
      - kcrm.example.com
      - kes.example.com
      - kgit.example.com

    PATTERNS:
      - '^kgit'
      - '^kes'

  tasks:

    - debug:
        msg: "{{ URLs | select('search', regex) }}"
      vars:
        regex: "{{ PATTERNS | join('|') }}"

产生

的输出
TASK [debug] *******
ok: [localhost] =>
  msg:
  - kes.example.com
  - kgit.example.com

但是会违反DRY原则,问题就来了违反DRY原则就一定不好吗?

© www.soinside.com 2019 - 2024. All rights reserved.