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

如何在Ansible中提取两点间字符串并赋值给dcname变量

如何在Ansible中提取主机名的特定部分并创建文件夹

没问题,这可以通过Ansible的内置字符串过滤器轻松实现,我给你两种实用方案,你可以根据场景选择:

方案1:使用正则表达式过滤(regex_search)

如果你的目标是从完整域名(比如Ars-898z.cnd0.example.com)中提取第一个点和第二个点之间的字符串(比如cnd0),或者进一步截取前3位得到cnd,可以用regex_search过滤器:

步骤:

  1. 先匹配第一个点后到第二个点前的内容:

    - name: 提取数据中心名称
      set_fact:
        dcname: "{{ arista_host | regex_search('\\.(.*?)\\.', '\\1') | first }}"
    

    解释:

    • \\.(.*?)\\.:正则表达式匹配任意字符(非贪婪模式),前后是点号;
    • '\\1':指定提取第一个捕获组的内容;
    • | first:因为regex_search返回的是列表,取第一个元素。
  2. 如果需要把cnd0变成cnd(截取前3位),可以再加个slice过滤器:

    - name: 提取数据中心名称并截取前3位
      set_fact:
        dcname: "{{ arista_host | regex_search('\\.(.*?)\\.', '\\1') | first | slice(:3) | join('') }}"
    

方案2:使用字符串分割(split)

如果觉得正则表达式太复杂,也可以用split按点号分割字符串,然后取对应的部分:

步骤:

  1. 分割完整域名,取第二个元素(因为分割后列表是['Ars-898z', 'cnd0', 'example', 'com']):

    - name: 提取数据中心名称
      set_fact:
        dcname: "{{ arista_host | split('.') | nth(1) }}"
    

    解释:

    • split('.'):把域名按点号分割成列表;
    • nth(1):取列表的第2个元素(索引从0开始)。
  2. 同样,如果需要截取前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:06