Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique comment déployer une machine virtuelle Windows Server 2019 dans Azure avec Ansible.
Dans cet article, vous allez apprendre à :
- Créer un groupe de ressources
- Créer un réseau virtuel, une adresse IP publique, un groupe de sécurité réseau et une interface réseau
- Déployer une machine virtuelle Windows Server
- Se connecter à la machine virtuelle via WinRM
- Exécuter un playbook Ansible pour configurer Windows IIS
Prerequisites
- Abonnement Azure : si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
- Principal de service Azure : Créez un principal de service, notez les valeurs suivantes : appId, displayName, password et tenant.
Installez Ansible : Effectuez l’une des options suivantes :
- Installer et configurer Ansible sur une machine virtuelle Linux
- Configurer Azure Cloud Shell
Ajouter la prise en charge de WinRM à Ansible
Pour communiquer sur WinRM, le serveur de contrôle Ansible a besoin du package pywinrmPython.
Exécutez la commande suivante sur le serveur Ansible pour installer pywinrm:
pip install "pywinrm>=0.3.0"
Pour plus d’informations, consultez Gestion à distance Windows pour Ansible.
Créer un groupe de ressources
Créez un playbook Ansible nommé azure_windows_vm.yml et copiez le contenu suivant dans le playbook :
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Points clés :
- Définir
hostsà localhost etconnection_local_exécute le playbook localement sur le serveur Ansible.
Créer le réseau virtuel et le sous-réseau
Ajoutez les tâches suivantes au azure_windows_vm.yml playbook Ansible pour créer un réseau virtuel :
- 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
Créer une adresse IP publique
Ajoutez les tâches suivantes au azure_windows_vm.yml playbook pour créer une adresse IP publique :
- 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 }}"
Points clés :
- Le module Ansible
registerest utilisé pour stocker la sortie à partir d’uneazure_rm_publicipaddressvariable appeléeoutput_ip_address. - Le
debugmodule est utilisé pour générer l’adresse IP publique de la machine virtuelle dans la console.
Créer un groupe de sécurité réseau et une carte réseau
Le groupe de sécurité réseau définit le trafic autorisé et non autorisé à atteindre la machine virtuelle.
Pour ouvrir les ports WinRM et HTTP, ajoutez les tâches suivantes au azure_windows_vm.yml playbook Ansible :
- 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
Points essentiels :
- Une carte d’interface réseau virtuel connecte votre machine virtuelle à son réseau virtuel, à son adresse IP publique et à son groupe de sécurité.
- Le
azure_rm_securitygroupcrée un groupe de sécurité réseau Azure afin de permettre le trafic WinRM du serveur Ansible vers l’hôte distant en autorisant les ports5985et5986.
Créer une machine virtuelle
Créez ensuite une machine virtuelle qui utilise toutes les ressources que vous avez créées dans les sections précédentes de cet article.
Ajoutez la tâche suivante au azure_windows_vm.yml Playbook Ansible :
- 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
La valeur admin_password de la variable Ansible {{ password }} qui contient le mot de passe de la machine virtuelle Windows. Pour remplir cette variable en toute sécurité, ajoutez une var_prompts entrée au début du playbook.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Points essentiels :
- Évitez de stocker des données sensibles sous forme de texte brut. Permet
var_promptsde remplir des variables au moment de l’exécution. Ajoutezno_log: truepour empêcher l'enregistrement des mots de passe.
Configurer l’écouteur WinRM
Ansible utilise PowerShell pour connecter et configurer des hôtes distants Windows via WinRM.
Pour configurer WinRM, ajoutez l’ext azure_rm_virtualmachineextensionsuivant :
- 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 ne peut pas se connecter à la machine virtuelle tant que WinRM n’est pas entièrement configuré.
Ajoutez les tâches suivantes à votre playbook pour attendre la connexion WinRM :
- 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
Points essentiels :
- Le
azure_rm_virtualmachineextensionmodule vous permet d’exécuter un script PowerShell localement sur Azure Windows. L’exécution duConfigureRemotingForAnsible.ps1script PowerShell configure WinRM en créant des certificats auto-signés et en ouvrant les ports nécessaires pour qu’Ansible se connecte. - Le
azure_rm_publicipaddress_infomodule interroge l’adresse IP publique d’Azure, puisset_factstocke la sortie dans une variable que lewait_formodule doit utiliser.
Exemple complet d'un livre de jeu Ansible
Cette section répertorie l’ensemble du playbook Ansible que vous avez créé au cours de cet article.
---
- 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
Se connecter à la machine virtuelle Windows
Créez un playbook Ansible nommé connect_azure_windows_vm.yml et copiez le contenu suivant dans le 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:
Exécutez le playbook Ansible.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Remplacez <publicIPaddress> l’adresse de votre machine virtuelle.
Points clés :
- La configuration d’Ansible détermine comment Ansible se connecte et s’authentifie auprès des hôtes distants. Les variables que vous devez définir pour vous connecter à un hôte Windows dépendent de votre type de connexion WinRM et de l’option d’authentification que vous avez choisie. Pour plus d’informations, consultez Connexions à un hôte Windows et options d’authentification Windows.
- L’ajout d’une virgule après l’adresse IP publique contourne l’analyseur d’inventaire Ansible. Cette technique vous permet d’exécuter des playbooks sans fichier d’inventaire.
Nettoyer les ressources
Enregistrez le code suivant sous
delete_rg.yml.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rgExécutez le playbook à l’aide de la commande ansible-playbook . Remplacez l’espace réservé par le nom du groupe de ressources à supprimer. Toutes les ressources du groupe de ressources seront supprimées.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"Points essentiels :
- En raison de la variable
registeret de la sectiondebugdu playbook, les résultats s’affichent lorsque la commande se termine.
- En raison de la variable