如何构建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
相关产品推荐
相关产品推荐

