Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 dowiesz się, jak:
- Tworzenie grupy zasobów
- Tworzenie sieci wirtualnej, publicznego adresu IP, sieciowej grupy zabezpieczeń i interfejsu sieciowego
- Wdrażanie maszyny wirtualnej z systemem Windows Server
- Nawiązywanie połączenia z maszyną wirtualną za pośrednictwem usługi WinRM
- Uruchom Ansible playbook, aby skonfigurować IIS na Windowsie
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 pywinrmpython .
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 playbook Ansible o nazwie azure_windows_vm.yml i skopiuj następującą zawartość do tego playbooka:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Kluczowe punkty:
- Ustawienie
hostsna localhost iconnectionjako_local_uruchamia playbook 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
registersłuży do przechowywania danych wyjściowych zazure_rm_publicipaddressw zmiennej o nazwieoutput_ip_address. - Moduł
debugsłuży do wyprowadzania publicznego adresu IP maszyny wirtualnej do konsoli programu .
Tworzenie sieciowej grupy zabezpieczeń i karty sieciowej
Grupa zabezpieczeń sieciowych określa, jaki ruch jest dozwolony, a jaki 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_securitygroupsieciową grupę zabezpieczeń platformy Azure, aby zezwolić na ruch usługi WinRM z serwera Ansible do hosta zdalnego, zezwalając na port5985i5986.
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ć tę zmienną var_prompts, dodaj wpis na początku skryptu.
- 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, 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_virtualmachineextensionumożliwia lokalne uruchamianie skryptu programu PowerShell w systemie Azure Windows. Uruchomienie skryptu programu PowerShell umożliwia skonfigurowanie modułuConfigureRemotingForAnsible.ps1WinRM 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_infowysyła zapytanie do publicznego adresu IP z platformy Azure, a następnieset_factprzechowuje dane wyjściowe w zmiennej używanej przezwait_formoduł.
Kompletny przykładowy podręcznik rozwiązania Ansible
W tej sekcji wymieniono cały przykładowy playbook Ansible, który został zbudowany w trakcie 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
Nawiązywanie połączenia z maszyną wirtualną z systemem Windows
Utwórz nowy playbook Ansible o nazwie connect_azure_windows_vm.yml i skopiuj następującą zawartość do playbooka:
---
- 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>,
Zamień <publicIPaddress> na adres swojej 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 Nawiązywanie połączenia z hostem systemu Windows i opcjami uwierzytelniania systemu Windows.
- Dodanie przecinka po publicznym adresie IP pomija analizator spisu Ansible. Ta technika umożliwia uruchamianie podręczników bez pliku spisu.
Uprzątnij zasoby
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: rgUruchom 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ą
registeri sekcjędebugpodręcznika, wyniki są wyświetlane po zakończeniu polecenia.
- Ze względu na zmienną