Ansible如何合并变量生成pcs stonith所需pcmk_host_map指定格式字符串
解决方案
你这个场景下不需要用到combine/merge过滤器,这两个过滤器是用来合并字典类型变量的,仅用join过滤器就能完全满足需求,两种常用实现方式如下:
方式1:直接在任务内拼接(适配你现有的4个节点变量,适合固定2节点场景)
直接修改原有任务的pcmk_host_map参数部分即可,最终任务代码:
- name: Create stonith shell: pcs stonith create {{ fence_name }} fence_vmware_soap pcmk_host_map="{{ [node2_name ~ ':' ~ vm2_name, node1_name ~ ':' ~ vm1_name] | join(';') }}" ipaddr={{ vcenter_ip }} ssl_insecure=1 login={{ vcenter_username }} passwd={{ vcenter_password }}
其中~是Jinja2的字符串拼接符,先把单个节点的主机名和对应虚拟机名拼接成主机名:虚拟机名格式的字符串,再通过join(';')过滤器用分号连接所有字符串,就能得到你需要的格式,如需调整节点的先后顺序,只需要调整列表内两个元素的位置即可。
方式2:提前定义节点映射列表(适合多节点扩展,可维护性更高)
如果你后续可能增加集群节点,建议先统一定义节点映射列表变量:
pcs_node_map: - host_name: "{{ node2_name }}" vm_name: "{{ vm2_name }}" - host_name: "{{ node1_name }}" vm_name: "{{ vm1_name }}"
后续新增节点只需要往这个列表里加条目即可,任务部分可以通用:
- name: Create stonith shell: pcs stonith create {{ fence_name }} fence_vmware_soap pcmk_host_map="{{ pcs_node_map | map('join', ':') | join(';') }}" ipaddr={{ vcenter_ip }} ssl_insecure=1 login={{ vcenter_username }} passwd={{ vcenter_password }}
这里先用map('join', ':')批量把列表里的每一组主机名、虚拟机名拼接成对应格式的字符串,再用分号连接所有结果。
内容的提问来源于stack exchange,提问作者user3880406
相关产品推荐
相关产品推荐

