使用 Ansible 在 Azure 中创建 Linux 虚拟机

本文提供了一个用于配置 Linux 虚拟机的示例 Ansible playbook。

在本文中,学习如何:

  • 创建资源组
  • 创建虚拟网络
  • 创建公共 IP 地址
  • 创建网络安全组
  • 创建虚拟网络接口卡
  • 创建虚拟机

1.配置环境

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

2. 创建 SSH 密钥对

  1. 运行以下命令。 出现提示时,请指定要在以下目录中创建的文件:/home/azureuser/.ssh/authorized_keys

    ssh-keygen -m PEM -t rsa -b 4096
    
  2. 复制公钥文件的内容。 默认情况下,公钥文件命名为 id_rsa.pub。 该值是以“ssh-rsa”开头的长字符串。 在以下步骤中将需要此值。

3. 实现 Ansible playbook

  1. 创建用于测试和运行示例 Ansible 代码的目录,并将其设为当前目录。

  2. 创建名为 main.yml 的文件并插入下列代码。 将 <key_data> 占位符替换为上一步中的公钥值。

    - name: Create Azure VM
      hosts: localhost
      connection: local
      tasks:
      - name: Create resource group
        azure_rm_resourcegroup:
          name: myResourceGroup
          location: eastus
      - name: Create virtual network
        azure_rm_virtualnetwork:
          resource_group: myResourceGroup
          name: myVnet
          address_prefixes: "10.0.0.0/16"
      - name: Add subnet
        azure_rm_subnet:
          resource_group: myResourceGroup
          name: mySubnet
          address_prefix: "10.0.1.0/24"
          virtual_network: myVnet
      - name: Create public IP address
        azure_rm_publicipaddress:
          resource_group: myResourceGroup
          allocation_method: Static
          name: myPublicIP
        register: output_ip_address
      - name: Public IP of VM
        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: myResourceGroup
          name: myNetworkSecurityGroup
          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: myResourceGroup
          name: myNIC
          virtual_network: myVnet
          subnet: mySubnet
          public_ip_name: myPublicIP
          security_group: myNetworkSecurityGroup
      - name: Create VM
        azure_rm_virtualmachine:
          resource_group: myResourceGroup
          name: myVM
          vm_size: Standard_DS1_v2
          admin_username: azureuser
          ssh_password_enabled: false
          ssh_public_keys:
            - path: /home/azureuser/.ssh/authorized_keys
              key_data: "<key_data>"
          network_interfaces: myNIC
          image:
            offer: 0001-com-ubuntu-server-jammy
            publisher: Canonical
            sku: 22_04-lts
            version: latest
    

4. 运行 playbook

使用 ansible-playbook 运行 Ansible playbook。

ansible-playbook main.yml

5. 验证结果

运行 az vm list 验证 VM 是否已创建。

az vm list -d -o table --query "[?name=='myVM']"

6. 连接到 VM

运行 SSH 命令以连接到新的 Linux VM。 将 <ip-address> 占位符替换为上一步骤中的 IP 地址。

ssh azureuser@<ip_address> -i /home/azureuser/.ssh/authorized_keys/id_rsa

清理资源

  1. 将以下代码另存为 delete_rg.yml

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. 使用 ansible-playbook 命令运行 playbook。 将占位符替换为要删除的资源组的名称。 将删除资源组内的所有资源。

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    要点

    • 由于 playbook 的 register 变量和 debug 部分,因此在命令完成时,将显示结果。

后续步骤