Vytvoření virtuálního počítače s Windows v Azure pomocí Ansible
Tento článek ukazuje, jak nasadit virtuální počítač s Windows Serverem 2019 v Azure pomocí Ansible.
V tomto článku získáte informace o těchto tématech:
- Vytvoření skupiny zdrojů
- Vytvoření virtuální sítě, veřejné IP adresy, skupiny zabezpečení sítě a síťového rozhraní
- Nasazení virtuálního počítače s Windows Serverem
- Připojení k virtuálnímu počítači přes WinRM
- Spuštění playbooku Ansible pro konfiguraci služby Windows IIS
Požadavky
- Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
- Instanční objekt Azure: Vytvořte instanční objekt a poznamenejte si následující hodnoty: appId, displayName, password a tenant.
Nainstalujte Ansible: Proveďte jednu z následujících možností:
- Instalace a konfigurace Ansible na virtuálním počítači s Linuxem
- Konfigurace služby Azure Cloud Shell
Přidání podpory WinRM do Ansible
Ke komunikaci přes WinRM potřebuje řídicí server Ansible balíček pywinrm
Pythonu .
Spuštěním následujícího příkazu na serveru Ansible nainstalujte pywinrm
:
pip install "pywinrm>=0.3.0"
Další informace naleznete v tématu Vzdálená správa systému Windows pro Ansible.
Vytvoření skupiny zdrojů
Vytvořte playbook Ansible s názvem azure_windows_vm.yml
a zkopírujte do playbooku následující obsah:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Klíčové body:
- Nastavení
hosts
na localhost aconnection
spuštění_local_
playbooku místně na serveru Ansible.
Vytvoření virtuální sítě a podsítě
Přidejte do playbooku azure_windows_vm.yml
Ansible následující úlohy pro vytvoření virtuální sítě:
- 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
Vytvoření veřejné IP adresy
Přidejte do playbooku azure_windows_vm.yml
následující úkoly, které vytvoří veřejnou IP adresu:
- 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 }}"
Klíčové body:
- Modul Ansible
register
slouží k uložení výstupu zazure_rm_publicipaddress
proměnné s názvemoutput_ip_address
. - Modul
debug
slouží k výstupu veřejné IP adresy virtuálního počítače do konzoly.
Vytvoření skupiny zabezpečení sítě a síťové karty
Skupina zabezpečení sítě definuje, jaký provoz je povolený a nemá povolený přístup k virtuálnímu počítači.
Pokud chcete otevřít porty WinRM a HTTP, přidejte do playbooku azure_windows_vm.yml
Ansible následující úlohy:
- 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
Klíčové body:
- Karta virtuálního síťového rozhraní připojí virtuální počítač k virtuální síti, veřejné IP adrese a skupině zabezpečení.
- Vytvoří
azure_rm_securitygroup
skupinu zabezpečení sítě Azure, která povolí provoz WinRM ze serveru Ansible na vzdáleného hostitele povolením portu5985
a5986
.
Vytvoření virtuálního počítače
Dále vytvořte virtuální počítač, který používá všechny prostředky, které jste vytvořili v předchozích částech tohoto článku.
Do playbooku azure_windows_vm.yml
Ansible přidejte následující úkol:
- 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
Hodnota admin_password
{{ password }}
je proměnná Ansible, která obsahuje heslo virtuálního počítače s Windows. Pokud chcete danou proměnnou var_prompts
bezpečně naplnit, přidejte položku na začátek playbooku.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Klíčové body:
- Vyhněte se ukládání citlivých dat jako prostého textu. Slouží
var_prompts
k naplnění proměnných za běhu. Přidejteno_log: true
, aby se hesla nemohla protokolovat.
Konfigurace naslouchacího procesu WinRM
Ansible používá PowerShell k připojení a konfiguraci vzdálených hostitelů Windows přes WinRM.
Chcete-li nakonfigurovat WinRM, přidejte následující 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 se nemůže připojit k virtuálnímu počítači, dokud nebude plně nakonfigurovaný WinRM.
Přidejte do playbooku následující úlohy a počkejte na připojení 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
Klíčové body:
- Tento
azure_rm_virtualmachineextension
modul umožňuje spustit skript PowerShellu místně v Azure Windows. Spuštěním skriptu PowerShelluConfigureRemotingForAnsible.ps1
nakonfigurujete WinRM vytvořením certifikátů podepsaných svým držitelem a otevřením potřebných portů pro připojení Ansible. - Modul
azure_rm_publicipaddress_info
se dotazuje na veřejnou IP adresu z Azure a pakset_fact
uloží výstup do proměnné, kterou máwait_for
modul použít.
Kompletní ukázkový playbook Ansible
Tato část obsahuje úplný ukázkový playbook Ansible, který jste vytvořili v průběhu tohoto článku.
---
- 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
Připojení k virtuálnímu počítači s Windows
Vytvořte nový playbook Ansible s názvem connect_azure_windows_vm.yml
a zkopírujte do playbooku následující obsah:
---
- 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:
Spusťte playbook Ansible.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Nahraďte <publicIPaddress>
adresou virtuálního počítače.
Klíčové body:
- Konfigurace Ansible určuje, jak se Ansible připojuje a ověřuje u vzdálených hostitelů. Proměnné, které je potřeba definovat pro připojení k hostiteli s Windows, závisí na typu připojení WinRM a na možnosti ověřování, kterou jste zvolili. Další informace najdete v tématu Připojení možnosti ověřování systému Windows a hostitele systému Windows.
- Přidání čárky za veřejnou IP adresu obchází analyzátor inventáře Ansible. Tato technika umožňuje spouštět playbooky bez souboru inventáře.
Vyčištění prostředků
Uložte následující kód jako
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Spusťte playbook pomocí příkazu ansible-playbook . Zástupný symbol nahraďte názvem skupiny prostředků, která se má odstranit. Odstraní se všechny prostředky v rámci skupiny prostředků.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Klíčové body:
register
Vzhledem k proměnné adebug
části playbooku se výsledky zobrazí po dokončení příkazu.