基于Azure官方Ansible示例批量部署10台Linux VM的方法及脚本报错排查
Ansible批量部署Azure Linux VM实现指南及现有脚本问题修复
一、现有脚本的核心报错原因
脚本运行失败均为Ansible语法与逻辑层面的硬错误,具体对应问题如下:
- 单任务重复定义
loop关键字:Ansible规定每个任务仅能配置一个循环入口,在创建NIC、创建VM的任务块中先后两次写入loop参数,会直接触发Ansible语法解析失败,任务根本无法进入资源创建逻辑。 - 跨资源关联映射缺失:多次分散循环的写法会导致NIC、公网IP、VM的名称没有一一绑定,即便去掉重复loop的语法问题,也会出现资源错配(比如某块NIC绑定了不属于它的公网IP)。
- 资源命名逻辑错误:VM创建任务里的循环列表直接写了
TestingResource2/TestingResource3,本质是把资源组的命名规则套用到了VM实例上,不符合Azure资源命名规范。 - 公共资源的重复创建风险:如果按原循环逻辑套用到10台VM的场景,共享的资源组、虚拟网络、子网、网络安全组会被重复创建10次,不仅浪费资源,还会触发Azure的资源命名冲突报错。
二、批量部署的标准实现思路
批量部署和单台部署的核心差异是区分全局共享资源和单VM独立资源,避免无意义的重复操作:
- 全局共享资源(资源组、虚拟网络、子网、SSH放行规则的安全组)仅执行一次创建操作,10台VM全部复用同一套网络基础,不需要单独为每台VM建独立网络。
- 单VM独立资源(公网IP、网卡、VM实例)通过统一的循环列表实现绑定,每台VM对应的公网IP、网卡、VM名保持命名规则统一,一一映射,杜绝错配。
- 不需要手动逐台写循环条目,通过Ansible内置的range函数直接生成1-10的序号列表,减少手动配置的出错概率。
三、可直接运行的批量部署Playbook示例
以下脚本完全匹配参考单台部署的配置参数,可直接实现10台同规格Ubuntu VM的批量创建:
- name: Batch Create Azure Linux VMs hosts: localhost connection: local vars: # 批量生成10台VM的标识序号,对应VM1到VM10 vm_identifier_list: "{{ range(1, 11) | list }}" tasks: # 以下为全局共享资源,仅创建1次 - name: Create shared resource group azure_rm_resourcegroup: name: TestingResource location: eastus - name: Create shared virtual network azure_rm_virtualnetwork: resource_group: TestingResource name: testingvnet address_prefixes: "10.0.0.0/16" - name: Create shared subnet azure_rm_subnet: resource_group: TestingResource name: testingsubnet address_prefix: "10.0.1.0/24" virtual_network: testingvnet - name: Create shared security group with SSH rule azure_rm_securitygroup: resource_group: TestingResource name: TestingSecurityGroup rules: - name: SSH protocol: Tcp destination_port_range: 22 access: Allow priority: 1001 direction: Inbound # 以下为每台VM的独立资源,通过统一循环一一绑定 - name: Create public IP for each VM azure_rm_publicipaddress: resource_group: TestingResource allocation_method: Static name: "testingpublicIP{{ item }}" loop: "{{ vm_identifier_list }}" - name: Create network interface for each VM azure_rm_networkinterface: resource_group: TestingResource name: "TestingNIC{{ item }}" virtual_network: testingvnet subnet: testingsubnet public_ip_name: "testingpublicIP{{ item }}" security_group: TestingSecurityGroup loop: "{{ vm_identifier_list }}" - name: Create each Linux VM azure_rm_virtualmachine: resource_group: TestingResource name: "TestingVM{{ item }}" vm_size: Standard_B2s admin_username: admin admin_password: "{{ vault_admin_password }}" # 建议用Ansible Vault加密密码,不要硬编码 ssh_password_enabled: true network_interfaces: "TestingNIC{{ item }}" image: offer: UbuntuServer publisher: Canonical sku: '18.04-LTS' version: latest loop: "{{ vm_identifier_list }}"
四、运行注意事项
- 执行前提前确认eastus区域的Azure订阅配额,确保可创建10个Standard_B2s规格VM、10个静态公网IP,避免配额不足导致的创建失败。
- 硬编码的
admin_password在生产环境中请替换为Ansible Vault加密的变量,避免明文密码泄露。 - 脚本中所有资源的规格、镜像、配置完全和之前单台部署的示例保持一致,不会出现配置偏差。
内容的提问来源于stack exchange,提问作者Richard Phillips Roy
相关产品推荐
相关产品推荐

