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

如何通过Shell脚本并行创建多个AKS集群?及Ansible实现方案咨询

实现AKS集群并行创建的两种方案(Shell脚本 + Ansible)

一、Shell脚本快速实现并行创建

你的现有脚本是串行执行逻辑,要改成并行非常简单——只需要把az aks create命令放到后台执行(用&符号),最后用wait命令等待所有后台任务完成即可。不过要注意循环中变量的作用域问题,避免多个后台进程复用同一个变量值,这里推荐用函数封装创建逻辑,确保每个后台进程拿到独立的参数:

#!/bin/bash

# 封装AKS创建逻辑为函数,确保变量独立
create_aks() {
    local aks_name=$1
    # 这里可以添加其他固定/可变的AKS配置变量
    local resource_group="my-shared-aks-rg"
    local node_count=2
    local k8s_version="1.28.3"

    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始创建集群: $aks_name"
    az aks create \
        --name "$aks_name" \
        --resource-group "$resource_group" \
        --node-count "$node_count" \
        --kubernetes-version "$k8s_version" \
        --generate-ssh-keys \
        # 在这里补充你的其他AKS创建参数
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 集群 $aks_name 创建流程结束"
}

# 循环启动并行任务
cnt=1
while [ $cnt -lt 3 ]
do
    aksName="AKS0$cnt"
    # 后台执行创建函数,不阻塞当前循环
    create_aks "$aksName" &
    cnt=$(expr $cnt + 1)
done

# 等待所有后台进程执行完毕再退出脚本
wait
echo "所有AKS集群创建任务已全部完成"

关键细节说明:

  • &:将命令放入后台执行,当前shell会直接继续下一次循环,不会等待单个任务结束
  • wait:阻塞脚本执行,直到所有后台进程都完成,避免脚本提前退出导致任务失控
  • local关键字:在函数内定义局部变量,彻底避免不同后台进程之间的变量干扰
  • 如果需要限制并发数量(比如避免同时创建过多集群触发Azure资源配额限制),可以用xargs -P来精准控制:
# 用seq生成集群序号,xargs限制最多2个并行任务
seq 1 2 | xargs -I {} -P 2 bash -c 'az aks create --name AKS0{} --resource-group my-shared-aks-rg --node-count 2 --generate-ssh-keys'

二、用Ansible实现更可控的并行创建

Ansible完全可以实现AKS集群的并行创建,而且比Shell脚本更易于维护、自带错误重试和状态管理,推荐使用官方的azure_rm_aks模块(而非直接调用az cli),结合异步执行来实现:

方案1:异步执行+定期轮询状态

通过async和poll参数让每个AKS创建任务后台运行,Ansible会定期检查任务状态直到完成:

- name: 并行创建AKS集群
  hosts: localhost
  gather_facts: no
  vars:
    resource_group: my-shared-aks-rg
    ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..."  # 替换为你的SSH公钥
    aks_clusters:
      - AKS01
      - AKS02
  tasks:
    - name: 启动AKS集群创建任务(并行执行)
      azure_rm_aks:
        name: "{{ item }}"
        resource_group: "{{ resource_group }}"
        node_count: 2
        kubernetes_version: "1.28.3"
        ssh_key: "{{ ssh_public_key }}"
        # 补充你的其他AKS配置参数,比如节点VM规格、网络插件等
      async: 3600  # 任务最长允许运行时间(秒),AKS创建通常需10-20分钟
      poll: 30     # 每隔30秒检查一次任务状态
      loop: "{{ aks_clusters }}"

方案2:后台批量启动+统一等待结果

如果希望所有任务瞬间启动,之后统一等待全部完成,可以用poll: 0让任务立即后台执行,再用async_status收集结果:

- name: 批量并行创建AKS集群
  hosts: localhost
  gather_facts: no
  vars:
    resource_group: my-shared-aks-rg
    ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..."
    aks_clusters:
      - AKS01
      - AKS02
    async_job_list: []
  tasks:
    - name: 批量启动AKS创建后台任务
      azure_rm_aks:
        name: "{{ item }}"
        resource_group: "{{ resource_group }}"
        node_count: 2
        ssh_key: "{{ ssh_public_key }}"
      async: 3600
      poll: 0
      register: job_result
      loop: "{{ aks_clusters }}"
      # 收集每个任务的ID和集群名称,方便后续跟踪
      set_fact:
        async_job_list: "{{ async_job_list + [{'job_id': job_result.results[loop.index0].ansible_job_id, 'cluster_name': item}] }}"

    - name: 等待所有AKS创建任务完成
      async_status:
        jid: "{{ item.job_id }}"
      register: job_status
      until: job_status.finished
      retries: 60  # 重试60次,每次间隔30秒,总等待时长30分钟
      delay: 30
      loop: "{{ async_job_list }}"
      loop_control:
        label: "{{ item.cluster_name }}"  # 输出时显示集群名称,更直观

Ansible实现的优势:

  • 自带状态检查和重试机制,无需手动处理网络波动、Azure临时限流等问题
  • 配置集中管理,修改集群参数、新增集群只需要调整变量列表即可
  • 可以无缝集成到Ansible的后续工作流中(比如集群初始化、应用部署等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:58:15