Поделиться через


Создание виртуальной машины Windows в Azure с помощью Ansible

В этой статье показано, как развернуть виртуальную машину Windows Server 2019 в Azure с помощью Ansible.

Вы узнаете, как выполнять следующие задачи:

  • Создание или изменение группы ресурсов
  • Создание виртуальной сети, общедоступного IP-адреса, группы безопасности сети и сетевого интерфейса.
  • Развертывание виртуальной машины Windows Server.
  • Подключение к виртуальной машине через WinRM.
  • Выполнение сборника схем Ansible для настройки Windows IIS.

Необходимые компоненты

Добавление поддержки WinRM в Ansible

Чтобы организовать обмен данными через WinRM, на сервере управления Ansible должен быть установлен пакет Python pywinrm.

Для установки pywinrm выполните следующую команду на сервере Ansible:

pip install "pywinrm>=0.3.0"

См. дополнительные сведения о службе удаленного управления Windows для Ansible.

Создание или изменение группы ресурсов

Создайте сборник схем Ansible с именем azure_windows_vm.yml и скопируйте в него следующее содержимое:

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

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

Основные моменты:

  • Параметр hosts localhost и connection запуск _local_ сборника схем локально на сервере Ansible.

Создание виртуальной сети и подсети

Добавьте следующие задачи в azure_windows_vm.yml сборник схем Ansible для создания виртуальной сети:

  - 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

Создание общедоступного IP-адреса

Добавьте в сборник схем следующие задачи azure_windows_vm.yml , чтобы создать общедоступный 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 }}"

Основные моменты:

  • Модуль Ansible register используется для сохранения выходных данных azure_rm_publicipaddress в переменную с именем output_ip_address.
  • Модуль debug используется для вывода общедоступного IP-адреса виртуальной машины в консоль.

Создание группы безопасности сети и сетевой карты

Группа безопасности сети определяет, какой трафик пропускается или не пропускается на виртуальную машину.

Чтобы открыть порты WinRM и HTTP, добавьте следующие задачи в сборник схем Ansible azure_windows_vm.yml:

  - 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

Основные моменты:

  • Виртуальный сетевой интерфейс (сетевая карта) подключает виртуальную машину к виртуальной сети, общедоступному IP-адресу и группе безопасности сети.
  • Модуль azure_rm_securitygroup создает группу безопасности сети Azure, чтобы пропускать трафик WinRM с сервера Ansible на удаленный узел, открывая порты 5985 и 5986.

Создание виртуальной машины

Теперь мы создадим виртуальную машину, которая использует все ресурсы, созданные, как описано в предыдущих разделах этой статьи.

Добавьте следующие задачи в сборник схем Ansible azure_windows_vm.yml:

  - 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

Значение admin_password параметра {{ password }} — это переменная Ansible, которая содержит пароль для виртуальной машины Windows. Чтобы безопасно присвоить значение этой переменной, добавьте запись var_prompts в начало сборника схем.

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

Основные моменты:

  • Не сохраняйте конфиденциальные данные в формате обычного текста. Используйте var_prompts для присвоения значений переменным во время выполнения. Добавьте no_log: true, чтобы пароли не сохранялись в журналах.

Настройка прослушивателя WinRM

Ansible использует PowerShell для подключения к удаленным узлам Windows через WinRM и для их настройки.

Чтобы настроить WinRM, добавьте следующий 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 не сможет подключиться к виртуальной машине, пока не будет завершена настройка WinRM.

Добавьте следующие задачи в сборник схем, чтобы настроить ожидание подключения 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

Основные моменты:

  • Модуль azure_rm_virtualmachineextension позволяет выполнять скрипты PowerShell локально в среде Azure Windows. Выполнение скрипта PowerShell ConfigureRemotingForAnsible.ps1 настраивает WinRM путем создания самозаверяющих сертификатов и открытия необходимых портов для подключения Ansible.
  • Модуль azure_rm_publicipaddress_info запрашивает у Azure общедоступный IP-адрес, а затем модуль set_fact сохраняет эти выходные данные в переменной, которую использует модуль wait_for.

Завершение примера сборника схем Ansible

В этом разделе указан весь пример сборника схем Ansible, созданный при работе с этой статьей.

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

Подключение к виртуальной машине Windows

Создайте новую сборник схем Ansible с именем connect_azure_windows_vm.yml и скопируйте следующее содержимое в сборник схем:

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

Выполните сборник схем Ansible.

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

Замените <publicIPaddress> адресом своей виртуальной машины.

Основные моменты:

  • Конфигурация Ansible определяет, как Ansible выполняет подключение к удаленным узлам и проверку подлинности на них. Для подключения к узлу Windows вам нужно определить переменные, которые зависят от типа подключения WinRM и выбранных параметров проверки подлинности. См. дополнительные сведения см. о подключении к узлу Windows и вариантах проверки подлинности Windows.
  • Добавление запятой после того, как общедоступный IP-адрес проходит средство синтаксического анализа инвентаризации Ansible. Этот метод позволяет запускать сборники схем без файла инвентаризации.

Очистка ресурсов

  1. Сохраните следующий код как delete_rg.yml.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Чтобы запустить сборник схем, выполните команду ansible-playbook. Замените заполнитель именем удаляемой группы ресурсов. В указанной группе ресурсов будут удалены все ресурсы.

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

    Основные моменты:

    • В связи с наличием переменной register и раздела debug в сборнике схем результаты будут отображены после завершения команды.

Следующие шаги