Tutorial: Verwenden von Azure Key Vault zum Speichern von VM-Geheimnissen mit Ansible

In dieser Schnellstartanleitung erfahren Sie, wie Sie mit Ansible Geheimnisse erstellen und aus Azure Key Vault abrufen.

Wichtig

Für die Ausführung der Beispielplaybooks in diesem Artikel ist mindestens Ansible 2.9 erforderlich.

In diesem Tutorial wird Ansible für Folgendes verwendet:

  • Erstellen einer Azure Key Vault-Instanz
  • Erstellen eines Geheimnisspeichers in Azure Key Vault
  • Abrufen von Geheimnissen aus Azure Key Vault mit Ansible

Voraussetzungen

  • Azure-Abonnement: Wenn Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Erstellen einer Azure Key Vault-Instanz

Für Ansible wird eine Ressourcengruppe benötigt, in der Ihre Ressourcen bereitgestellt werden können.

  1. Erstellen Sie ein Ansible-Playbook mit dem Namen create_kv.yml, und fügen Sie die folgende Aufgabe hinzu, um eine Ressourcengruppe zu erstellen:

    ---
    - 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. Definieren Sie die erforderlichen Variablen für die Mandanten-ID, die Dienstprinzipalobjekt-ID und den Tresornamen.

    ---
      vars:
        tenant_id: <tenantId>
        object_id: <servicePrincipalObjectId>
        vault_name: <vaultName>
    

    Ersetzen Sie <tenantId>, <servicePrincipalObjectId> und <vaultName> durch die entsprechenden Werte. Die Objekt-ID wird verwendet, um Zugriff auf Geheimnisse im Schlüsseltresor zu gewähren.

    Wichtig:

    • Azure Key Vault-Namen müssen global und universell eindeutig sein. Auf den Schlüsseltresor und die darin enthaltenen Schlüssel/Geheimnisse wird über den URI https://{vault-name}.vault.azure.net zugegriffen.
  3. Konfigurieren Sie die Azure Key Vault-Instanz durch Hinzufügen der Aufgabe 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. Führen Sie das Playbook create_kv.yml aus.

    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
    

Vollständiges Playbook „Create Azure key vault“

In diesem Abschnitt finden Sie das gesamte Ansible-Beispielplaybook zum Erstellen einer Azure Key Vault-Instanz.

- 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

Erstellen eines Geheimnisses im Schlüsseltresor

Damit das Geheimnis erstellt werden kann, benötigen Sie zunächst den URI des Schlüsseltresors.

  1. Erstellen Sie ein weiteres Playbook mit dem Namen create_kv_secret.yml. Kopieren Sie den folgenden Code in das 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 }}"
    

    Ersetzen Sie <vaultName> durch den Namen Ihres Schlüsseltresors und <secretValue> durch den Wert für Ihr Geheimnis.

    Wichtig:

    • Durch die Module azure_rm_keyvault_info und set_facts wird der URI des Schlüsseltresors als Variable registriert. Diese Variable wird dann an das Modul azure_rm_keyvaultsecret übergeben, um das Geheimnis zu erstellen.
  2. Führen Sie das Playbook create_kv_secret.yml aus.

    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
    

Abrufen von Geheimnissen aus dem Schlüsseltresor

In Azure Key Vault gespeicherte Geheimnisse können zum Auffüllen von Ansible-Variablen verwendet werden.

  1. Erstellen Sie ein neues Playbook mit dem Namen get_kv_secrets.yml, um Schlüsseltresorgeheimnisse mit Ansible abzurufen.

    Ansible 2.9 mit „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 }}"
    

    Ersetzen Sie <tenantId>, <vaultName>, <servicePrincipalApplicationId> und <servicePrincipalSecret> durch die entsprechenden Werte.

    Weitere Informationen zu azure_preview_modules finden Sie auf der Seite Ansible Galaxy.

    Ansible 2.10 mit „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 }}"
    

    Ersetzen Sie <vaultName> durch den entsprechenden Wert.

    Weitere Informationen zu azcollection finden Sie in der Ansible-Sammlung für Azure.

  2. Führen Sie das Playbook get-secret-value.yml aus.

    ansible-playbook get-secret-value.yml
    
    TASK [Output key vault secret] *************************************************
    ok: [localhost] => {
        "msg": "<plainTextPassword>"
    }
    

    Vergewissern Sie sich, dass es sich bei der Ausgabe, durch die <plainTextPassword> ersetzt wurde, um den Nur-Text-Wert des Geheimnisses handelt, das zuvor in Azure Key Vault erstellt wurde.

Vollständiges Ansible-Beispielplaybook

In diesem Abschnitt finden Sie das gesamte Ansible-Beispielplaybook zum Konfigurieren eines virtuellen Azure Windows-Computers mit einem Schlüsseltresorgeheimnis.

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

Ersetzen Sie <key_vault_uri> und <key_vault_secret_name> durch die entsprechenden Werte.

Bereinigen von Ressourcen

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

    Wichtigste Punkte:

    • Aufgrund der Variablen register und des Abschnitts debug des Playbooks werden die Ergebnisse angezeigt, wenn der Befehl abgeschlossen ist.

Nächste Schritte