快速入门:使用 Ansible 在 Azure 中配置 Linux 虚拟机

Ansible 使用声明性语言,适用于通过 Ansible playbook 来自动完成 Azure 资源的创建、配置和部署。 本文提供了一个用于配置 Linux 虚拟机的示例 Ansible playbook。 完整的 Ansible playbook 列在本文末尾。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始前创建一个试用订阅
  • 安装 Ansible

创建资源组

Ansible 需要一个在其中部署了资源的资源组。 以下示例 Ansible playbook 部分在 chinaeast 位置创建名为 myResourceGroup 的资源组:

- name: Create resource group
  azure_rm_resourcegroup:
    name: myResourceGroup
    location: chinaeast

创建虚拟网络

创建 Azure 虚拟机时,必须创建虚拟网络或使用现有的虚拟网络。 此外,还需要确定如何在虚拟网络上访问虚拟机。 以下示例 Ansible playbook 部分在 10.0.0.0/16 地址空间中创建名为 myVnet 的虚拟网络:

- name: Create virtual network
  azure_rm_virtualnetwork:
    resource_group: myResourceGroup
    name: myVnet
    address_prefixes: "10.0.0.0/16"

部署到虚拟网络的所有 Azure 资源都将部署到虚拟网络内的子网中。

以下示例 Ansible playbook 部分在 myVnet 虚拟网络中创建名为 mySubnet 的子网:

- name: Add subnet
  azure_rm_subnet:
    resource_group: myResourceGroup
    name: mySubnet
    address_prefix: "10.0.1.0/24"
    virtual_network: myVnet

创建公共 IP 地址

公共 IP 地址允许 Internet 资源与 Azure 资源进行入站通信。 公共 IP 地址还使 Azure 资源能够与面向公众的 Azure 服务进行出站通信。 在这两种方案中,为分配给正在访问的资源的 IP 地址。 此地址专门用于该资源,直到你对其取消分配。 如果未将资源分配给公共 IP 地址,则资源仍可以通过 Internet 进行出站通信。 此连接通过 Azure 动态分配可用的 IP 地址进行创建。 动态分配的地址不专用于该资源。

以下示例 Ansible playbook 部分创建名为 myPublicIP 的公共 IP 地址:

- name: Create public IP address
  azure_rm_publicipaddress:
    resource_group: myResourceGroup
    allocation_method: Static
    name: myPublicIP

创建网络安全组

网络安全组筛选虚拟网络中 Azure 资源之间的网络流量。 定义安全规则,用于管理进出 Azure 资源的入站和出站流量。 有关 Azure 资源和网络安全组的详细信息,请参阅 Azure 服务的虚拟网络集成

以下 playbook 创建名为 myNetworkSecurityGroup 的网络安全组。 网络安全组包括一条规则,允许 TCP 端口 22 上的 SSH 流量。

- 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

创建虚拟网络接口卡

虚拟网络接口卡将虚拟机连接到规定的虚拟网络、公共 IP 地址和网络安全组。

示例 Ansible playbook 部分中的以下部分创建名为 myNIC 的虚拟网络接口卡,该卡连接到已创建的虚拟网络资源:

- 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

创建虚拟机

最后一步是创建虚拟机,该虚拟机使用在本文的前述部分创建的所有资源。

在此部分提供的示例 Ansible playbook 部分创建名为 myVM 的虚拟机,并附加名为 myNIC 的虚拟网络接口卡。 将 <your-ssh-public-key-data> 占位符替换为你自己的完整公钥数据。

- 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: <your-ssh-public-key-data>
    network_interfaces: myNIC
    image:
      offer: CentOS
      publisher: OpenLogic
      sku: '7.5'
      version: latest

完整的示例 Ansible playbook

此部分列出在本文中从头至尾生成的整个示例 Ansible playbook。

- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:
  - name: Create resource group
    azure_rm_resourcegroup:
      name: myResourceGroup
      location: chinaeast
  - 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: 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: 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: <your-ssh-public-key-data>
      network_interfaces: myNIC
      image:
        offer: CentOS
        publisher: OpenLogic
        sku: '7.5'
        version: latest

运行示例 Ansible playbook

此部分详述如何运行在本文中提供的示例 Ansible playbook。

  1. 登录 Azure 门户

  2. 使用 SSH 命令访问已在先决条件部分中成功安装并配置了 Ansible 的 Linux 虚拟机。 将 <ip-address> 占位符替换为 Linux VM 中的实际 IP 地址。

    ssh azureuser@<ip-address>
    
  3. 创建名为 azure_create_complete_vm.yml 的文件(用于包含 playbook)并在 VI 编辑器中将其打开,如下所示:

    vi azure_create_complete_vm.yml
    
  4. I 键进入插入模式。

  5. 完整的示例 Ansible playbook 粘贴到编辑器中。

  6. Esc 键退出插入模式。

  7. 保存文件,然后输入以下命令退出 vi 编辑器:

    :wq
    
  8. 运行示例 Ansible playbook。

    ansible-playbook azure_create_complete_vm.yml
    
  9. 输出如下所示,其中可以看到虚拟机已成功创建:

    PLAY [Create Azure VM] ****************************************************
    
    TASK [Gathering Facts] ****************************************************
    ok: [localhost]
    
    TASK [Create resource group] *********************************************
    changed: [localhost]
    
    TASK [Create virtual network] *********************************************
    changed: [localhost]
    
    TASK [Add subnet] *********************************************************
    changed: [localhost]
    
    TASK [Create public IP address] *******************************************
    changed: [localhost]
    
    TASK [Dump public IP for VM which will be created] ********************************************************************
    ok: [localhost] => {
      "msg": "The public IP is <ip-address>."
    }
    
    TASK [Create Network Security Group that allows SSH] **********************
    changed: [localhost]
    
    TASK [Create virtual network interface card] *******************************
    changed: [localhost]
    
    TASK [Create VM] **********************************************************
    changed: [localhost]
    
    PLAY RECAP ****************************************************************
    localhost                  : ok=8    changed=7    unreachable=0    failed=0
    
  10. SSH 命令用于访问 Linux VM。 将 <ip-address> 占位符替换为上一步骤中的 IP 地址。

    ssh azureuser@<ip-address>
    

后续步骤