Создание виртуальной машины Windows в Azure с помощью Ansible
В этой статье показано, как развернуть виртуальную машину Windows Server 2019 в Azure с помощью Ansible.
Вы узнаете, как выполнять следующие задачи:
- Создание или изменение группы ресурсов
- Создание виртуальной сети, общедоступного IP-адреса, группы безопасности сети и сетевого интерфейса.
- Развертывание виртуальной машины Windows Server.
- Подключение к виртуальной машине через WinRM.
- Выполнение сборника схем Ansible для настройки Windows IIS.
Необходимые компоненты
- Подписка Azure. Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
- Субъект-служба Azure: создайте субъект-службу, записав следующие значения: appId, displayName, password и tenant.
Установите Ansible: выполните одно из указанных ниже действий.
- Установите и настройте Ansible на виртуальной машине Linux.
- Настройте Azure Cloud Shell
Добавление поддержки 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. Выполнение скрипта PowerShellConfigureRemotingForAnsible.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. Этот метод позволяет запускать сборники схем без файла инвентаризации.
Очистка ресурсов
Сохраните следующий код как
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Чтобы запустить сборник схем, выполните команду ansible-playbook. Замените заполнитель именем удаляемой группы ресурсов. В указанной группе ресурсов будут удалены все ресурсы.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Основные моменты:
- В связи с наличием переменной
register
и разделаdebug
в сборнике схем результаты будут отображены после завершения команды.
- В связи с наличием переменной