Skip to content

can not update network config of openeuler #6513

@13567436138

Description

@13567436138
1. 1变量定义 (group_vars/cn-sh-region.yaml)
base_image: "/var/lib/libvirt/images/openeuler-24-03.img"
gateway: "192.168.10.99"
dns_servers:
  - "8.8.8.8"
  - "8.8.4.4"
nodes:
  # openebs-01 集群
  - name: openebs-01-b
    ip: 192.168.10.103
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-01
    cluster: openebs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: openebs-01-c
    ip: 192.168.10.104
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-01
    cluster: openebs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: openebs-01-d
    ip: 192.168.10.105
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-01
    cluster: openebs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: openebs-01-e
    ip: 192.168.10.106
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-01
    cluster: openebs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  # minio-quay-01 集群
  - name: minio-01-b
    ip: 192.168.10.107
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-02
    cluster: minio-quay-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: minio-01-c
    ip: 192.168.10.108
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-02
    cluster: minio-quay-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: minio-01-d
    ip: 192.168.10.109
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-02
    cluster: minio-quay-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  - name: minio-01-e
    ip: 192.168.10.110
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-02
    cluster: minio-quay-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G
      - size: 100G
      - size: 100G

  # juicefs-01 集群
  - name: juicefs-01-b
    ip: 192.168.10.111
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-03
    cluster: juicefs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G

  - name: juicefs-01-c
    ip: 192.168.10.112
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-03
    cluster: juicefs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G

  - name: juicefs-01-d
    ip: 192.168.10.113
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-03
    cluster: juicefs-01
    vcpus: 6
    memory: 20480
    disks: 
      - size: 100G
      - size: 100G

  # kamaji-manager-01 集群
  - name: kamaji-manager-01-a
    ip: 192.168.10.114
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-04
    cluster: kamaji-manager-01
    vcpus: 4
    memory: 10240
    disks: 
      - size: 100G

  - name: kamaji-manager-01-b
    ip: 192.168.10.115
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-04
    cluster: kamaji-manager-01
    vcpus: 10
    memory: 40960
    disks: 
      - size: 100G

  - name: kamaji-manager-01-c
    ip: 192.168.10.116
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-04
    cluster: kamaji-manager-01
    vcpus: 10
    memory: 40960
    disks: 
      - size: 100G

  - name: kamaji-manager-01-d
    ip: 192.168.10.117
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-04
    cluster: kamaji-manager-01
    vcpus: 10
    memory: 40960
    disks: 
      - size: 100G

  # sveltos-member-01 集群
  - name: sveltos-member-01-b
    ip: 192.168.10.118
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-05
    cluster: sveltos-member-01
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  - name: sveltos-member-01-c
    ip: 192.168.10.119
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-05
    cluster: sveltos-member-01
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  - name: sveltos-member-01-d
    ip: 192.168.10.120
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-05
    cluster: sveltos-member-01
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  # sveltos-member-02 集群
  - name: sveltos-member-02-b
    ip: 192.168.10.121
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-06
    cluster: sveltos-member-02
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  - name: sveltos-member-02-c
    ip: 192.168.10.122
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-06
    cluster: sveltos-member-02
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  - name: sveltos-member-02-d
    ip: 192.168.10.123
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-06
    cluster: sveltos-member-02
    vcpus: 8
    memory: 61440
    disks: 
      - size: 100G

  # sveltos-member-03 集群
  - name: sveltos-member-03-b
    ip: 192.168.10.124
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-07
    cluster: sveltos-member-03
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G

  - name: sveltos-member-03-c
    ip: 192.168.10.125
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-07
    cluster: sveltos-member-03
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G

  - name: sveltos-member-03-d
    ip: 192.168.10.126
    region: cn-sh
    zone: cn-sh-1b
    subzone: rack-07
    cluster: sveltos-member-03
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G

  # sveltos-member-04 集群
  - name: sveltos-member-04-b
    ip: 192.168.10.127
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-08
    cluster: sveltos-member-04
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G

  - name: sveltos-member-04-c
    ip: 192.168.10.128
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-08
    cluster: sveltos-member-04
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G

  - name: sveltos-member-04-d
    ip: 192.168.10.129
    region: cn-sh
    zone: cn-sh-1a
    subzone: rack-08
    cluster: sveltos-member-04
    vcpus: 10
    memory: 102400
    disks: 
      - size: 100G
2. 模板文件

templates/metadata.j2

instance-id: {{ item.name }}
local-hostname: {{ item.name }}

templates/user-data.j2

#cloud-config
users:
  - name: mark
    plain_text_passwd: M_ark123abc
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    lock_passwd: false
    ssh-authorized-keys:
    - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxy8LShsTNFa0EjFeSDRpP/+uEPUC+gXbPCz5FWe3WD root@ubuntu
  - name: root
    lock_passwd: false
    plain_text_passwd: M_ark123abc 
    ssh-authorized-keys:
    - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxy8LShsTNFa0EjFeSDRpP/+uEPUC+gXbPCz5FWe3WD root@ubuntu

hostname: {{ item.name }}
ssh_pwauth: True
network:
  config: disabled

runcmd:
  - |
      # 配置网络
      cat > /etc/sysconfig/network-scripts/ifcfg-enp1s0 << EOF
      TYPE=Ethernet
      PROXY_METHOD=none
      BROWSER_ONLY=no
      BOOTPROTO=none
      DEFROUTE=yes
      IPV4_FAILURE_FATAL=no
      IPV6INIT=yes
      IPV6_AUTOCONF=yes
      IPV6_DEFROUTE=yes
      IPV6_FAILURE_FATAL=no
      IPV6_ADDR_GEN_MODE=stable-privacy
      NAME=enp1s0
      DEVICE=enp1s0
      ONBOOT=yes
      IPADDR={{ item.ip }}
      PREFIX=24
      GATEWAY={{ gateway }}
      DNS1={{ dns_servers[0] }}
      DNS2={{ dns_servers[1] }}
      EOF
  - |
      # 重启网络
      systemctl restart NetworkManager
  - |
      # 安装 openssh-server
      yum update -y || apt-get update
      yum install -y openssh-server || apt-get install -y openssh-server
  - |
      # 配置 SSH
      sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
      sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
      systemctl restart sshd
      systemctl enable sshd

templates/network-config.j2

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp1s0
DEVICE=enp1s0
ONBOOT=yes
IPADDR={{ item.ip }}
PREFIX=24
GATEWAY={{ gateway }}
DNS1={{ dns_servers[0] }}
DNS2={{ dns_servers[1] }}
3. 1Ansible Playbook (create-vm-sh.yaml)
- name: 批量创建云虚拟机
  hosts: localhost
  gather_facts: false
  vars_files:
    - group_vars/cn-sh-region.yaml

  tasks:
    - name: 创建存储目录
      ansible.builtin.file:
        path: "/var/lib/libvirt/{{ item.zone }}/"
        state: directory
        mode: '0755'
      loop: "{{ nodes }}"
      loop_control:
        label: "{{ item.zone }}"


    - name: 创建 cloud-init 配置目录
      ansible.builtin.file:
        path: "cloud-init/configs"
        state: directory
        mode: '0755'

    - name: 生成 metadata 配置
      ansible.builtin.template:
        src: "templates/metadata.j2"
        dest: "cloud-init/configs/{{ item.name }}-metadata.yaml"
      loop: "{{ nodes }}"

    - name: 生成 user-data 配置
      ansible.builtin.template:
        src: "templates/user-data.j2"
        dest: "cloud-init/configs/{{ item.name }}-user-data.yaml"
      loop: "{{ nodes }}"
      
    - name: 生成 network 配置文件
      ansible.builtin.template:
        src: "templates/network-config.j2"
        dest: "cloud-init/configs/{{ item.name }}-network-config"
      loop: "{{ nodes }}"

    - name: 生成 cloud-init ISO
      ansible.builtin.command: 
        cmd: >
          cloud-localds
          /var/lib/libvirt/images/{{ item.zone }}/{{ item.name }}-init.iso
          cloud-init/configs/{{ item.name }}-user-data.yaml
          cloud-init/configs/{{ item.name }}-metadata.yaml
      loop: "{{ nodes }}"
         

    - name: 创建虚拟机磁盘
      ansible.builtin.command:
        cmd: >
          qemu-img create -f qcow2 -b {{ base_image }} 
          -F qcow2 /var/lib/libvirt/disk/{{ item.zone }}/{{ item.name }}.qcow2 
          {{ item.disks[0].size }}
      loop: "{{ nodes }}"

    - name: 创建虚拟机实例
      ansible.builtin.command:
        cmd: |
          virt-install --name={{ item.name }}  --memory={{ item.memory }} --vcpus={{ item.vcpus }} --disk path=/var/lib/libvirt/disk/{{ item.zone }}/{{ item.name }}.qcow2,format=qcow2 --disk path=/var/lib/libvirt/images/{{ item.zone }}/{{ item.name }}-init.iso,device=cdrom --network bridge=br0,model=virtio --os-type=linux --os-variant=rocky9 --graphics=none --console=pty,target_type=serial --import --boot=hd
      loop: "{{ nodes }}"
      throttle: 20  # 不同任务设置不同并发度

    - name: 等待虚拟机启动
      ansible.builtin.pause:
        minutes: 2
        
    - name: 验证虚拟机网络
      ansible.builtin.wait_for:
        host: "{{ item.ip }}"
        port: 22
        timeout: 300
        state: started
      loop: "{{ nodes }}"
      ignore_errors: yes

    - name: 显示虚拟机状态
      debug:
        msg: "虚拟机 {{ item.name }} ({{ item.ip }}) 创建完成"
      loop: "{{ nodes }}"
4. 执行部署
# 安装依赖
sudo apt-get install cloud-utils genisoimage libguestfs-tools
apt install ansible-core


apt-get install python3-lxml


mkdir cloud-init/configs -p
mkdir /var/lib/libvirt/images/{cn-sh-1b,cn-sh-1a,cn-hz-1b,cn-hz-1a} -p
mkdir /var/lib/libvirt/disk/{cn-sh-1b,cn-sh-1a,cn-hz-1b,cn-hz-1a} -p

# 运行 Playbook
ansible-playbook create-vm-sh.yaml

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:05:2e:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.10.83/24 brd 192.168.10.255 scope global dynamic noprefixroute enp1s0
valid_lft 84575sec preferred_lft 84575sec
inet6 2409:8a28:2cd4:3a41::9ac/128 scope global dynamic noprefixroute
valid_lft 1783sec preferred_lft 1783sec
inet6 2409:8a28:2cd4:3a41:5054:ff:fe05:2eeb/64 scope global dynamic noprefixroute
valid_lft 3584sec preferred_lft 3584sec
inet6 fe80::5054:ff:fe05:2eeb/64 scope link noprefixroute
valid_lft forever preferred_lft forever

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions