在本快速入门中,你将使用 Ansible 从 Azure 密钥保管库创建和检索机密。
重要
要运行本文章中的示例剧本,需使用 Ansible 2.9(或更高版本)。
在这篇文章中,你将学会如何:
- 创建 Azure 密钥保管库实例
- 在 Azure 密钥保管库中创建机密存储
- 使用 Ansible 从 Azure 密钥保管库获取机密
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
- Azure 服务主体: 创建服务主体,记下以下值: appId、 displayName、 密码和 租户。
安装 Ansible:执行以下选项之一:
- 在 Linux 虚拟机上安装和 配置 Ansible
- 配置 Azure Cloud Shell
创建 Azure Key Vault
Ansible 需要一个资源组来部署资源。
创建一个名为
create_kv.yml的 Ansible playbook,并添加以下任务以创建资源组:--- - name: Create Azure key vault hosts: localhost connection: local tasks: - name: Create resource group azure_rm_resourcegroup: name: ansible-kv-test-rg location: eastus定义租户 ID、服务主体对象 ID 和保管库名称所需的变量。
--- vars: tenant_id: <tenantId> object_id: <servicePrincipalObjectId> vault_name: <vaultName>将
<tenantId>、<servicePrincipalObjectId>和<vaultName>替换为适当的值。 objectId 用于授予对密钥保管库中机密的访问权限。关键点:
- Azure 密钥保管库名称必须全局唯一。 密钥库和其中的密钥/机密通过
https://{vault-name}.vault.azure.netURI 进行访问。
- Azure 密钥保管库名称必须全局唯一。 密钥库和其中的密钥/机密通过
通过添加
create_kv.yml任务配置 Azure Key Vault 实例。--- - 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.ymlplaybook。ansible-playbook create_kv.ymlPLAY [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 Key Vault 剧本的创建
本部分列出了用于创建 Azure 密钥保管库的整个 Ansible playbook 示例。
- 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
在密钥保管库中创建机密
在创建机密之前,您需要获取密钥保管库的 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 }}"将
<vaultName>替换为密钥保管库的名称,并将<secretValue>替换为机密的值。关键点:
- 和
azure_rm_keyvault_infoset_facts模块将密钥保管库 URI 注册为变量。 然后,该变量被传递给azure_rm_keyvaultsecret模块以创建密钥。
- 和
运行
create_kv_secret.ymlplaybook。ansible-playbook create_kv_secret.ymlPLAY [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 变量。
创建一个新的 playbook
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 }}"替换
<tenantId>、<vaultName>、<servicePrincipalApplicationId>和<servicePrincipalSecret>为相应的值。若要了解详细信息
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.ymlplaybook。ansible-playbook get-secret-value.ymlTASK [Output key vault secret] ************************************************* ok: [localhost] => { "msg": "<plainTextPassword>" }确认替换
<plainTextPassword>的输出是否为之前在 Azure Key Vault 中创建的机密的纯文本值。
完整示例 Ansible 剧本
本节提供完整的 Ansible playbook 示例,用于通过密钥保管库中的机密配置 Azure Windows VM。
---
- 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_uri> 和 <key_vault_secret_name> 替换为相应的值。
清理资源
将以下代码保存为
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 命令来运行 playbook。 将占位符替换为要删除的资源组的名称。 资源组中的所有资源都将被删除。
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"要点:
- 因为 playbook 中的
register变量和debug部分,命令完成后会显示结果。
- 因为 playbook 中的