首页 > 解决方案 > 使用 ansible 部署多个虚拟机

问题描述

我正在学习 ansible 在 azure 上创建 Linux VM,并在此链接(https://docs.microsoft.com/en-us/azure/developer/ansible/vm-configure?tabs=ansible)中使用了此示例剧本在 azure 上创建一个 VM。如果我想用 ansible-playbook 完全像这样部署 10 个 VM,我应该怎么做?请帮忙。提前致谢

更新:我尝试过这样,但创建两个公共 IP 地址后脚本失败。

- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:
  - name: Create resource group to hold VM
    azure_rm_resourcegroup:
      name: TestingResource
      location: eastus
  - name: Create virtual network
    azure_rm_virtualnetwork:
      resource_group: TestingResource
      name: testingvnet
      address_prefixes: "10.0.0.0/16"
  - name: Add subnet
    azure_rm_subnet:
      resource_group: TestingResource
      name: testingsubnet
      address_prefix: "10.0.1.0/24"
      virtual_network: testingvnet
  - name: Create public IP address
    azure_rm_publicipaddress:
      resource_group: TestingResource
      allocation_method: Static
      name: "{{ item }}" #CHANGE HERE
    loop:
       - testingpublicIP2
       - testingpublicIP3  
    register: output_ip_address
  #- name: Dump public IP for VM which will be created
    #debug:
      #msg: "The public IP is {{ output_ip_address.state.ip_address }}."
  - name: Create Network Security Group that allows SSH
    azure_rm_securitygroup:
      resource_group: TestingResource
      name: TestingSecurityGroup
      rules:
        - name: SSH
          protocol: Tcp
          destination_port_range: 22
          access: Allow
          priority: 1001
          direction: Inbound
  - name: Create virtual network interface card
    azure_rm_networkinterface:
      resource_group: TestingResource
      name: "{{ item }}" #CHANGE HERE
      loop:
         - TestingNIC2
         - TestingNIC3
      virtual_network: testingvnet
      subnet: testingsubnet
      public_ip_name: "{{ item }}" #CHANGE HERE
      loop:
        - testingpublicIP2
        - testingpublicIP3
      security_group: TestingSecurityGroup
  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: TestingResource
      name: "{{ item }}" #CHANGE HERE VM NAME
      loop:
        - TestingResource2
        - TestingResource3
      vm_size: Standard_B2s
      admin_username: admin
      admin_password: password@123 
      ssh_password_enabled: true
      network_interfaces: "{{ item }}" #CHANGE HERE
      loop: 
         - TestingNIC2
         - TestingNIC3
      image:
        offer: UbuntuServer
        publisher: Canonical
        sku: '18.04-LTS'
        version: latest

标签: azureansibleazure-vm

解决方案


您可以使用loops函数通过ansible创建多个VM,如您在问题中所示,但您最好使用列表变量进行循环,这样您就不需要每次都编写所有元素。并且这些变量还可以用于在代码中多次使用的资源组名称、位置等其他内容。这是示例:

- hosts: localhost
  vars:
    resource_group: myResourceGroup
    ...
  tasks:
  - name: Create resource group to hold VM
    azure_rm_resourcegroup:
      name: "{{ resource_group }}"
      location: eastus
  ...

以及循环的变量:

loop: "{{ var_list }}"

推荐阅读