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

使用Ansible为每个Replica IP分配唯一Master IP并生成配置文件

问题:Ansible配置文件生成时Master IP被覆盖的修复

问题场景

需要为inventory中每个Replica IP创建数量与核心数匹配的配置文件,每个Replica分配Master IP列表中对应的唯一Master IP。当前代码中每个Replica会遍历所有Master IP,导致配置文件的Master IP被最后一个覆盖。

现有代码

Ansible Playbook

- name: Create Cluster   
  hosts: primary_ips:replica_ips
  remote_user: "{{ ssh_user }}"
  become: true
  become_method: sudo
  vars:
    ssh_user: "ubuntu"
    gcc_ver: "12"

  tasks:
    - name: Install prereqs on system with apt
      apt:
        name:
          - make
          - pkg-config
          - build-essential
          - "gcc-{{ gcc_ver }}"
          - "g++-{{ gcc_ver }}"
          - zip
          - numactl
        update_cache: yes
        install_recommends: no
      when: ansible_pkg_mgr == "apt"

    - name: Set up Master IPs  
      run_once: true
      when: inventory_hostname in groups['primary_ips'] 
      set_fact:
        master_ips: "{{ groups['primary_ips'] }}"
    
    - name: Create cluster configuration files for the replica
      when: inventory_hostname in groups['replica_ips'] 
      template:
        src: replica.conf.j2
        dest: "/etc/cluster/600{{ item.1 }}/{{ item.1 }}.conf"
      with_nested: 
        - "{{ master_ips}}"
        - "{{ range(0, cores)|list }}"
      vars:
        port_number: "600{{ item.1 }}"
        master_ip: "{{ item.0 }}"

模板文件 replica.conf.j2

port {{ port_number }}
replicaof {{ master_ip }}

Inventory 文件

[primary_ips]
10.1.2.5
10.1.2.4

[replica_ips]
10.1.2.7
10.1.2.6

期望效果

  • master_ips = [10.1.2.4, 10.1.2.5](按inventory排序后)
  • replica_ips = [10.1.2.6, 10.1.2.7](按inventory排序后)
  • Replica 10.1.2.6的所有配置文件均使用Master IP 10.1.2.4
  • Replica 10.1.2.7的所有配置文件均使用Master IP 10.1.2.5
  • 每个Replica生成的配置文件数量与核心数一致

解决方案

核心修改逻辑

  1. 对Master和Replica列表统一排序,确保两者的索引对应关系稳定
  2. 为每个Replica匹配其索引对应的唯一Master IP,避免遍历所有Master导致的覆盖问题

修改后的Playbook

- name: Create Cluster   
  hosts: primary_ips:replica_ips
  remote_user: "{{ ssh_user }}"
  become: true
  become_method: sudo
  vars:
    ssh_user: "ubuntu"
    gcc_ver: "12"
    # 排序Master和Replica列表,保证对应关系不受inventory顺序影响
    sorted_masters: "{{ groups['primary_ips'] | sort }}"
    sorted_replicas: "{{ groups['replica_ips'] | sort }}"

  tasks:
    - name: Install prereqs on system with apt
      apt:
        name:
          - make
          - pkg-config
          - build-essential
          - "gcc-{{ gcc_ver }}"
          - "g++-{{ gcc_ver }}"
          - zip
          - numactl
        update_cache: yes
        install_recommends: no
      when: ansible_pkg_mgr == "apt"

    - name: Assign corresponding Master IP to current Replica
      when: inventory_hostname in groups['replica_ips']
      set_fact:
        assigned_master: "{{ sorted_masters[sorted_replicas.index(inventory_hostname)] }}"
    
    - name: Create configuration directories
      file:
        path: "/etc/cluster/600{{ item }}"
        state: directory
        mode: '0755'
      loop: "{{ range(0, cores)|list }}"
      when: inventory_hostname in groups['replica_ips']

    - name: Generate cluster configuration files for replica
      when: inventory_hostname in groups['replica_ips'] 
      template:
        src: replica.conf.j2
        dest: "/etc/cluster/600{{ item }}/{{ item }}.conf"
        mode: '0644'
      loop: "{{ range(0, cores)|list }}"
      vars:
        port_number: "600{{ item }}"
        master_ip: "{{ assigned_master }}"

关键说明

  • 使用sort过滤器统一排序Master和Replica列表,避免因inventory中主机顺序变化导致对应关系混乱
  • 通过sorted_replicas.index(inventory_hostname)获取当前Replica的索引,匹配同索引的Master IP,实现一对一绑定
  • 移除with_nested,改为直接遍历核心数范围,每个Replica仅使用自身绑定的Master IP生成所有配置文件,彻底解决覆盖问题
  • 新增目录创建步骤,确保配置文件存放目录存在,避免文件写入失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:17:02