如何在Ansible中使用正则表达式从主机名提取指定数字(排除域名中的数字)
解决方案:从主机名中精准提取指定位置的数字
我明白你的问题了——原来的正则表达式把主机名里所有数字都保留了,包括域名部分prd1里的1,所以才会得到011、101这种不符合预期的结果。下面给你两种简单可行的解决办法:
方法一:精准匹配目标数字区间
直接用正则捕获nginx-node-之后、第一个点号之前的数字,替换时只保留捕获到的内容:
{{ inventory_hostname | regex_replace('nginx-node-(\\d+)\\..*', '\\1') }}
正则解释:
nginx-node-:匹配固定的前缀,确保我们只关注目标区间的数字(\\d+):捕获一个或多个数字(这就是我们要的结果),Jinja2里需要用双反斜杠转义\\..*:匹配第一个点号及后面的所有内容(也就是域名部分)- 替换为
\\1:只保留第一个捕获组的内容,也就是我们提取的数字
方法二:先拆分主机名再提取数字
先把主机名按点号拆分,拿到点号前面的主机部分,再去掉所有非数字字符:
{{ inventory_hostname.split('.')[0] | regex_replace('[^0-9]', '') }}
逻辑解释:
split('.')[0]:把nginx-node-01.prd1.com拆分成列表['nginx-node-01', 'prd1', 'com'],取第一个元素得到纯主机部分regex_replace('[^0-9]', ''):去掉主机部分里的所有非数字字符,剩下的就是nginx-node-后面的数字
两种方法对你的示例主机名测试结果都符合预期:
- 输入
nginx-node-01.prd1.com→ 输出01 - 输入
nginx-node-10.prd1.com→ 输出10
你可以根据自己的场景选择更合适的方法,如果主机名前缀固定,方法一更精准;如果前缀可能有变化但数字都在点号前,方法二更通用。
内容的提问来源于stack exchange,提问作者hock
相关产品推荐
相关产品推荐

