자습서: Azure Key Vault를 사용하여 Ansible과 VM 비밀 저장
이 빠른 시작에서는 Ansible을 사용하여 Azure Key Vault에서 비밀을 만들고 검색합니다.
Important
이 문서의 샘플 플레이북을 실행하려면 Ansible 2.9 이상이 필요합니다.
이 문서에서는 다음 방법을 설명합니다.
- Azure Key Vault 인스턴스 만들기
- Azure Key Vault에서 비밀 저장소 만들기
- Ansible을 사용하여 Azure Key Vault에서 비밀 가져오기
필수 조건
- Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Ansible 설치: 다음 옵션 중 하나를 수행합니다.
- Linux 가상 머신에서 Ansible 설치 및 구성
- Azure Cloud Shell 구성
Azure Key Vault 만들기
Ansible에는 리소스를 배포할 리소스 그룹이 필요합니다.
다음 작업을 추가하여 리소스 그룹을 만드는 Ansible
create_kv.yml
플레이북을 만듭니다.--- - 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 Key Vault 이름은 전역적으로 고유해야 합니다. 키 자격 증명 모음 및 키/비밀은 URI를 통해
https://{vault-name}.vault.azure.net
액세스됩니다.
- Azure Key Vault 이름은 전역적으로 고유해야 합니다. 키 자격 증명 모음 및 키/비밀은 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 Key Vault 플레이북 만들기 완료
이 섹션에는 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>
니다.핵심 요소:
- 및
set_facts
모듈은azure_rm_keyvault_info
키 자격 증명 모음 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 Key Vault에 저장된 비밀을 사용하여 Ansible 변수를 채울 수 있습니다.
Ansible을 사용하여 키 자격 증명 모음 비밀을 검색하기 위해 호출된
get_kv_secrets.yml
새 플레이북을 만듭니다.ansible 2.9 with 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 }}"
,
<vaultName>
및<servicePrincipalApplicationId>
<servicePrincipalSecret>
적절한 값으로 바꿉<tenantId>
습니다.자세한 내용은
azure_preview_modules
Ansible Galaxy 페이지를 참조하세요.Azure.azcollection을 사용하는 Ansible 2.10
--- - 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 Key Vault에서 이전에 만든 비밀의 일반 텍스트 값인지 확인합니다.
전체 샘플 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_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 명령을 사용하여 플레이북을 실행합니다. 자리 표시자를 삭제할 리소스 그룹의 이름으로 바꿉니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
주요 정보:
- 플레이북의
register
변수 및debug
섹션으로 인해 명령이 완료되면 결과가 표시됩니다.
- 플레이북의