使用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生成的配置文件数量与核心数一致
解决方案
核心修改逻辑
- 对Master和Replica列表统一排序,确保两者的索引对应关系稳定
- 为每个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
相关产品推荐
相关产品推荐

