Delen via


Een virtuele Windows-machine maken in Azure met Ansible

In dit artikel wordt beschreven hoe u een virtuele Windows Server 2019-machine implementeert in Azure met Ansible.

In dit artikel leert u het volgende:

  • Een brongroep maken
  • Een virtueel netwerk, openbaar IP-adres, netwerkbeveiligingsgroep en netwerkinterface maken
  • Een virtuele Windows Server-machine implementeren
  • Verbinding maken naar de virtuele machine via WinRM
  • Een Ansible-playbook uitvoeren om Windows IIS te configureren

Vereisten

  • Azure-abonnement: als u nog geen abonnement op Azure hebt, maakt u een gratis Azure-account aan voordat u begint.

WinRM-ondersteuning toevoegen aan Ansible

Voor communicatie via WinRM heeft de Ansible-besturingsserver het Python-pakket pywinrmnodig.

Voer de volgende opdracht uit op de Ansible-server om te installeren pywinrm:

pip install "pywinrm>=0.3.0"

Zie Windows Remote Management voor Ansible voor meer informatie.

Een brongroep maken

Maak een Ansible-playbook met de naam azure_windows_vm.yml en kopieer de volgende inhoud naar het playbook:

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

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

Belangrijkste punten:

  • Instellen hosts op localhost en connection als _local_ het playbook lokaal wordt uitgevoerd op de Ansible-server.

Het virtuele netwerk en subnet maken

Voeg de volgende taken toe aan het azure_windows_vm.yml Ansible-playbook om een virtueel netwerk te maken:

  - 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

Een openbaar IP-adres maken

Voeg de volgende taken toe aan het azure_windows_vm.yml playbook om een openbaar IP-adres te maken:

  - 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 }}"

Belangrijkste punten:

  • Ansible-module register wordt gebruikt om de uitvoer op te slaan in azure_rm_publicipaddress een variabele met de naam output_ip_address.
  • De debug module wordt gebruikt om het openbare IP-adres van de virtuele machine naar de console uit te voeren.

Netwerkbeveiligingsgroep en NIC maken

Netwerkbeveiligingsgroep definieert welk verkeer is toegestaan en niet is toegestaan om de VIRTUELE machine te bereiken.

Als u de WinRM- en HTTP-poorten wilt openen, voegt u de volgende taken toe aan het azure_windows_vm.yml Ansible-playbook:

  - 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

Belangrijkste punten:

  • Een virtuele netwerkinterfacekaart verbindt uw virtuele machine met het virtuele netwerk, het openbare IP-adres en de beveiligingsgroep.
  • Hiermee azure_rm_securitygroup maakt u een Azure-netwerkbeveiligingsgroep om WinRM-verkeer van de Ansible-server naar de externe host toe te staan door poort 5985 en 5986.

Maak een virtuele machine

Maak vervolgens een virtuele machine die gebruikmaakt van alle resources die u in de vorige secties van dit artikel hebt gemaakt.

Voeg de volgende taak toe aan het azure_windows_vm.yml Ansible-playbook:

  - 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

De admin_password waarde van {{ password }} is een Ansible-variabele die het wachtwoord van de Windows-VM bevat. Als u die variabele veilig wilt vullen, voegt u een var_prompts vermelding toe aan het begin van het playbook.

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

Belangrijkste punten:

  • Vermijd het opslaan van gevoelige gegevens als tekst zonder opmaak. Gebruik var_prompts dit om variabelen tijdens runtime in te vullen. Voeg no_log: true toe om te voorkomen dat wachtwoorden worden vastgelegd.

De WinRM-listener configureren

Ansible gebruikt PowerShell om externe Windows-hosts te verbinden en te configureren via WinRM.

Als u WinRM wilt configureren, voegt u de volgende ext azure_rm_virtualmachineextensiontoe:

  - 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

Ansible kan pas verbinding maken met de VIRTUELE machine als WinRM volledig is geconfigureerd.

Voeg de volgende taken toe aan uw playbook om te wachten op de WinRM-verbinding:

  - 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

Belangrijkste punten:

  • azure_rm_virtualmachineextension Met de module kunt u lokaal een PowerShell-script uitvoeren in Azure Windows. Als u het ConfigureRemotingForAnsible.ps1 PowerShell-script uitvoert, configureert u WinRM door zelfondertekende certificaten te maken en de benodigde poorten te openen zodat Ansible verbinding kan maken.
  • De azure_rm_publicipaddress_info module voert een query uit op het openbare IP-adres van Azure en slaat vervolgens set_fact de uitvoer op in een variabele die de wait_for module kan gebruiken.

Volledige voorbeeld van Ansible-playbook

In deze sectie vindt u het volledige Ansible-playbook dat u hebt gemaakt met de verschillende stappen in dit artikel.

---
- 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

Verbinding maken naar de virtuele Windows-machine

Maak een nieuw Ansible-playbook met de naam connect_azure_windows_vm.yml en kopieer de volgende inhoud naar het playbook:

---
- 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:

Voer het Ansible-playbook uit.

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

Vervang <publicIPaddress> door het adres van uw virtuele machine.

Belangrijkste punten:

  • De configuratie van Ansible bepaalt hoe Ansible verbinding maakt en verifieert met externe hosts. De variabelen die u moet definiĆ«ren om verbinding te maken met een Windows-host, zijn afhankelijk van uw WinRM-verbindingstype en de verificatieoptie die u hebt gekozen. Zie Verbinding maken naar een Windows-host en Windows-verificatieopties voor meer informatie.
  • Door een komma toe te voegen nadat het openbare IP-adres de voorraadparser van Ansible heeft overgeslagen. Met deze techniek kunt u playbooks uitvoeren zonder een inventarisbestand.

Resources opschonen

  1. Sla de volgende code op als delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Voer het playbook uit met behulp van de ansible-playbook-opdracht . Vervang de tijdelijke aanduiding door de naam van de resourcegroep die u wilt verwijderen. Alle resources in de resourcegroep worden verwijderd.

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

    Belangrijkste punten:

    • Vanwege de register variabele en debug sectie van het playbook worden de resultaten weergegeven wanneer de opdracht is voltooid.

Volgende stappen