Tutoriel : Utiliser Azure Key Vault pour stocker des secrets de machines virtuelles avec Ansible
Dans ce guide de démarrage rapide, vous allez créer et récupérer des secrets dans Azure Key Vault avec Ansible.
Important
Ansible 2.9 (ou version ultérieure) est nécessaire pour exécuter les exemples de playbooks dans cet article.
Dans cet article, vous apprendrez comment :
- Créer une instance Azure Key Vault
- Créer un magasin de secrets dans Azure Key Vault
- Récupérer les secrets d’Azure Key Vault avec Ansible
Prérequis
- 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 en notant les valeurs suivantes : appId, displayName, password et tenant.
Installer Ansible. Pour cela, choisissez l’une des options suivantes :
- Installez et configurez Ansible sur une machine virtuelle Linux
- Configurez Azure Cloud Shell.
Créer un coffre de clés Azure
Ansible a besoin d’un groupe de ressources pour y déployer vos ressources.
Créez un playbook Ansible nommé
create_kv.yml
et ajoutez la tâche suivante pour créer un groupe de ressources :--- - name: Create Azure key vault hosts: localhost connection: local tasks: - name: Create resource group azure_rm_resourcegroup: name: ansible-kv-test-rg location: eastus
Définissez les variables requises pour l’ID de locataire, l’ID d’objet du principal de service et le nom du coffre.
--- vars: tenant_id: <tenantId> object_id: <servicePrincipalObjectId> vault_name: <vaultName>
Remplacez
<tenantId>
,<servicePrincipalObjectId>
et<vaultName>
par les valeurs appropriées. ObjectId permet d’accorder l’accès aux secrets contenus dans le coffre de clés.Point clé :
- Les noms des coffres de clés Azure doivent être globalement uniques. Le coffre de clés et les clés/secrets à l’intérieur de celui-ci sont accessibles par le biais de l’URI
https://{vault-name}.vault.azure.net
.
- Les noms des coffres de clés Azure doivent être globalement uniques. Le coffre de clés et les clés/secrets à l’intérieur de celui-ci sont accessibles par le biais de l’URI
Configurez l’instance Azure Key Vault en ajoutant la tâche
create_kv.yml
.--- - name: Create key vault instance azure_rm_keyvault: resource_group: ansible-kv-test-rg vault_name: "{{ vault_name }}" enabled_for_deployment: yes vault_tenant: "{{ tenant_id }}" sku: name: standard access_policies: - tenant_id: "{{ tenant_id }}" object_id: "{{ object_id }}" secrets: - get - list - set - delete
Exécutez le playbook
create_kv.yml
.ansible-playbook create_kv.yml
PLAY [localhost] ******************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************* ok: [localhost] TASK [Create resource group] ******************************************************************************************* ok: [localhost] TASK [Create key vault instance] ************************************************************************************ ok: [localhost] PLAY RECAP ************************************************************************************************************* localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Terminer la création du playbook Azure Key Vault
Cette section contient l’exemple complet du playbook Ansible utilisé pour créer un coffre de clés Azure.
- hosts: localhost
connection: local
vars:
tenant_id: <tenantId>
object_id: <servicePrincipalObjectId>
vault_name: <vaultName>
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: ansible-kv-test-rg
location: eastus
- name: Create instance of Key Vault
azure_rm_keyvault:
resource_group: ansible-kv-test-rg
vault_name: "{{ vault_name }}"
enabled_for_deployment: yes
vault_tenant: "{{ tenant_id }}"
sku:
name: standard
access_policies:
- tenant_id: "{{ tenant_id }}"
object_id: "{{ object_id }}"
secrets:
- get
- list
- set
- delete
Créer un secret dans un coffre de clés
Avant de pouvoir créer le secret, vous avez besoin de l’URI du coffre de clés.
Créez un autre playbook appelé
create_kv_secret.yml
. Copiez le code suivant dans le playbook :--- - hosts: localhost connection: local tasks: - name: Get Key Vault by name azure_rm_keyvault_info: resource_group: ansible-kv-test-rg name: <vaultName> register: keyvault - name: set KeyVault uri fact set_fact: keyvaulturi="{{ keyvault['keyvaults'][0]['vault_uri'] }}" - name: Create a secret azure_rm_keyvaultsecret: secret_name: adminPassword secret_value: <secretValue> keyvault_uri: "{{ keyvaulturi }}"
Remplacez
<vaultName>
par le nom de votre coffre de clés et<secretValue>
par la valeur de votre secret.Point clé :
- Les modules
azure_rm_keyvault_info
etset_facts
inscrivent l’URI du coffre de clés en tant que variable. Cette variable est ensuite passée au moduleazure_rm_keyvaultsecret
pour créer le secret.
- Les modules
Exécutez le playbook
create_kv_secret.yml
.ansible-playbook create_kv_secret.yml
PLAY [localhost] ******************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************* ok: [localhost] TASK [Get Key Vault by name] ******************************************************************************************* ok: [localhost] TASK [set KeyVault uri fact] ******************************************************************************************* ok: [localhost] TASK [Create a secret] ************************************************************************************************* ok: [localhost] PLAY RECAP ************************************************************************************************************* localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Récupérer les secrets d’un coffre de clés
Les secrets stockés dans un coffre de clés Azure peuvent être utilisés pour remplir des variables Ansible.
Créez un playbook appelé
get_kv_secrets.yml
pour récupérer les secrets d’un coffre de clés avec Ansible.Ansible 2.9 avec azure_preview_modules
--- - hosts: localhost connection: local roles: - { role: azure.azure_preview_modules } vars: tenant_id: <tenantId> vault_name: <vaultName> secret_name: adminPassword client_id: <servicePrincipalApplicationId> client_secret: <servicePrincipalSecret> tasks: - name: Get Key Vault by name azure_rm_keyvault_info: resource_group: ansible-kv-test-rg name: "{{ vault_name }}" register: keyvault - name: Set key vault URI fact set_fact: keyvaulturi="{{ keyvault['keyvaults'][0]['vault_uri'] }}" - name: Set key vault secret fact set_fact: secretValue={{ lookup('azure_keyvault_secret',secret_name,vault_url=keyvaulturi, client_id=client_id, secret=client_secret, tenant_id=tenant_id) }} - name: Output key vault secret debug: msg: "{{ secretValue }}"
Remplacez
<tenantId>
,<vaultName>
,<servicePrincipalApplicationId>
, et<servicePrincipalSecret>
par les valeurs appropriées.Pour en savoir plus sur
azure_preview_modules
, consultez la page Ansible Galaxy.Ansible 2.10 avec azure.azcollection
--- - hosts: localhost connection: local collections: - azure.azcollection vars: vault_name: ansible-kv-test-01 secret_name: adminPassword tasks: - name: Get Key Vault by name azure_rm_keyvault_info: resource_group: ansible-kv-test-rg name: "{{ vault_name }}" register: keyvault - name: Set key vault URI fact set_fact: keyvaulturi="{{ keyvault['keyvaults'][0]['vault_uri'] }}" - name: Get secret value azure_rm_keyvaultsecret_info: vault_uri: "{{ keyvaulturi }}" name: "{{ secret_name }}" register: kvSecret - name: set secret fact set_fact: secretValue="{{ kvSecret['secrets'][0]['secret'] }}" - name: Output key vault secret debug: msg="{{ secretValue }}"
Remplacez
<vaultName>
par la valeur appropriée.Pour en savoir plus sur
azcollection
, consultez Collection Ansible pour Azure.Exécutez le playbook
get-secret-value.yml
.ansible-playbook get-secret-value.yml
TASK [Output key vault secret] ************************************************* ok: [localhost] => { "msg": "<plainTextPassword>" }
Vérifiez que la sortie ayant remplacé
<plainTextPassword>
correspond à la valeur en texte brut du secret précédemment créé dans Azure Key Vault.
Exemple de playbook Ansible complet
Cette section contient l’exemple complet de playbook Ansible utilisé pour configurer une machine virtuelle Windows Azure avec un secret de coffre de clés.
---
- name: Create Azure VM
hosts: localhost
connection: local
gather_facts: false
collections:
- azure.azcollection
vars:
vault_uri: <key_vault_uri>
secret_name: <key_vault_secret_name>
tasks:
- name: Get latest version of a secret
azure_rm_keyvaultsecret_info:
vault_uri: "{{ vault_uri }}"
name: "{{ secret_name }}"
register: kvSecret
- name: Set secret fact
set_fact: secret_value="{{ kvSecret['secrets'][0]['secret'] }}"
- 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: 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: "{{ secret_value }}"
network_interfaces: nic
os_type: Windows
image:
offer: WindowsServer
publisher: MicrosoftWindowsServer
sku: 2019-Datacenter
version: latest
no_log: true
Remplacez <key_vault_uri>
et <key_vault_secret_name>
par les valeurs appropriées.
Nettoyer les ressources
Enregistrez le code suivant en tant que
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Exécutez le playbook en utilisant 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
register
et de la sectiondebug
du playbook, les résultats s’affichent quand la commande se termine.
- En raison de la variable