我的 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”服务器的catchall组 所以!我正在尝试做:
{{ jsonOutput | json_query('json.response.results[].dnsName') | regex_findall('(?![a-z]{3}[0-9]{2}v)^.*', multiline=true) }}
当我将其插入 https://pythex.org 时,这似乎确实有效。 但是 ansible 正在返回所有内容...... 我到底做错了什么?
答案 0 :(得分:0)
这是因为 json_query
发出一个 list[str]
,当它直接送入 regex_findall
时不会成为换行符分隔的字符串,它与 str(["alpha", "beta"])
相同(例如 { {1}}),然后多行正则表达式无法满足您的期望
与生活中的许多事情一样,有几种方法可以解决这个问题。一种方法是将结果输入到 ['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
我猜哪种风格最适合你的剧本是个人喜好