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.

Créer un coffre de clés Azure

Ansible a besoin d’un groupe de ressources pour y déployer vos ressources.

  1. 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
    
  2. 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.
  3. 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
    
  4. 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.

  1. 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 et set_facts inscrivent l’URI du coffre de clés en tant que variable. Cette variable est ensuite passée au module azure_rm_keyvaultsecret pour créer le secret.
  2. 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.

  1. 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.

  2. 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

  1. 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
    
  2. 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 section debug du playbook, les résultats s’affichent quand la commande se termine.

Étapes suivantes