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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:27:01