Sdílet prostřednictvím


Vytvoření virtuálního počítače s Windows v Azure pomocí Ansible

Tento článek ukazuje, jak nasadit virtuální počítač s Windows Serverem 2019 v Azure pomocí Ansible.

V tomto článku získáte informace o těchto tématech:

  • Vytvoření skupiny zdrojů
  • Vytvoření virtuální sítě, veřejné IP adresy, skupiny zabezpečení sítě a síťového rozhraní
  • Nasazení virtuálního počítače s Windows Serverem
  • Připojení k virtuálnímu počítači přes WinRM
  • Spuštění playbooku Ansible pro konfiguraci služby Windows IIS

Požadavky

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Přidání podpory WinRM do Ansible

Ke komunikaci přes WinRM potřebuje řídicí server Ansible balíček pywinrmPythonu .

Spuštěním následujícího příkazu na serveru Ansible nainstalujte pywinrm:

pip install "pywinrm>=0.3.0"

Další informace naleznete v tématu Vzdálená správa systému Windows pro Ansible.

Vytvoření skupiny zdrojů

Vytvořte playbook Ansible s názvem azure_windows_vm.yml a zkopírujte do playbooku následující obsah:

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

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

Klíčové body:

  • Nastavení hosts na localhost a connection spuštění _local_ playbooku místně na serveru Ansible.

Vytvoření virtuální sítě a podsítě

Přidejte do playbooku azure_windows_vm.yml Ansible následující úlohy pro vytvoření virtuální sítě:

  - 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

Vytvoření veřejné IP adresy

Přidejte do playbooku azure_windows_vm.yml následující úkoly, které vytvoří veřejnou IP adresu:

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

Klíčové body:

  • Modul Ansible register slouží k uložení výstupu z azure_rm_publicipaddress proměnné s názvem output_ip_address.
  • Modul debug slouží k výstupu veřejné IP adresy virtuálního počítače do konzoly.

Vytvoření skupiny zabezpečení sítě a síťové karty

Skupina zabezpečení sítě definuje, jaký provoz je povolený a nemá povolený přístup k virtuálnímu počítači.

Pokud chcete otevřít porty WinRM a HTTP, přidejte do playbooku azure_windows_vm.yml Ansible následující úlohy:

  - 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

Klíčové body:

  • Karta virtuálního síťového rozhraní připojí virtuální počítač k virtuální síti, veřejné IP adrese a skupině zabezpečení.
  • Vytvoří azure_rm_securitygroup skupinu zabezpečení sítě Azure, která povolí provoz WinRM ze serveru Ansible na vzdáleného hostitele povolením portu 5985 a 5986.

Vytvoření virtuálního počítače

Dále vytvořte virtuální počítač, který používá všechny prostředky, které jste vytvořili v předchozích částech tohoto článku.

Do playbooku azure_windows_vm.yml Ansible přidejte následující úkol:

  - 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

Hodnota admin_password{{ password }} je proměnná Ansible, která obsahuje heslo virtuálního počítače s Windows. Pokud chcete danou proměnnou var_prompts bezpečně naplnit, přidejte položku na začátek playbooku.

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

Klíčové body:

  • Vyhněte se ukládání citlivých dat jako prostého textu. Slouží var_prompts k naplnění proměnných za běhu. Přidejte no_log: true , aby se hesla nemohla protokolovat.

Konfigurace naslouchacího procesu WinRM

Ansible používá PowerShell k připojení a konfiguraci vzdálených hostitelů Windows přes WinRM.

Chcete-li nakonfigurovat WinRM, přidejte následující 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

Ansible se nemůže připojit k virtuálnímu počítači, dokud nebude plně nakonfigurovaný WinRM.

Přidejte do playbooku následující úlohy a počkejte na připojení 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

Klíčové body:

  • Tento azure_rm_virtualmachineextension modul umožňuje spustit skript PowerShellu místně v Azure Windows. Spuštěním skriptu PowerShellu ConfigureRemotingForAnsible.ps1 nakonfigurujete WinRM vytvořením certifikátů podepsaných svým držitelem a otevřením potřebných portů pro připojení Ansible.
  • Modul azure_rm_publicipaddress_info se dotazuje na veřejnou IP adresu z Azure a pak set_fact uloží výstup do proměnné, kterou má wait_for modul použít.

Kompletní ukázkový playbook Ansible

Tato část obsahuje úplný ukázkový playbook Ansible, který jste vytvořili v průběhu tohoto článku.

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

Připojení k virtuálnímu počítači s Windows

Vytvořte nový playbook Ansible s názvem connect_azure_windows_vm.yml a zkopírujte do playbooku následující obsah:

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

Spusťte playbook Ansible.

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

Nahraďte <publicIPaddress> adresou virtuálního počítače.

Klíčové body:

  • Konfigurace Ansible určuje, jak se Ansible připojuje a ověřuje u vzdálených hostitelů. Proměnné, které je potřeba definovat pro připojení k hostiteli s Windows, závisí na typu připojení WinRM a na možnosti ověřování, kterou jste zvolili. Další informace najdete v tématu Připojení možnosti ověřování systému Windows a hostitele systému Windows.
  • Přidání čárky za veřejnou IP adresu obchází analyzátor inventáře Ansible. Tato technika umožňuje spouštět playbooky bez souboru inventáře.

Vyčištění prostředků

  1. Uložte následující kód 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. Spusťte playbook pomocí příkazu ansible-playbook . Zástupný symbol nahraďte názvem skupiny prostředků, která se má odstranit. Odstraní se všechny prostředky v rámci skupiny prostředků.

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

    Klíčové body:

    • register Vzhledem k proměnné a debug části playbooku se výsledky zobrazí po dokončení příkazu.

Další kroky