如何通过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
相关产品推荐
相关产品推荐

