Skapa en virtuell Windows-dator i Azure med Ansible
Den här artikeln visar hur du distribuerar en virtuell Windows Server 2019-dator i Azure med Ansible.
I den här artikeln kan du se hur du:
- Skapa en resursgrupp
- Skapa ett virtuellt nätverk, en offentlig IP-adress, en nätverkssäkerhetsgrupp och ett nätverksgränssnitt
- Distribuera en virtuell Windows Server-dator
- Anslut till den virtuella datorn via WinRM
- Kör en Ansible-spelbok för att konfigurera Windows IIS
Förutsättningar
- Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
- Azure-tjänstens huvudnamn: Skapa ett huvudnamn för tjänsten och anteckna följande värden: appId, displayName, lösenord och klientorganisation.
Installera Ansible: Gör något av följande alternativ:
- Installera och konfigurera Ansible på en virtuell Linux-dator
- Konfigurera Azure Cloud Shell
Lägga till WinRM-stöd i Ansible
För att kommunicera via WinRM behöver Ansible-kontrollservern python-paketet pywinrm
.
Kör följande kommando på Ansible-servern för att installera pywinrm
:
pip install "pywinrm>=0.3.0"
Mer information finns i Windows Fjärrhantering för Ansible.
Skapa en resursgrupp
Skapa en Ansible-spelbok med namnet azure_windows_vm.yml
och kopiera följande innehåll till spelboken:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Viktiga punkter:
- Inställning
hosts
till localhost ochconnection
som_local_
kör spelboken lokalt på Ansible-servern.
Skapa det virtuella nätverket och undernätet
Lägg till följande uppgifter i azure_windows_vm.yml
Ansible-spelboken för att skapa ett virtuellt nätverk:
- 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
Skapa en offentlig IP-adress
Lägg till följande uppgifter i azure_windows_vm.yml
spelboken för att skapa en offentlig IP-adress:
- 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 }}"
Viktiga punkter:
- Ansible-modulen
register
används för att lagra utdata frånazure_rm_publicipaddress
i en variabel med namnetoutput_ip_address
. - Modulen
debug
används för att mata ut den offentliga IP-adressen för den virtuella datorn till konsolen.
Skapa nätverkssäkerhetsgrupp och nätverkskort
Nätverkssäkerhetsgruppen definierar vilken trafik som tillåts och inte tillåts nå den virtuella datorn.
Om du vill öppna WinRM- och HTTP-portarna lägger du till följande uppgifter i azure_windows_vm.yml
Ansible-spelboken:
- 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
Viktiga punkter:
- Ett virtuellt nätverksgränssnittskort ansluter den virtuella datorn till dess virtuella nätverk, offentliga IP-adress och säkerhetsgrupp.
azure_rm_securitygroup
Skapar en Azure-nätverkssäkerhetsgrupp för att tillåta WinRM-trafik från Ansible-servern till fjärrvärden genom att tillåta port5985
och5986
.
Skapa en virtuell dator
Skapa sedan en virtuell dator som använder alla resurser som du har skapat i föregående avsnitt i den här artikeln.
Lägg till följande uppgift i azure_windows_vm.yml
Ansible-spelboken:
- 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
Värdet admin_password
{{ password }}
för är en Ansible-variabel som innehåller lösenordet för den virtuella Windows-datorn. Om du vill fylla i variabeln på ett säkert sätt lägger du till en var_prompts
post i början av spelboken.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Viktiga punkter:
- Undvik att lagra känsliga data som oformaterad text. Använd
var_prompts
för att fylla i variabler vid körning. Lägg tillno_log: true
för att förhindra att lösenord loggas.
Konfigurera WinRM-lyssnaren
Ansible använder PowerShell för att ansluta och konfigurera Windows fjärrvärdar via WinRM.
Om du vill konfigurera WinRM lägger du till följande 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 kan inte ansluta till den virtuella datorn förrän WinRM är helt konfigurerat.
Lägg till följande uppgifter i spelboken för att vänta på WinRM-anslutningen:
- 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
Viktiga punkter:
- Med
azure_rm_virtualmachineextension
modulen kan du köra ett PowerShell-skript lokalt i Azure Windows.ConfigureRemotingForAnsible.ps1
När du kör PowerShell-skriptet konfigureras WinRM genom att skapa självsignerade certifikat och öppna de portar som krävs för att Ansible ska kunna ansluta. - Modulen
azure_rm_publicipaddress_info
frågar den offentliga IP-adressen från Azure och lagrar sedanset_fact
utdata i en variabel som modulenwait_for
ska använda.
Fullständigt Ansible-spelboksexempel
Det här avsnittet innehåller det Ansible-spelboksexempel som du har byggt under loppet av den här artikeln.
---
- 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
Anslut till den virtuella Windows-datorn
Skapa en ny Ansible-spelbok med namnet connect_azure_windows_vm.yml
och kopiera följande innehåll till spelboken:
---
- 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:
Kör Ansible-spelboken.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Ersätt <publicIPaddress>
med den virtuella datorns adress.
Viktiga punkter:
- Ansibles konfiguration avgör hur Ansible ansluter och autentiserar till fjärrvärdar. De variabler som du behöver definiera för att ansluta till en Windows-värd beror på din WinRM-anslutningstyp och det autentiseringsalternativ som du har valt. Mer information finns i Anslut till en Windows-värd och Windows-autentiseringsalternativ.
- Om du lägger till ett kommatecken efter att den offentliga IP-adressen kringgår Ansibles lagerparserare. Med den här tekniken kan du köra spelböcker utan en inventeringsfil.
Rensa resurser
Spara följande kod som
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Kör spelboken med kommandot ansible-playbook . Ersätt platshållaren med namnet på den resursgrupp som ska tas bort. Alla resurser i resursgruppen tas bort.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Viktiga punkter:
- På grund av variabeln
register
ochdebug
avsnittet i spelboken visas resultatet när kommandot har slutförts.
- På grund av variabeln