Esercitazione: Usare Azure Key Vault per archiviare i segreti delle macchine virtuali con Ansible
In questo argomento di avvio rapido si creeranno e si recupereranno i segreti dall'insieme di credenziali delle chiavi di Azure con Ansible.
Importante
Per eseguire i playbook di esempio contenuti in questo articolo, è necessario Ansible 2.9 (o versione successiva).
In questo articolo vengono illustrate le operazioni seguenti:
- Creare un'istanza di Azure Key Vault
- Creare un archivio segreto nell'insieme di credenziali delle chiavi di Azure
- Ottenere segreti da Azure Key Vault con Ansible
Prerequisiti
- Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
- Entità servizio di Azure: creare un'entità servizio, prendere nota dei valori seguenti: appId, displayName, password e tenant.
Installare Ansible: eseguire una delle opzioni seguenti:
- Installare e configurare Ansible in una macchina virtuale Linux
- Configurare Azure Cloud Shell
Creare un insieme di credenziali delle chiavi di Azure
Ansible necessita di un gruppo di risorse in cui distribuire le risorse.
Creare un playbook Ansible denominato
create_kv.yml
aggiungere l'attività seguente per creare un gruppo di risorse:--- - name: Create Azure key vault hosts: localhost connection: local tasks: - name: Create resource group azure_rm_resourcegroup: name: ansible-kv-test-rg location: eastus
Definire le variabili necessarie per l'ID tenant, l'ID oggetto entità servizio e il nome dell'insieme di credenziali.
--- vars: tenant_id: <tenantId> object_id: <servicePrincipalObjectId> vault_name: <vaultName>
Sostituire
<tenantId>
,<servicePrincipalObjectId>
e<vaultName>
con i valori appropriati. ObjectId viene usato per concedere l'accesso ai segreti all'interno dell'insieme di credenziali delle chiavi.punto chiave:
- I nomi dell'insieme di credenziali delle chiavi di Azure devono essere univoci a livello globale. L'insieme di credenziali delle chiavi e le chiavi/segreti al suo interno sono accessibili tramite
https://{vault-name}.vault.azure.net
URI.
- I nomi dell'insieme di credenziali delle chiavi di Azure devono essere univoci a livello globale. L'insieme di credenziali delle chiavi e le chiavi/segreti al suo interno sono accessibili tramite
Configurare l'istanza di Azure Key Vault aggiungendo l'attività
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
Eseguire il
create_kv.yml
playbook.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
Completare il playbook di creazione dell'insieme di credenziali delle chiavi di Azure
Questa sezione elenca l'intero playbook ansible di esempio per la creazione di un insieme di credenziali delle chiavi di 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
Creare un segreto nell'insieme di credenziali delle chiavi
Prima di poter creare il segreto, è necessario l'URI dell'insieme di credenziali delle chiavi.
Creare un altro playbook denominato
create_kv_secret.yml
. Copiare il codice seguente nel 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 }}"
Sostituire
<vaultName>
con il nome dell'insieme di credenziali delle chiavi e<secretValue>
con il valore per il segreto.Punto chiave:
- I
azure_rm_keyvault_info
moduli eset_facts
registrano l'URI dell'insieme di credenziali delle chiavi come variabile. Tale variabile viene quindi passata alazure_rm_keyvaultsecret
modulo per creare il segreto.
- I
Eseguire il
create_kv_secret.yml
playbook.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
Ottenere segreti dall'insieme di credenziali delle chiavi
I segreti archiviati in Azure Key Vault possono essere usati per popolare le variabili Ansible.
Creare un nuovo playbook denominato
get_kv_secrets.yml
per recuperare i segreti dell'insieme di credenziali delle chiavi con Ansible.Ansible 2.9 con 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 }}"
Sostituire
<tenantId>
,<vaultName>
<servicePrincipalApplicationId>
, e<servicePrincipalSecret>
con i valori appropriati.Per altre informazioni su
azure_preview_modules
, vedere la pagina Ansible Galaxy .Ansible 2.10 con 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 }}"
Sostituire
<vaultName>
con il valore appropriato.Per altre informazioni su
azcollection
, vedere Raccolta ansible per Azure.Eseguire il
get-secret-value.yml
playbook.ansible-playbook get-secret-value.yml
TASK [Output key vault secret] ************************************************* ok: [localhost] => { "msg": "<plainTextPassword>" }
Verificare che l'output sostituito
<plainTextPassword>
sia il valore di testo normale del segreto creato in precedenza nell'insieme di credenziali delle chiavi di Azure.
Playbook Ansible di esempio completo
Questa sezione elenca l'intero playbook ansible di esempio per la configurazione di una macchina virtuale Windows di Azure usando un segreto dell'insieme di credenziali delle chiavi.
---
- 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
Sostituire <key_vault_uri>
e <key_vault_secret_name>
con i valori appropriati.
Pulire le risorse
Salvare il codice seguente come
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Eseguire il playbook usando il comando ansible-playbook. Sostituire il segnaposto con il nome del gruppo di risorse da eliminare. Tutte le risorse presenti nel gruppo di risorse verranno eliminate.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Punti principali:
- A causa della variabile e
debug
dellaregister
sezione del playbook, i risultati vengono visualizzati al termine del comando.
- A causa della variabile e