Share via


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 werden folgende Vorgehensweisen behandelt:

  • Erstellen einer Ressourcengruppe
  • Erstellen eines virtuellen Netzwerks, einer öffentlichen IP-Adresse, einer Netzwerksicherheitsgruppe und einer Netzwerkschnittstelle
  • Bereitstellen eines virtuellen Windows Server-Computers
  • Herstellen einer Verbindung mit dem virtuellen Computer per WinRM
  • Ausführen eines Ansible-Playbooks für die Konfiguration von Windows IIS

Voraussetzungen

  • Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Hinzufügen von WinRM-Unterstützung zu Ansible

Für die Kommunikation über WinRM benötigt der Ansible-Steuerungsserver das Python-Paket pywinrm.

Führen Sie den folgenden Befehl auf dem Ansible-Server aus, um pywinrm zu installieren:

pip install "pywinrm>=0.3.0"

Weitere Informationen finden Sie auf der Seite zur 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

Die wichtigsten Punkte:

  • Die Einstellung hosts auf "localhost" und connection wie _local_ das Playbook lokal auf dem Ansible-Server ausgeführt wird.

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

Die wichtigsten Punkte:

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

Erstellen einer Netzwerksicherheitsgruppe und Netzwerkschnittstelle

Mit der Netzwerksicherheitsgruppe wird definiert, welcher Datenverkehr für den virtuellen Computer zugelassen wird und diesen erreichen kann.

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

  - 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

Die wichtigsten Punkte:

  • Eine virtuelle Netzwerkschnittstellenkarte verbindet Ihren virtuellen Computer mit dem zugehörigen virtuellen Netzwerk, der öffentlichen IP-Adresse und der Sicherheitsgruppe.
  • Mit azure_rm_securitygroup wird eine Azure-Netzwerksicherheitsgruppe erstellt, um das Fließen von WinRM-Datenverkehr vom Ansible-Server zum Remotehost zu ermöglichen, indem die Nutzung der Ports 5985 und 5986 zugelassen wird.

Erstellen eines virtuellen Computers

Als Nächstes erstellen Sie einen virtuellen Computer, für den alle Ressourcen verwendet werden, die Sie in den vorherigen Abschnitten dieses Artikels erstellt haben.

Fügen Sie dem Ansible-Playbook azure_windows_vm.yml 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 {{ password }} für admin_password ist eine Ansible-Variable, die das Windows-VM-Kennwort enthält. Fügen Sie am Anfang des Playbooks den Eintrag var_prompts hinzu, um das sichere Einfügen dieser Variablen zu ermöglichen.

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

Die wichtigsten Punkte:

  • Vermeiden Sie es, vertrauliche Daten im Nur-Text-Format zu speichern. Verwenden Sie var_prompts, um Variablen zur Laufzeit einzufügen. Fügen Sie no_log: true hinzu, um zu verhindern, dass Kennwörter protokolliert werden.

Konfigurieren des WinRM-Listeners

Für Ansible wird PowerShell genutzt, um Windows-Remotehosts per WinRM zu verbinden und zu konfigurieren.

Fügen Sie zum Konfigurieren von WinRM die Erweiterung azure_rm_virtualmachineextension wie folgt 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/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
      auto_upgrade_minor_version: true

Ansible kann erst eine Verbindung mit dem virtuellen Computer herstellen, nachdem WinRM vollständig konfiguriert wurde.

Fügen Sie Ihrem Playbook die folgenden Aufgaben hinzu, damit auf die WinRM-Verbindung gewartet wird:

  - 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

Die wichtigsten Punkte:

  • Mit dem Modul azure_rm_virtualmachineextension können Sie ein PowerShell-Skript lokal in der Azure Windows-Umgebung ausführen. Durch die Ausführung des PowerShell-Skripts ConfigureRemotingForAnsible.ps1 wird WinRM konfiguriert, indem selbstsignierte Zertifikate erstellt und die erforderlichen Ports für die Ansible-Verbindungsherstellung geöffnet werden.
  • Mit dem Modul azure_rm_publicipaddress_info wird die öffentliche IP-Adresse aus Azure abgefragt, und anschließend wird mit set_fact die Ausgabe in einer Variablen gespeichert, die vom Modul wait_for verwendet werden kann.

Vollständiges Ansible-Beispielplaybook

Dieser Abschnitt enthält das gesamte Ansible-Beispielplaybook, das Sie im Rahmen 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/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 und connect_azure_windows_vm.yml 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 Ihres virtuellen Computers.

Die wichtigsten Punkte:

  • Anhand der Konfiguration von Ansible wird bestimmt, wie Ansible eine Verbindung mit Remotehosts herstellt und die Authentifizierung dafür durchführt. Die Variablen, die Sie für die Verbindungsherstellung mit einem Windows-Host definieren müssen, richten sich nach Ihrem WinRM-Verbindungstyp und der gewählten Authentifizierungsoption. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit einem Windows-Host und Windows-Authentifizierungsoptionen.
  • Durch Hinzufügen eines Kommas nach der Umgehung 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 mithilfe des Befehls 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>"
    

    Die wichtigsten Punkte:

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

Nächste Schritte