Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 met de virtuele machine via WinRM
- Een Ansible-playbook uitvoeren om Windows IIS te configureren
Vereiste voorwaarden
- Azure-abonnement: als u geen Azure-abonnement hebt, maakt u een gratis account 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 pywinrmnodig.
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:
- Stel
hostsin op localhost enconnection, zodat het playbook lokaal draait 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
registermodule wordt gebruikt om de uitvoer vanazure_rm_publicipaddressop te slaan in een variabele met de naamoutput_ip_address. - De
debugmodule 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.
- De
azure_rm_securitygroupmaakt een Azure-netwerkbeveiligingsgroep aan om WinRM-verkeer van de Ansible-server naar de externe host toe te staan door poorten5985en5986toe te staan.
Een virtuele machine maken
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_promptsdit om variabelen tijdens runtime in te vullen. Voegno_log: truetoe 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_virtualmachineextensiontoe:
- 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_virtualmachineextensionMet de module kunt u lokaal een PowerShell-script uitvoeren in Azure Windows. Als u hetConfigureRemotingForAnsible.ps1PowerShell-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_infomodule voert een query uit op het openbare IP-adres van Azure en slaat vervolgensset_factde uitvoer op in een variabele die dewait_formodule kan gebruiken.
Voorbeeld van een Ansible-playbook voltooien
In deze sectie vindt u het volledige Ansible-voorbeeldplaybook dat u in de loop van dit artikel hebt opgebouwd.
---
- 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 met 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 met een Windows-host en Windows-verificatieopties voor meer informatie.
- Door een komma toe te voegen na het openbare IP-adres, wordt de voorraadparser van Ansible omzeild. Met deze techniek kunt u playbooks uitvoeren zonder een inventarisbestand.
De hulpbronnen 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: rgVoer 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
registervariabele endebugsectie van het playbook worden de resultaten weergegeven wanneer de opdracht is voltooid.
- Vanwege de