教學課程:使用 Azure 金鑰保存庫搭配 Ansible 儲存 VM 秘密
在本快速入門中,您將使用 Ansible 從 Azure 金鑰保存庫建立和擷取秘密。
重要
需要 Ansible 2.9 (或更新版本)才能執行本文中的範例劇本。
在本文中,您將學會如何:
- 建立 Azure 金鑰保存庫實例
- 在 Azure 金鑰保存庫中建立秘密存放區
- 使用 Ansible 從 Azure 金鑰保存庫取得秘密
必要條件
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
- Azure 服務主體: 建立服務主體 ,並記下下列值: appId 、 displayName 、 密碼 和 租使用者 。
安裝 Ansible :執行下列其中一個選項:
- 在 Linux 虛擬機器上安裝及 設定 Ansible
- 設定 Azure Cloud Shell
建立 Azure 金鑰保存庫
Ansible 需要資源群組才能在 中部署您的資源。
建立名為
create_kv.yml
的 Ansible 劇本,新增下列工作以建立資源群組:--- - name: Create Azure key vault hosts: localhost connection: local tasks: - name: Create resource group azure_rm_resourcegroup: name: ansible-kv-test-rg location: eastus
定義租使用者識別碼、服務主體物件識別碼和保存庫名稱的必要變數。
--- vars: tenant_id: <tenantId> object_id: <servicePrincipalObjectId> vault_name: <vaultName>
將 、
<servicePrincipalObjectId>
和<vaultName>
取代<tenantId>
為適當的值。 objectId 可用來授與金鑰保存庫中秘密的存取權。關鍵點 :
- Azure 金鑰保存庫名稱必須是全域唯一的。 金鑰保存庫及其內的金鑰/秘密可透過 URI 存取
https://{vault-name}.vault.azure.net
。
- Azure 金鑰保存庫名稱必須是全域唯一的。 金鑰保存庫及其內的金鑰/秘密可透過 URI 存取
藉由新增工作來
create_kv.yml
設定 Azure 金鑰保存庫實例。--- - 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
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
完成建立 Azure 金鑰保存庫劇本
本節列出用來建立 Azure 金鑰保存庫的整個範例 Ansible 劇本。
- 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
在金鑰保存庫中建立秘密
建立秘密之前,您將需要 keyvault URI。
建立另一個名為
create_kv_secret.yml
的劇本。 將下列程式碼複製到劇本:--- - 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 }}"
將 取代為您的金鑰保存庫名稱,並將
<secretValue>
取代<vaultName>
為秘密的值。關鍵點 :
azure_rm_keyvault_info
和set_facts
模組會將金鑰保存庫 URI 註冊為變數。 該變數接著會傳遞至azure_rm_keyvaultsecret
模組以建立秘密。
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
從金鑰保存庫取得秘密
儲存在 Azure 金鑰保存庫中的秘密可用來填入 Ansible 變數。
建立名為
get_kv_secrets.yml
的新劇本,以使用 Ansible 擷取金鑰保存庫秘密。具有 azure_preview_modules 的 Ansible 2.9
--- - 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 }}"
將 、
<vaultName>
、<servicePrincipalApplicationId>
和<servicePrincipalSecret>
取代<tenantId>
為適當的值。若要深入瞭解
azure_preview_modules
,請參閱 Ansible Galaxy 頁面。Ansible 2.10 搭配 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 }}"
將 取代
<vaultName>
為適當的值。若要深入瞭解
azcollection
,請參閱 適用于 Azure 的 Ansible 集合。get-secret-value.yml
執行劇本。ansible-playbook get-secret-value.yml
TASK [Output key vault secret] ************************************************* ok: [localhost] => { "msg": "<plainTextPassword>" }
確認所取代
<plainTextPassword>
的輸出是先前在 Azure 金鑰保存庫中建立之秘密的純文字值。
完整範例 Ansible 劇本
本節列出使用金鑰保存庫秘密設定 Azure Windows VM 的整個範例 Ansible 劇本。
---
- 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
將 和 <key_vault_secret_name>
取代 <key_vault_uri>
為適當的值。
清除資源
將下列程式碼儲存為
delete_rg.yml
。--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
使用 ansible-playbook 命令執行劇本 。 將預留位置取代為要刪除的資源群組名稱。 將會刪除資源群組中的所有資源。
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
重點︰
register
由於劇本的變數和debug
區段,因此命令完成時會顯示結果。