Compartilhar via


Criar uma máquina virtual do Windows no Azure usando o Ansible

Este artigo mostra como implantar uma VM do Windows Server 2019 no Azure com o Ansible.

Neste artigo, você aprenderá a:

  • Criar um grupo de recursos
  • Criar uma rede virtual, IP público, grupo de segurança de rede e interface de rede
  • Implantar uma máquina virtual do Windows Server
  • Conectar-se à máquina virtual por meio do WinRM
  • Executar um guia estratégico do Ansible para configurar o Windows IIS

Pré-requisitos

  • Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Adicionar suporte do WinRM ao Ansible

Para se comunicar pelo WinRM, o servidor de controle do Ansible precisa do pacote pywinrmpython.

Execute o seguinte comando no servidor Ansible para instalar pywinrm:

pip install "pywinrm>=0.3.0"

Para obter mais informações, consulte o Gerenciamento Remoto do Windows para Ansible.

Criar um grupo de recursos

Crie um guia estratégico do Ansible nomeado azure_windows_vm.yml e copie o seguinte conteúdo para o guia estratégico:

---
- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:

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

Pontos principais:

  • Definindo hosts para localhost e connection para _local_, executa o playbook localmente no servidor Ansible.

Criar a rede virtual e a sub-rede

Adicione as seguintes tarefas ao guia estratégico do azure_windows_vm.yml Ansible para criar uma rede virtual:

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

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

Criar um endereço IP público

Adicione as seguintes tarefas ao azure_windows_vm.yml guia estratégico para criar um endereço IP público:

  - name: Create public IP address
    azure_rm_publicipaddress:
      resource_group: myResourceGroup
      allocation_method: Static
      name: pip
    register: output_ip_address

  - name: Output public IP
    debug:
      msg: "The public IP is {{ output_ip_address.state.ip_address }}"

Pontos principais:

  • O módulo Ansible register é usado para armazenar a saída de azure_rm_publicipaddress em uma variável chamada output_ip_address.
  • O debug módulo é usado para gerar o endereço IP público da VM para o console.

Criar grupo de segurança de rede e NIC

O grupo de segurança de rede define qual tráfego é permitido e não é permitido acessar a VM.

Para abrir as portas WinRM e HTTP, adicione as seguintes tarefas ao guia estratégico do azure_windows_vm.yml Ansible:

  - name: Create Network Security Group
    azure_rm_securitygroup:
      resource_group: myResourceGroup
      name: networkSecurityGroup
      rules:
        - name: 'allow_rdp'
          protocol: Tcp
          destination_port_range: 3389
          access: Allow
          priority: 1001
          direction: Inbound
        - name: 'allow_web_traffic'
          protocol: Tcp
          destination_port_range:
            - 80
            - 443
          access: Allow
          priority: 1002
          direction: Inbound
        - name: 'allow_powershell_remoting'
          protocol: Tcp
          destination_port_range: 
            - 5985
            - 5986
          access: Allow
          priority: 1003
          direction: Inbound

  - name: Create a network interface
    azure_rm_networkinterface:
      name: nic
      resource_group: myResourceGroup
      virtual_network: vNet
      subnet_name: subnet
      security_group: networkSecurityGroup
      ip_configurations:
        - name: default
          public_ip_address_name: pip
          primary: True

Pontos principais:

  • Uma placa de interface de rede virtual conecta sua VM à sua rede virtual, ao endereço IP público e ao grupo de segurança.
  • Cria um grupo de segurança de rede do Azure azure_rm_securitygroup para permitir o tráfego do WinRM do servidor Ansible para o host remoto, permitindo as portas 5985 e 5986.

Criar uma máquina virtual

Em seguida, crie uma máquina virtual que use todos os recursos que você criou nas seções anteriores deste artigo.

Adicione a seguinte tarefa ao guia estratégico do azure_windows_vm.yml Ansible:

  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: myResourceGroup
      name: win-vm
      vm_size: Standard_DS1_v2
      admin_username: azureuser
      admin_password: "{{ password }}"
      network_interfaces: nic
      os_type: Windows
      image:
          offer: WindowsServer
          publisher: MicrosoftWindowsServer
          sku: 2019-Datacenter
          version: latest
    no_log: true

O valor de admin_password é uma variável Ansible que contém a senha da VM do Windows. Para preencher com segurança essa variável, adicione uma var_prompts entrada ao início do guia estratégico.

- name: Create Azure VM
  hosts: localhost
  connection: local
  vars_prompt:
    - name: password
      prompt: "Enter local administrator password"
  tasks:

Pontos principais:

  • Evite armazenar dados confidenciais como texto sem formatação. Use var_prompts para preencher variáveis em tempo de execução. Adicione no_log: true para impedir que senhas sejam registradas.

Configurar o Ouvinte do WinRM

O Ansible usa o PowerShell para se conectar e configurar hosts remotos do Windows por meio do WinRM.

Para configurar o WinRM, adicione a seguinte extensão azure_rm_virtualmachineextension:

  - name: Create VM script extension to enable HTTPS WinRM listener
    azure_rm_virtualmachineextension:
      name: winrm-extension
      resource_group: myResourceGroup
      virtual_machine_name: win-vm
      publisher: Microsoft.Compute
      virtual_machine_extension_type: CustomScriptExtension
      type_handler_version: '1.9'
      settings: '{"fileUris": ["https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
      auto_upgrade_minor_version: true

O Ansible não pode se conectar à VM até que o WinRM esteja totalmente configurado.

Adicione as seguintes tarefas ao seu guia estratégico para aguardar a conexão WinRM:

  - name: Get facts for one Public IP
    azure_rm_publicipaddress_info:
      resource_group: myResourceGroup
      name: pip
    register: publicipaddresses

  - name: set public ip address fact
    set_fact: publicipaddress="{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}"

  - name: wait for the WinRM port to come online
    wait_for:
      port: 5986
      host: '{{ publicipaddress }}'
      timeout: 600

Pontos principais:

  • O azure_rm_virtualmachineextension módulo permite que você execute um script do PowerShell localmente no Azure Windows. Executar o script do PowerShell configura o ConfigureRemotingForAnsible.ps1 WinRM ao criar certificados autoassinados e abrir as portas necessárias para que o Ansible se conecte.
  • O azure_rm_publicipaddress_info módulo consulta o endereço IP público do Azure e set_fact armazena a saída em uma variável para o wait_for módulo a ser usado.

Concluir o guia estratégico do Ansible de exemplo

Esta seção lista todo o guia estratégico do Ansible de exemplo que você criou ao longo deste artigo.

---
- name: Create Azure VM
  hosts: localhost
  connection: local
  vars_prompt:
    - name: password
      prompt: "Enter local administrator password"
  tasks:

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

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

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

  - name: Create public IP address
    azure_rm_publicipaddress:
      resource_group: myResourceGroup
      allocation_method: Static
      name: pip
    register: output_ip_address

  - name: Output public IP
    debug:
      msg: "The public IP is {{ output_ip_address.state.ip_address }}"
  
  - name: Create Network Security Group
    azure_rm_securitygroup:
      resource_group: myResourceGroup
      name: networkSecurityGroup
      rules:
        - name: 'allow_rdp'
          protocol: Tcp
          destination_port_range: 3389
          access: Allow
          priority: 1001
          direction: Inbound
        - name: 'allow_web_traffic'
          protocol: Tcp
          destination_port_range:
            - 80
            - 443
          access: Allow
          priority: 1002
          direction: Inbound
        - name: 'allow_powershell_remoting'
          protocol: Tcp
          destination_port_range: 
            - 5985
            - 5986
          access: Allow
          priority: 1003
          direction: Inbound

  - name: Create a network interface
    azure_rm_networkinterface:
      name: nic
      resource_group: myResourceGroup
      virtual_network: vNet
      subnet_name: subnet
      security_group: networkSecurityGroup
      ip_configurations:
        - name: default
          public_ip_address_name: pip
          primary: True

  - name: Create VM
    azure_rm_virtualmachine:
      resource_group: myResourceGroup
      name: win-vm
      vm_size: Standard_DS1_v2
      admin_username: azureuser
      admin_password: "{{ password }}"
      network_interfaces: nic
      os_type: Windows
      image:
          offer: WindowsServer
          publisher: MicrosoftWindowsServer
          sku: 2019-Datacenter
          version: latest
    no_log: true

  - name: Create VM script extension to enable HTTPS WinRM listener
    azure_rm_virtualmachineextension:
      name: winrm-extension
      resource_group: myResourceGroup
      virtual_machine_name: win-vm
      publisher: Microsoft.Compute
      virtual_machine_extension_type: CustomScriptExtension
      type_handler_version: '1.9'
      settings: '{"fileUris": ["https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
      auto_upgrade_minor_version: true

  - name: Get facts for one Public IP
    azure_rm_publicipaddress_info:
      resource_group: myResourceGroup
      name: pip
    register: publicipaddresses

  - name: set public ip address fact
    set_fact: publicipaddress="{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}"

  - name: wait for the WinRM port to come online
    wait_for:
      port: 5986
      host: '{{ publicipaddress }}'
      timeout: 600

Conectar-se à máquina virtual do Windows

Crie um novo guia estratégico do Ansible chamado connect_azure_windows_vm.yml e copie o seguinte conteúdo para o guia estratégico:

---
- hosts: all
  vars_prompt:
    - name: ansible_password
      prompt: "Enter local administrator password"
  vars:
    ansible_user: azureuser
    ansible_connection: winrm
    ansible_winrm_transport: ntlm
    ansible_winrm_server_cert_validation: ignore
  tasks:

  - name: Test connection
    win_ping:

Execute o guia estratégico do Ansible.

ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,

Substitua <publicIPaddress> pelo endereço da máquina virtual.

Pontos principais:

  • A configuração do Ansible determina como o Ansible se conecta e se autentica a hosts remotos. As variáveis que você precisa definir para se conectar a um host do Windows dependem do tipo de conexão WinRM e da opção de autenticação escolhida. Para obter mais informações, consulte Conectar-se a um host do Windows e opções de autenticação do Windows.
  • Adicionar uma vírgula após o endereço IP público faz com que o analisador de inventário do Ansible seja ignorado. Essa técnica permite que você execute guias estratégicos sem um arquivo de inventário.

Limpar os recursos

  1. Salve o código a seguir como delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Execute o playbook usando o comando ansible-playbook. Substitua o espaço reservado pelo nome do grupo de recursos a ser excluído. Todos os recursos dentro do grupo de recursos serão excluídos.

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

    Pontos principais:

    • Devido ao register variável e à debug seção do livro de estratégias, os resultados são mostrados quando o comando é concluído.

Próximas etapas