Kurz: Použití Azure Key Vault k ukládání tajných kódů virtuálních počítače pomocí Ansible

V tomto rychlém startu vytvoříte a načtete tajné kódy ze služby Azure Key Vault pomocí Ansible.

Důležité

Ke spuštění ukázkových playbooků v tomto článku se vyžaduje Ansible 2.9 (nebo novější).

V tomto článku získáte informace o těchto tématech:

  • Vytvoření instance služby Azure Key Vault
  • Vytvoření úložiště tajných klíčů ve službě Azure Key Vault
  • Získání tajných kódů ze služby Azure Key Vault pomocí Ansible

Požadavky

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Vytvoření trezoru klíčů Azure

Ansible potřebuje skupinu prostředků, do které nasadí vaše prostředky.

  1. Vytvořte playbook Ansible s názvem add the following task to create a resource group (Přidejte následující create_kv.yml úlohu pro vytvoření skupiny prostředků):

    ---
    - 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. Definujte požadované proměnné pro ID tenanta, ID objektu služby a název trezoru.

    ---
      vars:
        tenant_id: <tenantId>
        object_id: <servicePrincipalObjectId>
        vault_name: <vaultName>
    

    Nahraďte <tenantId><servicePrincipalObjectId> , a <vaultName> příslušnými hodnotami. ObjectId slouží k udělení přístupu k tajným kódům v rámci trezoru klíčů.

    klíčový bod:

    • Názvy trezoru klíčů Azure musí být globálně univerzálně jedinečné. K trezoru klíčů a klíčům a tajným klíčům v ní se přistupuje prostřednictvím https://{vault-name}.vault.azure.net identifikátoru URI.
  3. Přidejte úlohu a nakonfigurujte instanci služby Azure Key create_kv.yml 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
    
  4. Spusťte 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
    

Dokončení vytváření playbooku služby Azure Key Vault

V této části je uveden celý ukázkový playbook Ansible pro vytvoření trezoru klíčů 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

Vytvoření tajného klíče v trezoru klíčů

Před vytvořením tajného klíče budete potřebovat identifikátor URI trezoru klíčů.

  1. Vytvořte další playbook s názvem create_kv_secret.yml . Do playbooku zkopírujte následující kód:

    ---
    - 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 }}"
    

    Nahraďte <vaultName> názvem vašeho trezoru klíčů <secretValue> a hodnotou tajného klíče.

    Klíčový bod:

    • Moduly azure_rm_keyvault_infoset_facts a zaregistrují identifikátor URI trezoru klíčů jako proměnnou. Tato proměnná se pak předá modulu azure_rm_keyvaultsecret k vytvoření tajného kódu.
  2. Spusťte 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
    

Získání tajných kódů ze služby Key Vault

Tajné kódy uložené ve službě Azure Key Vault je možné použít k naplnění proměnných Ansible.

  1. Vytvořte nový playbook s názvem pro get_kv_secrets.yml načtení tajných kódů trezoru klíčů pomocí Ansible.

    Ansible 2.9 s 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 }}"
    

    Nahraďte <tenantId><vaultName> , , a <servicePrincipalApplicationId><servicePrincipalSecret> příslušnými hodnotami.

    Další informace o najdete azure_preview_modules na stránce azure_preview_modules

    Ansible 2.10 s 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 }}"
    

    Nahraďte <vaultName> příslušnou hodnotou.

    Další informace o najdete azcollection v tématu azcollection

  2. Spusťte get-secret-value.yml playbook.

    ansible-playbook get-secret-value.yml
    
    TASK [Output key vault secret] *************************************************
    ok: [localhost] => {
        "msg": "<plainTextPassword>"
    }
    

    Potvrďte, že nahrazený výstup je hodnota tajného klíče ve formátu <plainTextPassword> prostého textu, která byla dříve vytvořena ve službě Azure Key Vault.

Kompletní ukázkový playbook Ansible

Tato část uvádí celý ukázkový playbook Ansible pro konfiguraci virtuálního počítače Azure Windows pomocí tajného klíče trezoru klíčů.

---
- 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

Nahraďte <key_vault_uri><key_vault_secret_name> a příslušnými hodnotami.

Vyčištění prostředků

  1. Uložte následující kód jako delete_rg.yml .

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. Playbook spusťte pomocí příkazu ansible-playbook. Zástupný text nahraďte názvem skupiny prostředků, která se má odstranit. Všechny prostředky v rámci skupiny prostředků se odstraní.

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

    Klíčové body:

    • Kvůli proměnné register a debug oddílu playbooku se výsledky zobrazí po dokončení příkazu.

Další kroky