Dela via


Skapa en virtuell Windows-dator i Azure med Ansible

Den här artikeln visar hur du distribuerar en virtuell Windows Server 2019-dator i Azure med Ansible.

I den här artikeln kan du se hur du:

  • Skapa en resursgrupp
  • Skapa ett virtuellt nätverk, en offentlig IP-adress, en nätverkssäkerhetsgrupp och ett nätverksgränssnitt
  • Distribuera en virtuell Windows Server-dator
  • Anslut till den virtuella datorn via WinRM
  • Kör en Ansible-spelbok för att konfigurera Windows IIS

Förutsättningar

  • Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
  • Azure-tjänstens huvudnamn: Skapa ett huvudnamn för tjänsten och anteckna följande värden: appId, displayName, lösenord och klientorganisation.

Lägga till WinRM-stöd i Ansible

För att kommunicera via WinRM behöver Ansible-kontrollservern python-paketet pywinrm.

Kör följande kommando på Ansible-servern för att installera pywinrm:

pip install "pywinrm>=0.3.0"

Mer information finns i Windows Fjärrhantering för Ansible.

Skapa en resursgrupp

Skapa en Ansible-spelbok med namnet azure_windows_vm.yml och kopiera följande innehåll till spelboken:

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

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

Viktiga punkter:

  • Inställning hosts till localhost och connection som _local_ kör spelboken lokalt på Ansible-servern.

Skapa det virtuella nätverket och undernätet

Lägg till följande uppgifter i azure_windows_vm.yml Ansible-spelboken för att skapa ett virtuellt nätverk:

  - 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

Skapa en offentlig IP-adress

Lägg till följande uppgifter i azure_windows_vm.yml spelboken för att skapa en offentlig IP-adress:

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

Viktiga punkter:

  • Ansible-modulen register används för att lagra utdata från azure_rm_publicipaddress i en variabel med namnet output_ip_address.
  • Modulen debug används för att mata ut den offentliga IP-adressen för den virtuella datorn till konsolen.

Skapa nätverkssäkerhetsgrupp och nätverkskort

Nätverkssäkerhetsgruppen definierar vilken trafik som tillåts och inte tillåts nå den virtuella datorn.

Om du vill öppna WinRM- och HTTP-portarna lägger du till följande uppgifter i azure_windows_vm.yml Ansible-spelboken:

  - 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

Viktiga punkter:

  • Ett virtuellt nätverksgränssnittskort ansluter den virtuella datorn till dess virtuella nätverk, offentliga IP-adress och säkerhetsgrupp.
  • azure_rm_securitygroup Skapar en Azure-nätverkssäkerhetsgrupp för att tillåta WinRM-trafik från Ansible-servern till fjärrvärden genom att tillåta port 5985 och 5986.

Skapa en virtuell dator

Skapa sedan en virtuell dator som använder alla resurser som du har skapat i föregående avsnitt i den här artikeln.

Lägg till följande uppgift i azure_windows_vm.yml Ansible-spelboken:

  - 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

Värdet admin_password{{ password }} för är en Ansible-variabel som innehåller lösenordet för den virtuella Windows-datorn. Om du vill fylla i variabeln på ett säkert sätt lägger du till en var_prompts post i början av spelboken.

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

Viktiga punkter:

  • Undvik att lagra känsliga data som oformaterad text. Använd var_prompts för att fylla i variabler vid körning. Lägg till no_log: true för att förhindra att lösenord loggas.

Konfigurera WinRM-lyssnaren

Ansible använder PowerShell för att ansluta och konfigurera Windows fjärrvärdar via WinRM.

Om du vill konfigurera WinRM lägger du till följande 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 kan inte ansluta till den virtuella datorn förrän WinRM är helt konfigurerat.

Lägg till följande uppgifter i spelboken för att vänta på WinRM-anslutningen:

  - 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

Viktiga punkter:

  • Med azure_rm_virtualmachineextension modulen kan du köra ett PowerShell-skript lokalt i Azure Windows. ConfigureRemotingForAnsible.ps1 När du kör PowerShell-skriptet konfigureras WinRM genom att skapa självsignerade certifikat och öppna de portar som krävs för att Ansible ska kunna ansluta.
  • Modulen azure_rm_publicipaddress_info frågar den offentliga IP-adressen från Azure och lagrar sedan set_fact utdata i en variabel som modulen wait_for ska använda.

Fullständigt Ansible-spelboksexempel

Det här avsnittet innehåller det Ansible-spelboksexempel som du har byggt under loppet av den här artikeln.

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

Anslut till den virtuella Windows-datorn

Skapa en ny Ansible-spelbok med namnet connect_azure_windows_vm.yml och kopiera följande innehåll till spelboken:

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

Kör Ansible-spelboken.

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

Ersätt <publicIPaddress> med den virtuella datorns adress.

Viktiga punkter:

  • Ansibles konfiguration avgör hur Ansible ansluter och autentiserar till fjärrvärdar. De variabler som du behöver definiera för att ansluta till en Windows-värd beror på din WinRM-anslutningstyp och det autentiseringsalternativ som du har valt. Mer information finns i Anslut till en Windows-värd och Windows-autentiseringsalternativ.
  • Om du lägger till ett kommatecken efter att den offentliga IP-adressen kringgår Ansibles lagerparserare. Med den här tekniken kan du köra spelböcker utan en inventeringsfil.

Rensa resurser

  1. Spara följande kod som delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Kör spelboken med kommandot ansible-playbook . Ersätt platshållaren med namnet på den resursgrupp som ska tas bort. Alla resurser i resursgruppen tas bort.

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

    Viktiga punkter:

    • På grund av variabeln register och debug avsnittet i spelboken visas resultatet när kommandot har slutförts.

Nästa steg