Ansible regex_findall 没有给出负面搜索的预期结果
Ansible regex_findall is not giving expected results with negative search
我的 ansible 负正则表达式正在返回所有内容
所以我从 JSON 中获取 dns 名称的结果,我正在尝试对其进行排序以创建一个自动化的 ansible 清单。
我的服务器的命名方案如下:
abc02vsomeserver01.subdomain1.domain.gov
abc02someserver01.subdomain1.domain.gov
xyz03votherserver11.subdomain2.domain.gov
wyz03otherserver11.subdomain2.domain.gov
qrsmainserver02.maindomain.domain.gov
我正在获取按环境划分的“v”服务器,然后我想创建一个不是“v”服务器的包罗万象的组
所以!我正在尝试做:
{{ jsonOutput | json_query('json.response.results[].dnsName') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}
当我将它插入 https://pythex.org 时,它似乎确实有效。
但是 ansible 正在返回所有东西......
我到底做错了什么?
这是因为 json_query
发出一个 list[str]
,当直接输入 regex_findall
时它不会变成换行符分隔的字符串,它变得与 str(["alpha", "beta"])
相同(例如 ['alpha', 'beta']
) 然后多行正则表达式无法执行您期望的操作
与生活中的许多事情一样,有一些方法可以解决这个问题。一种是将结果输入 |join("\n")
,然后您可能会回到您认为开始的地方:
- debug:
msg: "{{ jsonOutput | json_query('json.response.results[].dnsName') | join('\n') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}"
另一个是承认它是 list[str]
并使用 | select("match", ...)
过滤器只允许匹配的项目:
- debug:
msg: >-
{{ response | json_query('results[].dnsName')
| select('match', '(?![a-z]{3}[0-9]{2}v)^.*')
| list }}
vars:
response:
results:
- dnsName: abc02vsomeserver01.subdomain1.domain.gov
- dnsName: abc02someserver01.subdomain1.domain.gov
- dnsName: xyz03votherserver11.subdomain2.domain.gov
- dnsName: wyz03otherserver11.subdomain2.domain.gov
- dnsName: qrsmainserver02.maindomain.domain.gov
类似地产生:
"msg": [
"abc02someserver01.subdomain1.domain.gov",
"wyz03otherserver11.subdomain2.domain.gov",
"qrsmainserver02.maindomain.domain.gov"
]
我猜个人偏好哪种风格最适合您的剧本
我的 ansible 负正则表达式正在返回所有内容
所以我从 JSON 中获取 dns 名称的结果,我正在尝试对其进行排序以创建一个自动化的 ansible 清单。 我的服务器的命名方案如下:
abc02vsomeserver01.subdomain1.domain.gov
abc02someserver01.subdomain1.domain.gov
xyz03votherserver11.subdomain2.domain.gov
wyz03otherserver11.subdomain2.domain.gov
qrsmainserver02.maindomain.domain.gov
我正在获取按环境划分的“v”服务器,然后我想创建一个不是“v”服务器的包罗万象的组 所以!我正在尝试做:
{{ jsonOutput | json_query('json.response.results[].dnsName') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}
当我将它插入 https://pythex.org 时,它似乎确实有效。 但是 ansible 正在返回所有东西...... 我到底做错了什么?
这是因为 json_query
发出一个 list[str]
,当直接输入 regex_findall
时它不会变成换行符分隔的字符串,它变得与 str(["alpha", "beta"])
相同(例如 ['alpha', 'beta']
) 然后多行正则表达式无法执行您期望的操作
与生活中的许多事情一样,有一些方法可以解决这个问题。一种是将结果输入 |join("\n")
,然后您可能会回到您认为开始的地方:
- debug:
msg: "{{ jsonOutput | json_query('json.response.results[].dnsName') | join('\n') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}"
另一个是承认它是 list[str]
并使用 | select("match", ...)
过滤器只允许匹配的项目:
- debug:
msg: >-
{{ response | json_query('results[].dnsName')
| select('match', '(?![a-z]{3}[0-9]{2}v)^.*')
| list }}
vars:
response:
results:
- dnsName: abc02vsomeserver01.subdomain1.domain.gov
- dnsName: abc02someserver01.subdomain1.domain.gov
- dnsName: xyz03votherserver11.subdomain2.domain.gov
- dnsName: wyz03otherserver11.subdomain2.domain.gov
- dnsName: qrsmainserver02.maindomain.domain.gov
类似地产生:
"msg": [
"abc02someserver01.subdomain1.domain.gov",
"wyz03otherserver11.subdomain2.domain.gov",
"qrsmainserver02.maindomain.domain.gov"
]
我猜个人偏好哪种风格最适合您的剧本