有没有办法使用正则表达式来匹配ansible中的主机?
我正在尝试使用正则表达式模式与 ansible 匹配主机,但它没有按预期工作.我的库存如下所示:
I am trying to match hosts using a regex pattern with ansible but it is not working as expected. My inventory is as seen below:
[group1]
hello1
world1
hello2
world2
[group2]
hello3
我的任务是:
- debug:
msg: "{{ item }}"
with_inventory_hostnames:
- ~hello*
来自他们的文档:
Using regexes in patterns
You can specify a pattern as a regular expression by starting the pattern with ~:
~(web|db).*\.example\.com
当我执行任务时没有输出.我是一个使用正则表达式的 n00b,所以我的正则表达式有可能是错误的吗?
When I execute the task there is no output. I am a n00b with regex so could it be possible my regex is wrong?
问:我的正则表达式有可能是错误的吗?"
A:这是一个错误.请参阅inventory_hostnames 查找不支持模式 #17268 中的通配符.它可能会在 2.10 中修复.但是我认为您的模式不起作用,因为 doc 说:您可以将通配符模式与 FQDN 或 IP 地址一起使用,只要您的清单中的主机是按 FQDN 或 IP 地址命名的"
.您清单中的主机既不是 FQDN 也不是 IP.
A: It's a bug. See inventory_hostnames lookup doesn't support wildcards in patterns #17268. It will be probably fixed in 2.10. But your pattern wouldn't work, I think, because the doc says: "You can use wildcard patterns with FQDNs or IP addresses, as long as the hosts are named in your inventory by FQDN or IP address"
. The hosts in your inventory are neither FQDN nor IP.
问:有没有办法使用正则表达式来匹配 ansible 中的主机?"
答:是的.这是.一个非常方便的方法是使用模块 add_host.例如下面的剧本
A: Yes. It is. A very convenient way is to create dynamic groups with the module add_host. For example the playbook below
- hosts: localhost
tasks:
- add_host:
name: "{{ item }}"
groups: my_dynamic_group
loop: "{{ groups.all|select('match', my_pattern)|list }}"
vars:
my_pattern: '^hello\d+$'
- hosts: my_dynamic_group
tasks:
- debug:
var: inventory_hostname
给予
"inventory_hostname": "hello2"
"inventory_hostname": "hello1"
"inventory_hostname": "hello3"