Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird gezeigt, wie Sie eine Windows Server 2019-VM in Azure mit Ansible bereitstellen.
In diesem Artikel erfahren Sie, wie Sie:
- Erstellen einer Ressourcengruppe
- Erstellen eines virtuellen Netzwerks, einer öffentlichen IP, einer Netzwerksicherheitsgruppe und einer Netzwerkschnittstelle
- Bereitstellen eines virtuellen Windows Server-Computers
- Herstellen einer Verbindung mit dem virtuellen Computer über WinRM
- Ausführen eines Ansible Playbook zum Konfigurieren von Windows IIS
Voraussetzungen
- Azure-Abonnement: Wenn Sie nicht über ein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.
- Azure-Dienstprinzipal: Erstellen Sie einen Dienstprinzipal, und notieren Sie sich die folgenden Werte: appId, displayName, Kennwort und Mandant.
Installieren Sie Ansible: Führen Sie eine der folgenden Optionen aus:
- Installieren und Konfigurieren von Ansible auf einem virtuellen Linux-Computer
- Konfigurieren von Azure Cloud Shell
Hinzufügen der WinRM-Unterstützung zu Ansible
Um über WinRM zu kommunizieren, benötigt ansible Control Server das Python-Paket pywinrm.
Führen Sie zum Installieren pywinrmden folgenden Befehl auf dem Ansible-Server aus:
pip install "pywinrm>=0.3.0"
Weitere Informationen finden Sie unter 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
Wichtige Punkte:
- Die Einstellung von
hostsauf localhost undconnectionauf_local_führt das Playbook lokal auf dem Ansible-Server aus.
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 }}"
Wichtige Punkte:
- Das Ansible
registerModul wird verwendet, um die Ausgabe vonazure_rm_publicipaddressin einer Variable namensoutput_ip_addresszu speichern. - Das
debugModul wird verwendet, um die öffentliche IP-Adresse des virtuellen Computers an die Konsole auszugeben.
Erstellen von Netzwerksicherheitsgruppen und NIC
Die Netzwerksicherheitsgruppe definiert, welcher Datenverkehr zulässig ist und nicht die VM erreichen darf.
Um die WinRM- und HTTP-Ports zu öffnen, fügen Sie dem azure_windows_vm.yml Ansible Playbook die folgenden Aufgaben hinzu:
- 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
Wichtige Punkte:
- Eine Karte der virtuellen Netzwerkschnittstelle verbindet Ihren virtuellen Computer mit seinem virtuellen Netzwerk, der öffentlichen IP-Adresse und der Sicherheitsgruppe.
- Die
azure_rm_securitygrouperstellt eine Azure-Netzwerksicherheitsgruppe, um WinRM-Datenverkehr vom Ansible-Server zum Remotehost zuzulassen, indem die Ports5985und5986zugelassen werden.
Erstellen eines virtuellen Computers
Erstellen Sie als Nächstes einen virtuellen Computer, der alle Ressourcen verwendet, die Sie in den vorherigen Abschnitten dieses Artikels erstellt haben.
Fügen Sie dem azure_windows_vm.yml Ansible Playbook 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 von {{ password }} ist eine Ansible-Variable, die das Kennwort der Windows-VM enthält. Um diese Variable sicher aufzufüllen, fügen Sie einen var_prompts Eintrag am Anfang des Playbook hinzu.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Wichtige Punkte:
- Vermeiden Sie das Speichern vertraulicher Daten als Nur-Text. Verwenden Sie
var_prompts, um Variablen zur Laufzeit zu befüllen. Fügen Sie hinzuno_log: true, um zu verhindern, dass Kennwörter protokolliert werden.
Konfigurieren des WinRM-Listeners
Ansible verwendet PowerShell zum Verbinden und Konfigurieren von Windows-Remotehosts über WinRM.
Um WinRM zu konfigurieren, fügen Sie die folgende Erweiterung azure_rm_virtualmachineextension 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 keine Verbindung zur VM herstellen, bis WinRM vollständig konfiguriert ist.
Fügen Sie Ihrem Playbook die folgenden Aufgaben hinzu, um auf die WinRM-Verbindung zu warten:
- 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
Wichtige Punkte:
- Mit dem
azure_rm_virtualmachineextensionModul können Sie ein PowerShell-Skript lokal unter Azure Windows ausführen. Durch das Ausführen desConfigureRemotingForAnsible.ps1PowerShell-Skripts wird Windows Remoting konfiguriert, indem selbstsignierte Zertifikate erstellt werden und die notwendigen Ports geöffnet werden, um Ansible eine Verbindung zu ermöglichen. - Das
azure_rm_publicipaddress_infoModul fragt die öffentliche IP-Adresse von Azure ab und speichert dannset_factdie Ausgabe in einer Variablen für daswait_forzu verwendende Modul.
Vollständiges Beispiel "Ansible-Playbook"
In diesem Abschnitt wird das gesamte Ansible Playbook aufgeführt, das Sie im Verlauf 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 connect_azure_windows_vm.yml und 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 Ihrer virtuellen Maschine.
Wichtige Punkte:
- Die Konfiguration von Ansible bestimmt, wie Ansible eine Verbindung mit Remotehosts herstellt und authentifiziert. Die Variablen, die Sie definieren müssen, um eine Verbindung mit einem Windows-Host herzustellen, hängen vom WinRM-Verbindungstyp und der ausgewählten Authentifizierungsoption ab. Weitere Informationen finden Sie unter "Herstellen einer Verbindung mit einem Windows-Host " und " Windows-Authentifizierungsoptionen".
- Durch das Hinzufügen eines Kommas nach 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: rgFühren Sie das Playbook mit dem Befehl "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>"Wichtige Punkte:
- Aufgrund der
registerVariablen und desdebugAbschnitts des Playbooks werden die Ergebnisse angezeigt, sobald der Befehl abgeschlossen ist.
- Aufgrund der