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.
Zainstaluj oprogramowanie Ansible: Wykonaj jedną z następujących opcji:
- Instalowanie i konfigurowanie rozwiązania Ansible na maszynie wirtualnej z systemem Linux
- Konfigurowanie usługi Azure Cloud Shell
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 pywinrm
python .
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 iconnection
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 zazure_rm_publicipaddress
w zmiennej o nazwieoutput_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 port5985
i5986
.
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. Dodajno_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łuConfigureRemotingForAnsible.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ępnieset_fact
przechowuje dane wyjściowe w zmiennej używanej przezwait_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
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
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
idebug
sekcję podręcznika wyniki są wyświetlane po zakończeniu polecenia.
- Ze względu na zmienną