Öğretici: Ansible ile VM gizli dizilerini depolamak için Azure Key Vault kullanma

Bu hızlı başlangıçta, Ansible ile Azure anahtar kasasından gizli diziler oluşturacak ve alacağız.

Önemli

Bu makaledeki örnek playbook'ları çalıştırmak için Ansible 2.9 (veya üzeri) gereklidir.

Bu makalede şunları öğreneceksiniz:

  • Azure anahtar kasası örneği oluşturma
  • Azure anahtar kasasında gizli dizi deposu oluşturma
  • Ansible ile Azure anahtar kasasından gizli dizileri alma

Önkoşullar

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Azure anahtar kasası oluşturma

Ansible,kaynaklarınızı dağıtmak için bir kaynak grubuna ihtiyaç duyar.

  1. Adlı bir Ansible playbook create_kv.yml oluşturun, kaynak grubu oluşturmak için aşağıdaki görevi ekleyin:

    ---
    - 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. Kiracı kimliği, hizmet sorumlusu nesne kimliği ve kasa adı için gerekli değişkenleri tanımlayın.

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

    , <servicePrincipalObjectId>ve <vaultName> değerlerini uygun değerlerle değiştirin<tenantId>. objectId, anahtar kasası içindeki gizli dizilere erişim vermek için kullanılır.

    anahtar noktası:

    • Azure anahtar kasası adları genel olarak evrensel olarak benzersiz olmalıdır. Anahtar kasasına ve içindeki anahtarlara/gizli dizilere URI aracılığıyla https://{vault-name}.vault.azure.net erişilir.
  3. Görevi ekleyerek Azure anahtar kasası örneğini create_kv.yml yapılandırın.

    ---
    - 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. Playbook'u create_kv.yml çalıştırın.

    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 playbook'u oluşturma işlemini tamamlayın

Bu bölümde Azure anahtar kasası oluşturmaya yönelik örnek Ansible playbook'unun tamamı listelenir.

- 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

Anahtar kasasında gizli dizi oluşturma

Gizli dizi oluşturulabilmesi için önce anahtar kasası URI'sine ihtiyacınız olacaktır.

  1. adlı create_kv_secret.ymlbaşka bir playbook oluşturun. Playbook'a aşağıdaki kodu kopyalayın:

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

    değerini anahtar kasası adınızın adıyla ve <secretValue> gizli dizi değeriyle değiştirin<vaultName>.

    Anahtar nokta:

    • azure_rm_keyvault_info ve set_facts modülleri anahtar kasası URI'sini değişken olarak kaydeder. Bu değişken daha sonra gizli diziyi oluşturmak için modüle geçirilir azure_rm_keyvaultsecret .
  2. Playbook'u create_kv_secret.yml çalıştırın.

    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
    

Anahtar kasasından gizli dizileri alma

Azure anahtar kasasında depolanan gizli diziler Ansible değişkenlerini doldurmak için kullanılabilir.

  1. Ansible ile anahtar kasası gizli dizilerini almak için adlı get_kv_secrets.yml yeni bir playbook oluşturun.

    azure_preview_modules ile 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>ve <servicePrincipalSecret> değerlerini uygun değerlerle değiştirin<tenantId>.

    hakkında azure_preview_modulesdaha fazla bilgi edinmek için Ansible Galaxy sayfasına bakın.

    azure.azcollection ile 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 }}"
    

    değerini uygun değerle değiştirin <vaultName> .

    hakkında azcollectiondaha fazla bilgi edinmek için bkz . Azure için Ansible koleksiyonu.

  2. Playbook'u get-secret-value.yml çalıştırın.

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

    Değiştirilen <plainTextPassword> çıkışın daha önce Azure anahtar kasasında oluşturulan gizli dizinin düz metin değeri olduğunu onaylayın.

Örnek Ansible playbook'unun tamamı

Bu bölümde, anahtar kasası gizli dizisi kullanarak Azure Windows VM'sini yapılandırmaya yönelik örnek Ansible playbook'unun tamamı listelenir.

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

ve <key_vault_secret_name> değerlerini uygun değerlerle değiştirin<key_vault_uri>.

Kaynakları temizleme

  1. Aşağıdaki kodu olarak delete_rg.ymlkaydedin.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.

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

    Önemli noktalar:

    • Playbook'un register değişkeni ve debug bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.

Sonraki adımlar