在ansible中提取和拆分字符串

Extract and split string in ansible

我有一台机器,其中变量包含我要提取的数字,然后拆分以使用 ansible 构建 IP 地址。

variable = machine240dev

我希望能够提取 240 然后拆分它以填充 ip 地址的两个中间八位字节

例如10.2.40.170

我尝试过各种方法,例如:

var: machine240dev

10.{{  var | regex_replace('[^0-9]','')[0] }}.{{ var | regex_replace('[^0-9]','')[-2:] }}.170

失败,因为它不喜欢 regex_replace 过滤器后的 [0]

我只是想知道是否有人以前这样做过或知道一种干净的方法。

编辑:

我已经设置了一个事实,在提取字符串的特定部分之前首先为 vlan 设置变量。

- name: Setting vlan fact
  set_fact: vlan="{{  var | regex_replace('[^0-9]','') }}"

然后在我的模板中设置:

IPADDR=10.{{ vlan[0] }}.{{ vlan[-2:] }}.170

不过,我仍然乐于接受有关如何改进的建议

您可以使用 regex_replace 解决方案,例如:

10.{{  var | regex_replace('.*([0-9])([0-9]{2}).*', '\1.\2') }}.170

这里,

  • .* - 匹配除换行字符以外的任何零个或多个字符,尽可能多
  • ([0-9])([0-9]{2}) - 将一个数字捕获到第 1 组,然后将两个数字捕获到第 2 组
  • .* - 匹配除换行字符以外的任何零个或多个字符,尽可能多

. 替换将匹配的字符串替换为组 1 + . + 组 2 值。

参见 this regex demo

或者,基于 regex_search 的解决方案:

10.{{  var | regex_search('[0-9]') }}.{{ var | regex_search('(?<=[0-9])[0-9]{2}') }}.170

输出:

10.2.40.170

这里,

  • regex_search('[0-9]') 提取第一个数字
  • regex_search('(?<=[0-9])[0-9]{2}') - 在数字后提取两位数。

Ansible 允许您在任务范围内创建中间变量,例如

    - set_fact:
        IPADDR: "10.{{ vlan[0] }}.{{ vlan[-2:] }}.170"
      vars:
        vlan: "{{ var | regex_replace('[^0-9]','') }}"