在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]','') }}"
我有一台机器,其中变量包含我要提取的数字,然后拆分以使用 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]','') }}"