Udostępnij za pośrednictwem


Tworzenie maszyny wirtualnej z systemem Windows na platformie Azure przy użyciu rozwiązania Ansible

W tym artykule pokazano, jak wdrożyć maszynę wirtualną z systemem Windows Server 2019 na platformie Azure przy użyciu rozwiązania Ansible.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Tworzenie grupy zasobów
  • Tworzenie sieci wirtualnej, publicznego adresu IP, sieciowej grupy zabezpieczeń i interfejsu sieciowego
  • Wdrażanie maszyny wirtualnej z systemem Windows Server
  • Połączenie do maszyny wirtualnej za pośrednictwem usługi WinRM
  • Uruchamianie podręcznika rozwiązania Ansible w celu skonfigurowania usług IIS systemu Windows

Wymagania wstępne

  • Subskrypcja platformy Azure: jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
  • Jednostka usługi platformy Azure: Utwórz jednostkę usługi, zanotuj następujące wartości: appId, displayName, password i tenant.

Dodawanie obsługi usługi WinRM do rozwiązania Ansible

Aby komunikować się za pośrednictwem usługi WinRM, serwer kontroli rozwiązania Ansible potrzebuje pakietu pywinrmpython .

Uruchom następujące polecenie na serwerze Ansible, aby zainstalować program pywinrm:

pip install "pywinrm>=0.3.0"

Aby uzyskać więcej informacji, zobacz Zdalne zarządzanie systemem Windows dla rozwiązania Ansible.

Tworzenie grupy zasobów

Utwórz podręcznik rozwiązania Ansible o nazwie azure_windows_vm.yml i skopiuj następującą zawartość do podręcznika:

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

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

Kluczowe punkty:

  • Ustawienie hosts na localhost i connection jako _local_ uruchamia podręcznik lokalnie na serwerze Ansible.

Tworzenie sieci wirtualnej i podsieci

Dodaj następujące zadania do podręcznika azure_windows_vm.yml rozwiązania Ansible, aby utworzyć sieć wirtualną:

  - 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

Tworzenie publicznego adresu IP

Dodaj następujące zadania do podręcznika azure_windows_vm.yml , aby utworzyć publiczny adres IP:

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

Kluczowe punkty:

  • Moduł Ansible register służy do przechowywania danych wyjściowych z azure_rm_publicipaddress w zmiennej o nazwie output_ip_address.
  • Moduł debug służy do wyprowadzania publicznego adresu IP maszyny wirtualnej do konsoli programu .

Tworzenie sieciowej grupy zabezpieczeń i karty sieciowej

Sieciowa grupa zabezpieczeń definiuje dozwolony ruch i nie może dotrzeć do maszyny wirtualnej.

Aby otworzyć porty WinRM i HTTP, dodaj następujące zadania do podręcznika azure_windows_vm.yml rozwiązania 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

Kluczowe punkty:

  • Wirtualna karta sieciowa łączy maszynę wirtualną z siecią wirtualną, publicznym adresem IP i grupą zabezpieczeń.
  • Tworzy azure_rm_securitygroup sieciową grupę zabezpieczeń platformy Azure, aby zezwolić na ruch usługi WinRM z serwera Ansible do hosta zdalnego, zezwalając na port 5985 i 5986.

Tworzenie maszyny wirtualnej

Następnie utwórz maszynę wirtualną, która używa wszystkich zasobów utworzonych w poprzednich sekcjach tego artykułu.

Dodaj następujące zadanie do podręcznika azure_windows_vm.yml rozwiązania 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

Wartość admin_password{{ password }} to zmienna Ansible zawierająca hasło maszyny wirtualnej z systemem Windows. Aby bezpiecznie wypełnić ten zmienną var_prompts , dodaj wpis na początku podręcznika.

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

Kluczowe punkty:

  • Unikaj przechowywania poufnych danych jako zwykłego tekstu. Użyj var_prompts polecenia , aby wypełnić zmienne w czasie wykonywania. Dodaj no_log: true , aby uniemożliwić rejestrowanie haseł.

Konfigurowanie odbiornika usługi WinRM

Rozwiązanie Ansible używa programu PowerShell do łączenia i konfigurowania hostów zdalnych systemu Windows za pośrednictwem usługi WinRM.

Aby skonfigurować usługę WinRM, dodaj następujący ext 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

Rozwiązanie Ansible nie może nawiązać połączenia z maszyną wirtualną, dopóki usługa WinRM nie zostanie w pełni skonfigurowana.

Dodaj następujące zadania do podręcznika, aby czekać na połączenie usługi 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

Kluczowe punkty:

  • Moduł azure_rm_virtualmachineextension umożliwia lokalne uruchamianie skryptu programu PowerShell w systemie Azure Windows. Uruchomienie skryptu programu PowerShell umożliwia skonfigurowanie modułu ConfigureRemotingForAnsible.ps1 WinRM przez utworzenie certyfikatów z podpisem własnym i otwarcie niezbędnych portów do nawiązania połączenia z usługą Ansible.
  • Moduł azure_rm_publicipaddress_info wysyła zapytanie do publicznego adresu IP z platformy Azure, a następnie set_fact przechowuje dane wyjściowe w zmiennej używanej przez wait_for moduł.

Kompletny przykładowy podręcznik rozwiązania Ansible

Ta sekcja zawiera cały przykładowy podręcznik rozwiązania Ansible utworzony w ramach tego artykułu.

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

Połączenie do maszyny wirtualnej z systemem Windows

Utwórz nowy podręcznik rozwiązania Ansible o nazwie connect_azure_windows_vm.yml i skopiuj następującą zawartość do podręcznika:

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

Uruchom podręcznik rozwiązania Ansible.

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

Zastąp <publicIPaddress> ciąg adresem maszyny wirtualnej.

Kluczowe punkty:

  • Konfiguracja rozwiązania Ansible określa sposób łączenia i uwierzytelniania rozwiązania Ansible z hostami zdalnymi. Zmienne, które należy zdefiniować, aby nawiązać połączenie z hostem systemu Windows, zależą od typu połączenia usługi WinRM i wybranej opcji uwierzytelniania. Aby uzyskać więcej informacji, zobacz Połączenie do opcji hosta systemu Windows i uwierzytelniania systemu Windows.
  • Dodanie przecinka po tym, jak publiczny adres IP pomija analizator spisu rozwiązania Ansible. Ta technika umożliwia uruchamianie podręczników bez pliku spisu.

Czyszczenie zasobów

  1. Zapisz następujący kod jako delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Uruchom podręcznik przy użyciu polecenia ansible-playbook . Zastąp symbol zastępczy nazwą grupy zasobów, która ma zostać usunięta. Wszystkie zasoby w grupie zasobów zostaną usunięte.

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

    Kluczowe punkty:

    • Ze względu na zmienną register i debug sekcję podręcznika wyniki są wyświetlane po zakończeniu polecenia.

Następne kroki