자습서: 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 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure 서비스 주체: appId, displayName, 암호테넌트 값을 기록하여 서비스 주체를 만듭니다.

Azure Key Vault 만들기

Ansible에는 리소스를 배포할 리소스 그룹이 필요합니다.

  1. 다음 작업을 추가하여 리소스 그룹을 만드는 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
    
  2. 테넌트 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 액세스됩니다.
  3. 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
    
  4. 플레이북을 실행합니다 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가 필요합니다.

  1. 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 전달하여 비밀을 만듭니다.
  2. 플레이북을 실행합니다 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 변수를 채울 수 있습니다.

  1. 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_modulesAnsible 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>을 적절한 값으로 바꿉니다.

    자세한 내용은 azcollectionAzure용 Ansible 컬렉션을 참조하세요.

  2. 플레이북을 실행합니다 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>을 해당 값으로 바꿉니다.

리소스 정리

  1. 다음 코드를 .로 delete_rg.yml저장합니다.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook 명령을 사용하여 플레이북을 실행합니다. 자리 표시자를 삭제할 리소스 그룹의 이름으로 바꿉니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    주요 정보:

    • 플레이북의 register 변수 및 debug 섹션으로 인해 명령이 완료되면 결과가 표시됩니다.

다음 단계