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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:06