Creare un ambiente completo per la macchina virtuale Linux in Azure con Ansible

Ansible consente di automatizzare la distribuzione e la configurazione delle risorse nell'ambiente in uso. È possibile usare Ansible per gestire le macchine virtuali in Azure, così come si farebbe con qualsiasi altra risorsa. In questo articolo viene illustrato come creare un ambiente Linux completo e le risorse di supporto con Ansible. È anche possibile apprendere come creare una macchina virtuale di base con Ansible.

Prerequisiti

Per gestire le risorse di Azure con Ansible, è necessario:

Creare una rete virtuale

La sezione seguente in un playbook Ansible crea una rete virtuale denominata myVnet nello spazio degli indirizzi 10.0.0.0/16:

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

Per aggiungere una subnet, la sezione seguente crea una subnet denominata mySubnet nella rete virtuale myVnet:

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

Creare un indirizzo IP pubblico

Per accedere alle risorse in Internet, creare e assegnare un indirizzo IP pubblico alla macchina virtuale. La sezione seguente in un playbook Ansible crea un indirizzo IP pubblico denominato myPublicIP:

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

Creare un gruppo di sicurezza di rete

I gruppi di sicurezza di rete consentono di controllare il flusso del traffico di rete in ingresso e in uscita dalla macchina virtuale. La sezione seguente in un playbook Ansible crea un gruppo di sicurezza di rete denominato myNetworkSecurityGroup e definisce una regola per consentire il traffico SSH sulla porta TCP 22:

- 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

Creare la scheda di interfaccia di rete virtuale

Una scheda di interfaccia di rete virtuale, NIC, connette la macchina virtuale a una rete virtuale specifica, a un indirizzo IP pubblico e a un gruppo di sicurezza di rete. La sezione seguente in un playbook Ansible crea una scheda di rete virtuale denominata myNIC connessa alle risorse di rete virtuale create:

- name: Create virtual network inteface card
  azure_rm_networkinterface:
    resource_group: myResourceGroup
    name: myNIC
    virtual_network: myVnet
    subnet: mySubnet
    public_ip_name: myPublicIP
    security_group: myNetworkSecurityGroup

Crea macchina virtuale

Il passaggio finale consiste nel creare una macchina virtuale e usare tutte le risorse create. La sezione seguente in un playbook Ansible crea una macchina virtuale denominata myVM e associa la scheda di rete virtuale denominata myNIC. Immettere i propri dati della chiave pubblica nella coppia key_data come indicato di seguito:

- 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: "ssh-rsa AAAAB3Nz{snip}hwhqT9h"
    network_interfaces: myNIC
    image:
      offer: CentOS
      publisher: OpenLogic
      sku: '7.3'
      version: latest

Completare il playbook Ansible

Per unire tutte queste sezioni, creare un playbook Ansible denominato azure_create_vm.yml e incollarvi i contenuti seguenti:

- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:
  - 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
  - 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 inteface 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: "ssh-rsa AAAAB3Nz{snip}hwhqT9h"
      network_interfaces: myNIC
      image:
        offer: CentOS
        publisher: OpenLogic
        sku: '7.3'
        version: latest

Ansible deve distribuire tutte le risorse in un gruppo di risorse. Come prima cosa creare un gruppo di risorse con az group create. L'esempio seguente crea un gruppo di risorse denominato myResourceGroup nella posizione eastus:

az group create --name myResourceGroup --location eastus

Per creare l'ambiente completo per la macchina virtuale con Ansible, eseguire il playbook come segue:

ansible-playbook azure_create_complete_vm.yml

L'output è simile all'esempio seguente che mostra che la macchina virtuale è stata creata correttamente:

PLAY [Create Azure VM] ****************************************************

TASK [Gathering Facts] ****************************************************
ok: [localhost]

TASK [Create virtual network] *********************************************
changed: [localhost]

TASK [Add subnet] *********************************************************
changed: [localhost]

TASK [Create public IP address] *******************************************
changed: [localhost]

TASK [Create Network Security Group that allows SSH] **********************
changed: [localhost]

TASK [Create virtual network inteface card] *******************************
changed: [localhost]

TASK [Create VM] **********************************************************
changed: [localhost]

PLAY RECAP ****************************************************************
localhost                  : ok=7    changed=6    unreachable=0    failed=0

Passaggi successivi

In questo esempio viene creato un ambiente completo della macchina virtuale che include le risorse di rete virtuali necessarie. Per un esempio più diretto che illustri come creare una macchina virtuale nelle risorse di rete esistenti con le opzioni predefinite, vedere Creare una macchina virtuale.