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
- 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
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.
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.
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
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 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 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.
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.
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
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.
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