如何在Ansible中提取两点间字符串并赋值给dcname变量
如何在Ansible中提取主机名的特定部分并创建文件夹
没问题,这可以通过Ansible的内置字符串过滤器轻松实现,我给你两种实用方案,你可以根据场景选择:
方案1:使用正则表达式过滤(regex_search)
如果你的目标是从完整域名(比如Ars-898z.cnd0.example.com)中提取第一个点和第二个点之间的字符串(比如cnd0),或者进一步截取前3位得到cnd,可以用regex_search过滤器:
步骤:
先匹配第一个点后到第二个点前的内容:
- name: 提取数据中心名称 set_fact: dcname: "{{ arista_host | regex_search('\\.(.*?)\\.', '\\1') | first }}"解释:
\\.(.*?)\\.:正则表达式匹配任意字符(非贪婪模式),前后是点号;'\\1':指定提取第一个捕获组的内容;| first:因为regex_search返回的是列表,取第一个元素。
如果需要把
cnd0变成cnd(截取前3位),可以再加个slice过滤器:- name: 提取数据中心名称并截取前3位 set_fact: dcname: "{{ arista_host | regex_search('\\.(.*?)\\.', '\\1') | first | slice(:3) | join('') }}"
方案2:使用字符串分割(split)
如果觉得正则表达式太复杂,也可以用split按点号分割字符串,然后取对应的部分:
步骤:
分割完整域名,取第二个元素(因为分割后列表是
['Ars-898z', 'cnd0', 'example', 'com']):- name: 提取数据中心名称 set_fact: dcname: "{{ arista_host | split('.') | nth(1) }}"解释:
split('.'):把域名按点号分割成列表;nth(1):取列表的第2个元素(索引从0开始)。
同样,如果需要截取前3位:
- name: 提取数据中心名称并截取前3位 set_fact: dcname: "{{ (arista_host | split('.') | nth(1))[:3] }}"
用dcname创建文件夹
提取到变量后,就可以用file模块创建文件夹了:
- name: 创建数据中心专属文件夹 file: path: "/path/to/your/folders/{{ dcname }}" state: directory mode: '0755'
注意事项
- 如果你的主机名是短格式(比如
Ars-898z.cnd0),没有第二个点号,那可以直接分割后取第1个元素,再截取前3位:dcname: "{{ inventory_hostname | split('.') | nth(1) | slice(:3) | join('') }}" - 确保
arista_host或inventory_hostname变量在你的playbook中是可用的,可以用debug模块先验证变量值:- name: 验证主机变量 debug: var: arista_host
内容的提问来源于stack exchange,提问作者farhad
相关产品推荐
相关产品推荐

