虽然我已经检查过以前的类似问题,但似乎没有一个适用于我。 只要我们的基础设施的其余部分不会更新,我们就使用 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
时,我得到相同的结果。
对一个字符串进行正则表达式搜索时,它是正确的。
如果有人可以提出一些提示或指出显而易见的问题,我将不胜感激。
另一种更动态的方法可能是维护模式列表,而不是对它们进行硬编码。
---
- 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原则就一定不好吗?