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 Artikel werden folgende Vorgehensweisen behandelt:
- 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 kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Azure-Dienstprinzipal: Erstellen Sie einen Dienstprinzipal, und notieren Sie sich die folgenden Werte: appId, displayName, password und tenant.
Installieren von Ansible: Verwenden Sie eine der folgenden Optionen:
- Installieren und Konfigurieren von Ansible auf einem virtuellen Linux-Computer
- Konfigurieren von Azure Cloud Shell
Erstellen einer Azure Key Vault-Instanz
Für Ansible wird eine Ressourcengruppe benötigt, in der Ihre Ressourcen bereitgestellt werden können.
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
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.
- 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
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
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.
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.Wichtiger Punkt:
- Durch die Module
azure_rm_keyvault_info
undset_facts
wird der URI des Schlüsseltresors als Variable registriert. Diese Variable wird dann an das Modulazure_rm_keyvaultsecret
übergeben, um das Geheimnis zu erstellen.
- Durch die Module
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.
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.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
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
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>"
Die wichtigsten Punkte:
- Aufgrund der Variablen
register
und des Abschnittsdebug
des Playbooks werden die Ergebnisse angezeigt, wenn der Befehl abgeschlossen ist.
- Aufgrund der Variablen