Freigeben über


Erstellen eines virtuellen Windows-Computers in Azure mithilfe von Ansible

In diesem Artikel wird gezeigt, wie Sie eine Windows Server 2019-VM in Azure mit Ansible bereitstellen.

In diesem Artikel erfahren Sie, wie Sie:

  • Erstellen einer Ressourcengruppe
  • Erstellen eines virtuellen Netzwerks, einer öffentlichen IP, einer Netzwerksicherheitsgruppe und einer Netzwerkschnittstelle
  • Bereitstellen eines virtuellen Windows Server-Computers
  • Herstellen einer Verbindung mit dem virtuellen Computer über WinRM
  • Ausführen eines Ansible Playbook zum Konfigurieren von Windows IIS

Voraussetzungen

  • Azure-Abonnement: Wenn Sie nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

Hinzufügen der WinRM-Unterstützung zu Ansible

Um über WinRM zu kommunizieren, benötigt ansible Control Server das Python-Paket pywinrm.

Führen Sie zum Installieren pywinrmden folgenden Befehl auf dem Ansible-Server aus:

pip install "pywinrm>=0.3.0"

Weitere Informationen finden Sie unter Windows-Remoteverwaltung für Ansible.

Erstellen einer Ressourcengruppe

Erstellen Sie ein Ansible-Playbook mit dem Namen azure_windows_vm.yml, und kopieren Sie den folgenden Inhalt in das Playbook:

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

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

Wichtige Punkte:

  • Die Einstellung von hosts auf localhost und connection auf _local_ führt das Playbook lokal auf dem Ansible-Server aus.

Erstellen des virtuellen Netzwerks und des Subnetzes

Fügen Sie dem azure_windows_vm.yml Ansible Playbook die folgenden Aufgaben hinzu, um ein virtuelles Netzwerk zu erstellen:

  - 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

Erstellen einer öffentlichen IP-Adresse

Fügen Sie dem azure_windows_vm.yml Playbook die folgenden Aufgaben hinzu, um eine öffentliche IP-Adresse zu erstellen:

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

Wichtige Punkte:

  • Das Ansible register Modul wird verwendet, um die Ausgabe von azure_rm_publicipaddress in einer Variable namens output_ip_address zu speichern.
  • Das debug Modul wird verwendet, um die öffentliche IP-Adresse des virtuellen Computers an die Konsole auszugeben.

Erstellen von Netzwerksicherheitsgruppen und NIC

Die Netzwerksicherheitsgruppe definiert, welcher Datenverkehr zulässig ist und nicht die VM erreichen darf.

Um die WinRM- und HTTP-Ports zu öffnen, fügen Sie dem azure_windows_vm.yml Ansible Playbook die folgenden Aufgaben hinzu:

  - 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

Wichtige Punkte:

  • Eine Karte der virtuellen Netzwerkschnittstelle verbindet Ihren virtuellen Computer mit seinem virtuellen Netzwerk, der öffentlichen IP-Adresse und der Sicherheitsgruppe.
  • Die azure_rm_securitygroup erstellt eine Azure-Netzwerksicherheitsgruppe, um WinRM-Datenverkehr vom Ansible-Server zum Remotehost zuzulassen, indem die Ports 5985 und 5986 zugelassen werden.

Erstellen eines virtuellen Computers

Erstellen Sie als Nächstes einen virtuellen Computer, der alle Ressourcen verwendet, die Sie in den vorherigen Abschnitten dieses Artikels erstellt haben.

Fügen Sie dem azure_windows_vm.yml Ansible Playbook die folgende Aufgabe hinzu:

  - 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

Der Wert von {{ password }} ist eine Ansible-Variable, die das Kennwort der Windows-VM enthält. Um diese Variable sicher aufzufüllen, fügen Sie einen var_prompts Eintrag am Anfang des Playbook hinzu.

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

Wichtige Punkte:

  • Vermeiden Sie das Speichern vertraulicher Daten als Nur-Text. Verwenden Sie var_prompts, um Variablen zur Laufzeit zu befüllen. Fügen Sie hinzu no_log: true , um zu verhindern, dass Kennwörter protokolliert werden.

Konfigurieren des WinRM-Listeners

Ansible verwendet PowerShell zum Verbinden und Konfigurieren von Windows-Remotehosts über WinRM.

Um WinRM zu konfigurieren, fügen Sie die folgende Erweiterung azure_rm_virtualmachineextension hinzu:

  - 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 kann keine Verbindung zur VM herstellen, bis WinRM vollständig konfiguriert ist.

Fügen Sie Ihrem Playbook die folgenden Aufgaben hinzu, um auf die WinRM-Verbindung zu warten:

  - 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

Wichtige Punkte:

  • Mit dem azure_rm_virtualmachineextension Modul können Sie ein PowerShell-Skript lokal unter Azure Windows ausführen. Durch das Ausführen des ConfigureRemotingForAnsible.ps1 PowerShell-Skripts wird Windows Remoting konfiguriert, indem selbstsignierte Zertifikate erstellt werden und die notwendigen Ports geöffnet werden, um Ansible eine Verbindung zu ermöglichen.
  • Das azure_rm_publicipaddress_info Modul fragt die öffentliche IP-Adresse von Azure ab und speichert dann set_fact die Ausgabe in einer Variablen für das wait_for zu verwendende Modul.

Vollständiges Beispiel "Ansible-Playbook"

In diesem Abschnitt wird das gesamte Ansible Playbook aufgeführt, das Sie im Verlauf dieses Artikels erstellt haben.

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

Herstellen einer Verbindung mit dem virtuellen Windows-Computer

Erstellen Sie ein neues Ansible-Playbook namens connect_azure_windows_vm.yml und kopieren Sie den folgenden Inhalt in das 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:

Führen Sie das Ansible Playbook aus.

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

Ersetzen Sie <publicIPaddress> durch die Adresse Ihrer virtuellen Maschine.

Wichtige Punkte:

  • Die Konfiguration von Ansible bestimmt, wie Ansible eine Verbindung mit Remotehosts herstellt und authentifiziert. Die Variablen, die Sie definieren müssen, um eine Verbindung mit einem Windows-Host herzustellen, hängen vom WinRM-Verbindungstyp und der ausgewählten Authentifizierungsoption ab. Weitere Informationen finden Sie unter "Herstellen einer Verbindung mit einem Windows-Host " und " Windows-Authentifizierungsoptionen".
  • Durch das Hinzufügen eines Kommas nach der öffentlichen IP-Adresse wird der Bestandsparser von Ansible umgangen. Mit dieser Technik können Sie Playbooks ohne Bestandsdatei ausführen.

Bereinigen von Ressourcen

  1. Speichern Sie den folgenden Code 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. Führen Sie das Playbook mit dem Befehl "ansible-playbook" aus. Ersetzen Sie den Platzhalter durch den Namen der zu löschenden Ressourcengruppe. Alle Ressourcen innerhalb der Ressourcengruppe werden gelöscht.

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

    Wichtige Punkte:

    • Aufgrund der register Variablen und des debug Abschnitts des Playbooks werden die Ergebnisse angezeigt, sobald der Befehl abgeschlossen ist.

Nächste Schritte