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

如何构建Ansible主机名列表用于GlusterFS卷创建

生成GlusterFS卷所需的Ansible主机名列表

要获取所有节点实际的ansible_hostname(与清单定义的外部域名不同),并生成仅能被单节点任务调用的列表,无需额外执行收集任务,直接利用Ansible的hostvars与主机组变量即可实现。以下是修改后的完整剧本:

- hosts: all
  gather_facts: true

  tasks:
  - name: 打印单节点的Ansible主机名
    debug:
      msg: "{{ ansible_hostname }}" # 输出示例: nodetest1, nodetest2 等

  - name: 打印所有Ansible主机名列表
    run_once: true  # 仅在第一个节点运行
    debug:
      var: ansiblehostnamelist
    vars:
      ansiblehostnamelist: "{{ groups['all'] | map('extract', hostvars, 'ansible_hostname') | list }}"

  - name: 创建Gluster卷
    run_once: true  # 仅在第一个节点运行
    gluster.gluster.gluster_volume:
      state: present
      name: "{{ sharedVolumeName }}"
      bricks: "{{ glusterfsBasePath }}{{ sharedVolumeOsFolder }}"
      cluster: "{{ groups['all'] | map('extract', hostvars, 'ansible_hostname') | list }}"
      replicas: 3
      force: yes

关键逻辑说明

  • groups['all']:引用清单中所有主机的集合
  • map('extract', hostvars, 'ansible_hostname'):遍历所有主机,提取每个节点实际的ansible_hostname值
  • list:将提取结果转换为标准列表格式
  • 由于任务设置了run_once: true,且已通过gather_facts: true收集了所有节点的事实信息,第一个节点可直接访问全量hostvars数据生成所需列表

复用变量的替代方案

如果需要在多个单节点任务中复用该列表,可提前定义全局变量(无需run_once,变量会被所有节点共享):

- hosts: all
  gather_facts: true
  vars:
    ansiblehostnamelist: "{{ groups['all'] | map('extract', hostvars, 'ansible_hostname') | list }}"

  tasks:
  - name: 打印单节点的Ansible主机名
    debug:
      msg: "{{ ansible_hostname }}"

  - name: 打印所有Ansible主机名列表
    run_once: true
    debug:
      var: ansiblehostnamelist

  - name: 创建Gluster卷
    run_once: true
    gluster.gluster.gluster_volume:
      state: present
      name: "{{ sharedVolumeName }}"
      bricks: "{{ glusterfsBasePath }}{{ sharedVolumeOsFolder }}"
      cluster: "{{ ansiblehostnamelist }}"
      replicas: 3
      force: yes

内容的提问来源于stack exchange,提问作者Daniel Loczi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:20:56