Een virtuele Windows-machine maken in Azure met Ansible
In dit artikel wordt beschreven hoe u een virtuele Windows Server 2019-machine implementeert in Azure met Ansible.
In dit artikel leert u het volgende:
- Een brongroep maken
- Een virtueel netwerk, openbaar IP-adres, netwerkbeveiligingsgroep en netwerkinterface maken
- Een virtuele Windows Server-machine implementeren
- Verbinding maken naar de virtuele machine via WinRM
- Een Ansible-playbook uitvoeren om Windows IIS te configureren
Vereisten
- Azure-abonnement: als u nog geen abonnement op Azure hebt, maakt u een gratis Azure-account aan voordat u begint.
- Azure-service-principal: maak een service-principal, noteer de volgende waarden: appId, displayName, wachtwoord en tenant.
Ansible installeren: Voer een van de volgende opties uit:
- Ansible installeren en configureren op een virtuele Linux-machine
- Azure Cloud Shell configureren
WinRM-ondersteuning toevoegen aan Ansible
Voor communicatie via WinRM heeft de Ansible-besturingsserver het Python-pakket pywinrm
nodig.
Voer de volgende opdracht uit op de Ansible-server om te installeren pywinrm
:
pip install "pywinrm>=0.3.0"
Zie Windows Remote Management voor Ansible voor meer informatie.
Een brongroep maken
Maak een Ansible-playbook met de naam azure_windows_vm.yml
en kopieer de volgende inhoud naar het playbook:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Belangrijkste punten:
- Instellen
hosts
op localhost enconnection
als_local_
het playbook lokaal wordt uitgevoerd op de Ansible-server.
Het virtuele netwerk en subnet maken
Voeg de volgende taken toe aan het azure_windows_vm.yml
Ansible-playbook om een virtueel netwerk te maken:
- 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
Een openbaar IP-adres maken
Voeg de volgende taken toe aan het azure_windows_vm.yml
playbook om een openbaar IP-adres te maken:
- 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 }}"
Belangrijkste punten:
- Ansible-module
register
wordt gebruikt om de uitvoer op te slaan inazure_rm_publicipaddress
een variabele met de naamoutput_ip_address
. - De
debug
module wordt gebruikt om het openbare IP-adres van de virtuele machine naar de console uit te voeren.
Netwerkbeveiligingsgroep en NIC maken
Netwerkbeveiligingsgroep definieert welk verkeer is toegestaan en niet is toegestaan om de VIRTUELE machine te bereiken.
Als u de WinRM- en HTTP-poorten wilt openen, voegt u de volgende taken toe aan het azure_windows_vm.yml
Ansible-playbook:
- 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
Belangrijkste punten:
- Een virtuele netwerkinterfacekaart verbindt uw virtuele machine met het virtuele netwerk, het openbare IP-adres en de beveiligingsgroep.
- Hiermee
azure_rm_securitygroup
maakt u een Azure-netwerkbeveiligingsgroep om WinRM-verkeer van de Ansible-server naar de externe host toe te staan door poort5985
en5986
.
Maak een virtuele machine
Maak vervolgens een virtuele machine die gebruikmaakt van alle resources die u in de vorige secties van dit artikel hebt gemaakt.
Voeg de volgende taak toe aan het azure_windows_vm.yml
Ansible-playbook:
- 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
De admin_password
waarde van {{ password }}
is een Ansible-variabele die het wachtwoord van de Windows-VM bevat. Als u die variabele veilig wilt vullen, voegt u een var_prompts
vermelding toe aan het begin van het playbook.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Belangrijkste punten:
- Vermijd het opslaan van gevoelige gegevens als tekst zonder opmaak. Gebruik
var_prompts
dit om variabelen tijdens runtime in te vullen. Voegno_log: true
toe om te voorkomen dat wachtwoorden worden vastgelegd.
De WinRM-listener configureren
Ansible gebruikt PowerShell om externe Windows-hosts te verbinden en te configureren via WinRM.
Als u WinRM wilt configureren, voegt u de volgende ext azure_rm_virtualmachineextension
toe:
- 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 pas verbinding maken met de VIRTUELE machine als WinRM volledig is geconfigureerd.
Voeg de volgende taken toe aan uw playbook om te wachten op de WinRM-verbinding:
- 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
Belangrijkste punten:
azure_rm_virtualmachineextension
Met de module kunt u lokaal een PowerShell-script uitvoeren in Azure Windows. Als u hetConfigureRemotingForAnsible.ps1
PowerShell-script uitvoert, configureert u WinRM door zelfondertekende certificaten te maken en de benodigde poorten te openen zodat Ansible verbinding kan maken.- De
azure_rm_publicipaddress_info
module voert een query uit op het openbare IP-adres van Azure en slaat vervolgensset_fact
de uitvoer op in een variabele die dewait_for
module kan gebruiken.
Volledige voorbeeld van Ansible-playbook
In deze sectie vindt u het volledige Ansible-playbook dat u hebt gemaakt met de verschillende stappen in dit artikel.
---
- 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
Verbinding maken naar de virtuele Windows-machine
Maak een nieuw Ansible-playbook met de naam connect_azure_windows_vm.yml
en kopieer de volgende inhoud naar het playbook:
---
- 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:
Voer het Ansible-playbook uit.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Vervang <publicIPaddress>
door het adres van uw virtuele machine.
Belangrijkste punten:
- De configuratie van Ansible bepaalt hoe Ansible verbinding maakt en verifieert met externe hosts. De variabelen die u moet definiƫren om verbinding te maken met een Windows-host, zijn afhankelijk van uw WinRM-verbindingstype en de verificatieoptie die u hebt gekozen. Zie Verbinding maken naar een Windows-host en Windows-verificatieopties voor meer informatie.
- Door een komma toe te voegen nadat het openbare IP-adres de voorraadparser van Ansible heeft overgeslagen. Met deze techniek kunt u playbooks uitvoeren zonder een inventarisbestand.
Resources opschonen
Sla de volgende code op als
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Voer het playbook uit met behulp van de ansible-playbook-opdracht . Vervang de tijdelijke aanduiding door de naam van de resourcegroep die u wilt verwijderen. Alle resources in de resourcegroep worden verwijderd.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Belangrijkste punten:
- Vanwege de
register
variabele endebug
sectie van het playbook worden de resultaten weergegeven wanneer de opdracht is voltooid.
- Vanwege de