You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:22:32