Erstellen eines virtuellen Windows-Computers in Azure mithilfe von Ansible
In diesem Artikel wird gezeigt, wie Sie eine Windows Server 2019-VM in Azure mit Ansible bereitstellen.
In diesem Artikel werden folgende Vorgehensweisen behandelt:
- Erstellen einer Ressourcengruppe
- Erstellen eines virtuellen Netzwerks, einer öffentlichen IP-Adresse, einer Netzwerksicherheitsgruppe und einer Netzwerkschnittstelle
- Bereitstellen eines virtuellen Windows Server-Computers
- Herstellen einer Verbindung mit dem virtuellen Computer per WinRM
- Ausführen eines Ansible-Playbooks für die Konfiguration von Windows IIS
Voraussetzungen
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Azure-Dienstprinzipal: Erstellen Sie einen Dienstprinzipal, und notieren Sie sich die folgenden Werte: appId, displayName, password und tenant.
Installieren von Ansible: Verwenden Sie eine der folgenden Optionen:
- Installieren und Konfigurieren von Ansible auf einem virtuellen Linux-Computer
- Konfigurieren von Azure Cloud Shell
Hinzufügen von WinRM-Unterstützung zu Ansible
Für die Kommunikation über WinRM benötigt der Ansible-Steuerungsserver das Python-Paket pywinrm
.
Führen Sie den folgenden Befehl auf dem Ansible-Server aus, um pywinrm
zu installieren:
pip install "pywinrm>=0.3.0"
Weitere Informationen finden Sie auf der Seite zur Windows-Remoteverwaltung für Ansible.
Erstellen einer Ressourcengruppe
Erstellen Sie ein Ansible-Playbook mit dem Namen azure_windows_vm.yml
, und kopieren Sie den folgenden Inhalt in das Playbook:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Die wichtigsten Punkte:
- Die Einstellung
hosts
auf "localhost" undconnection
wie_local_
das Playbook lokal auf dem Ansible-Server ausgeführt wird.
Erstellen des virtuellen Netzwerks und des Subnetzes
Fügen Sie dem azure_windows_vm.yml
Ansible Playbook die folgenden Aufgaben hinzu, um ein virtuelles Netzwerk zu erstellen:
- 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
Erstellen einer öffentlichen IP-Adresse
Fügen Sie dem azure_windows_vm.yml
Playbook die folgenden Aufgaben hinzu, um eine öffentliche IP-Adresse zu erstellen:
- 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 }}"
Die wichtigsten Punkte:
- Das Ansible-Modul
register
wird verwendet, um die Ausgabe vonazure_rm_publicipaddress
in einer Variablen mit dem Namenoutput_ip_address
zu speichern. - Das
debug
Modul wird verwendet, um die öffentliche IP-Adresse des virtuellen Computers an die Konsole auszugeben.
Erstellen einer Netzwerksicherheitsgruppe und Netzwerkschnittstelle
Mit der Netzwerksicherheitsgruppe wird definiert, welcher Datenverkehr für den virtuellen Computer zugelassen wird und diesen erreichen kann.
Fügen Sie dem Ansible-Playbook azure_windows_vm.yml
die folgenden Aufgaben hinzu, um die WinRM- und HTTP-Ports zu öffnen:
- 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
Die wichtigsten Punkte:
- Eine virtuelle Netzwerkschnittstellenkarte verbindet Ihren virtuellen Computer mit dem zugehörigen virtuellen Netzwerk, der öffentlichen IP-Adresse und der Sicherheitsgruppe.
- Mit
azure_rm_securitygroup
wird eine Azure-Netzwerksicherheitsgruppe erstellt, um das Fließen von WinRM-Datenverkehr vom Ansible-Server zum Remotehost zu ermöglichen, indem die Nutzung der Ports5985
und5986
zugelassen wird.
Erstellen eines virtuellen Computers
Als Nächstes erstellen Sie einen virtuellen Computer, für den alle Ressourcen verwendet werden, die Sie in den vorherigen Abschnitten dieses Artikels erstellt haben.
Fügen Sie dem Ansible-Playbook azure_windows_vm.yml
die folgende Aufgabe hinzu:
- 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
Der Wert {{ password }}
für admin_password
ist eine Ansible-Variable, die das Windows-VM-Kennwort enthält. Fügen Sie am Anfang des Playbooks den Eintrag var_prompts
hinzu, um das sichere Einfügen dieser Variablen zu ermöglichen.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Die wichtigsten Punkte:
- Vermeiden Sie es, vertrauliche Daten im Nur-Text-Format zu speichern. Verwenden Sie
var_prompts
, um Variablen zur Laufzeit einzufügen. Fügen Sieno_log: true
hinzu, um zu verhindern, dass Kennwörter protokolliert werden.
Konfigurieren des WinRM-Listeners
Für Ansible wird PowerShell genutzt, um Windows-Remotehosts per WinRM zu verbinden und zu konfigurieren.
Fügen Sie zum Konfigurieren von WinRM die Erweiterung azure_rm_virtualmachineextension
wie folgt hinzu:
- 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 kann erst eine Verbindung mit dem virtuellen Computer herstellen, nachdem WinRM vollständig konfiguriert wurde.
Fügen Sie Ihrem Playbook die folgenden Aufgaben hinzu, damit auf die WinRM-Verbindung gewartet wird:
- 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
Die wichtigsten Punkte:
- Mit dem Modul
azure_rm_virtualmachineextension
können Sie ein PowerShell-Skript lokal in der Azure Windows-Umgebung ausführen. Durch die Ausführung des PowerShell-SkriptsConfigureRemotingForAnsible.ps1
wird WinRM konfiguriert, indem selbstsignierte Zertifikate erstellt und die erforderlichen Ports für die Ansible-Verbindungsherstellung geöffnet werden. - Mit dem Modul
azure_rm_publicipaddress_info
wird die öffentliche IP-Adresse aus Azure abgefragt, und anschließend wird mitset_fact
die Ausgabe in einer Variablen gespeichert, die vom Modulwait_for
verwendet werden kann.
Vollständiges Ansible-Beispielplaybook
Dieser Abschnitt enthält das gesamte Ansible-Beispielplaybook, das Sie im Rahmen dieses Artikels erstellt haben.
---
- 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
Herstellen einer Verbindung mit dem virtuellen Windows-Computer
Erstellen Sie ein neues Ansible Playbook namens und connect_azure_windows_vm.yml
kopieren Sie den folgenden Inhalt in das 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:
Führen Sie das Ansible-Playbook aus.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Ersetzen Sie <publicIPaddress>
durch die Adresse Ihres virtuellen Computers.
Die wichtigsten Punkte:
- Anhand der Konfiguration von Ansible wird bestimmt, wie Ansible eine Verbindung mit Remotehosts herstellt und die Authentifizierung dafür durchführt. Die Variablen, die Sie für die Verbindungsherstellung mit einem Windows-Host definieren müssen, richten sich nach Ihrem WinRM-Verbindungstyp und der gewählten Authentifizierungsoption. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit einem Windows-Host und Windows-Authentifizierungsoptionen.
- Durch Hinzufügen eines Kommas nach der Umgehung der öffentlichen IP-Adresse wird der Bestandsparser von Ansible umgangen. Mit dieser Technik können Sie Playbooks ohne Bestandsdatei ausführen.
Bereinigen von Ressourcen
Speichern Sie den folgenden Code als
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Führen Sie das Playbook mithilfe des Befehls ansible-playbook aus. Ersetzen Sie den Platzhalter durch den Namen der zu löschenden Ressourcengruppe. Alle Ressourcen innerhalb der Ressourcengruppe werden gelöscht.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Die wichtigsten Punkte:
- Aufgrund der Variablen
register
und des Abschnittsdebug
des Playbooks werden die Ergebnisse angezeigt, wenn der Befehl abgeschlossen ist.
- Aufgrund der Variablen