Aracılığıyla paylaş


Öğretici: Ansible kullanarak Azure kaynaklarınızın dinamik envanterlerini yapılandırma

Önemli

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

Ansible dinamik envanter özelliği, statik envanter dosyalarını koruma yükünü ortadan kaldırır.

Bu öğreticide, Ansible envanterinizi doldurmak için Azure'ın dinamik envanter eklentisini kullanacaksınız.

Bu makalede şunları öğreneceksiniz:

  • İki test sanal makinesi yapılandırın.
  • Azure sanal makinelerine etiket ekleme
  • Dinamik envanter oluşturma
  • Grup üyeliklerini doldurmak için koşullu ve anahtarlı grupları kullanma
  • Dinamik envanter içindeki gruplara yönelik otomasyon senaryolarını çalıştırma

Önkoşullar

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

Azure VM'leri oluşturma

  1. Azure portalınaoturum açın.

  2. Cloud Shell'i açın.

  3. Bu öğreticinin sanal makinelerini barındırmak için bir Azure kaynak grubu oluşturun.

    Önemli

    Bu adımda oluşturduğunuz Azure kaynak grubunun tamamen küçük harfe sahip bir adı olmalıdır. Aksi takdirde dinamik envanter oluşturma işlemi başarısız olur.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. Aşağıdaki tekniklerden birini kullanarak Azure'da iki Linux sanal makinesi oluşturun:

    • Ansible playbook - Ansible ile Azure'da temel bir Linux sanal makinesi oluşturma ve Ansible ile Azure'da temel bir Windows sanal makinesi oluşturma makalesi, Ansible playbook'tan sanal makine oluşturmayı göstermektedir.

    • Azure CLI - İki sanal makineyi oluşturmak için Cloud Shell'de aşağıdaki komutların her birini çalıştırın:

      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name win-vm \
      --image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest \
      --admin-username azureuser \
      --admin-password <password>
      
      az vm create \
      --resource-group ansible-inventory-test-rg \
      --name linux-vm \
      --image Ubuntu2204 \
      --admin-username azureuser \
      --admin-password <password>
      

      <password> Parolanızı değiştirin.

Uygulama rolü etiketleri ekleme

Etiketler, Azure kaynaklarını düzenlemek ve kategorilere ayırmak için kullanılır. Azure VM'lerine bir uygulama rolü atamak, etiketleri Azure dinamik envanterinde grup adları olarak kullanmanıza olanak tanır.

VM etiketlerini güncelleştirmek için aşağıdaki komutları çalıştırın:

az vm update \
--resource-group ansible-inventory-test-rg \
--name linux-vm \
--set tags.applicationRole='message-broker' 

az vm update \
--resource-group ansible-inventory-test-rg \
--name win-vm \
--set tags.applicationRole='web-server' 

Azure etiketleme stratejileri hakkında daha fazla bilgi için bkz. Etiketleme stratejinizi tanımlama.

Dinamik envanter oluşturma

Ansible bir Azure dinamik envanter eklentisi sağlar.

Aşağıdaki adımlar eklentiyi kullanma konusunda size yol göstereceğiz:

  1. adlı dinamik bir envanter oluşturma myazure_rm.yml

    plugin: azure_rm
    include_vm_resource_groups:
      - ansible-inventory-test-rg
    auth_source: auto
    

    Anahtar nokta:

    • Ansible, hangi envanter eklentisinin kullanılacağını belirlemek için envanter dosyası adını ve uzantısını kullanır. Azure dinamik envanter eklentisini kullanmak için dosyanın ile azure_rm bitmesi ve ya da ymlyamluzantısına sahip olması gerekir.
  2. Kaynak grubundaki VM'leri sorgulamak için aşağıdaki komutu çalıştırın:

    ansible-inventory -i myazure_rm.yml --graph
    
  3. Komutu çalıştırdığınızda aşağıdaki çıkışa benzer sonuçlar görürsünüz:

    @all:
      |--@ungrouped:
      |  |--linux-vm_cdb4
      |  |--win-vm_3211
    

Her iki VM de Ansible envanterindeki ungrouped grubun alt öğesi all olan gruba aittir.

Anahtar nokta:

  • Varsayılan olarak Azure dinamik envanter eklentisi genel olarak benzersiz adlar döndürür. Bu nedenle, VM adları fazladan karakterler içerebilir. Dinamik envantere ekleyerek plain_host_names: yes bu davranışı devre dışı bırakabilirsiniz.

Azure VM host değişkenlerini bulma

Tüm hostvarsgörüntülemek için aşağıdaki komutu çalıştırın:

ansible-inventory -i myazure_rm.yml --list
{
    "_meta": {
        "hostvars": {
            "linux-vm_cdb4": {
                "ansible_host": "52.188.118.79",
                "availability_zone": null,
                "computer_name": "linux-vm",
                "default_inventory_hostname": "linux-vm_cdb4",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/linux-vm",
                "image": {
                    "offer": "0001-com-ubuntu-server-jammy",
                    "publisher": "Canonical",
                    "sku": "22_04-lts-gen2",
                    "version": "latest"
                },
                ...,
                "tags": {
                    "applicationRole": "message-broker"
                },
                ...
            },
            "win-vm_3211": {
                "ansible_host": "52.188.112.110",
                "availability_zone": null,
                "computer_name": "win-vm",
                "default_inventory_hostname": "win-vm_3211",
                "id": "/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/win-vm",
                "image": {
                    "offer": "WindowsServer",
                    "publisher": "MicrosoftWindowsServer",
                    "sku": "2019-Datacenter",
                    "version": "latest"
                },
                ...
                "tags": {
                    "applicationRole": "web-server"
                },
                ...
            }
        }
    },
    ...
    }
}

Azure'dan bilgi çekilerek dinamik envanter, her Azure VM için hostvars öğesini doldurur. Bunlar hostvars daha sonra Ansible envanteri içindeki VM grubu üyeliklerini belirlemek için yapılır.

conditional_groups ile grup üyeliğini atayın

Her koşullu grup iki bölümden oluşur. Grubun adı ve gruba üye ekleme koşulu.

image.offer için koşullu grup üyeliği oluşturmak için özelliğini kullanın.

Dinamik envanteri myazure_rm.yml açın ve aşağıdakileri conditional_groupekleyin:

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'ubuntu' in image.offer"
  windows: "'WindowsServer' in image.offer"

ansible-inventory komutunu --graph seçeneği ile çalıştırın.

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

Çıktıdan VM'lerin artık grupla ungrouped ilişkilendirilmemiş olduğunu görebilirsiniz. Bunun yerine, her VM dinamik envanter tarafından oluşturulan yeni bir gruba atanır.

Anahtar nokta:

  • Koşullu gruplar, envanterinizin içindeki belirli grupları adlandırmanıza ve kullanarak hostvarsdoldurmanıza olanak sağlar.

keyed_groups ile grup üyeliği atama

Anahtarlı gruplar grup üyeliğini koşullu grupların atayıldığı gibi atar, ancak anahtarlı grup kullanılırken grup adı da dinamik olarak doldurulur.

Aşağıdaki keyed_group'u myazure_rm.yml dinamik envantere ekleyin:

plugin: azure_rm
include_vm_resource_groups:
  - ansible-inventory-test-rg
auth_source: auto
conditional_groups:
  linux: "'ubuntu' in image.offer"
  windows: "'WindowsServer' in image.offer"
keyed_groups:
 - key: tags.applicationRole

ansible-inventory komutunu --graph seçeneği ile çalıştırın.

ansible-inventory -i myazure_rm.yml --graph
@all:
  |--@_message_broker:
  |  |--linux-vm_cdb4
  |--@_web_server:
  |  |--win-vm_3211
  |--@linux:
  |  |--linux-vm_cdb4
  |--@ungrouped:
  |--@windows:
  |  |--win-vm_3211

Çıktıdan iki grup _message_broker daha ve _web_servergörürsünüz. Etiket, applicationRole anahtarlı bir grup kullanarak grup adlarını ve grup üyeliklerini doldurur.

Anahtar nokta:

  • Varsayılan olarak, anahtarlı gruplar bir ayırıcı içerir. Ayırıcıyı kaldırmak için key özelliğinin altına ekleyin separator: "" .

Playbook'ları grup adı desenleriyle çalıştırma

Alt grupları hedeflemek için dinamik envanter tarafından oluşturulan grupları kullanın.

  1. win_ping.yml adlı ve aşağıdaki içeriklere sahip bir playbook oluşturun.

    ---
    - hosts: windows
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter local username"
          private: false
        - name: password
          prompt: "Enter password"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_connection: winrm
        ansible_winrm_transport: ntlm
        ansible_winrm_server_cert_validation: ignore
    
      tasks:
        - name: run win_ping
          win_ping:
    
  2. Playbook'u win_ping.yml çalıştırın.

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    İstendiğinde, Azure Windows VM için username ve password'yi girin.

    Enter local username: azureuser
    Enter password:
    
    PLAY [windows] **************************************************************************************************************************************
    
    TASK [run win_ping] *********************************************************************************************************************************
    ok: [win-vm_3211]
    
    PLAY RECAP ******************************************************************************************************************************************
    win-vm_3211                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    Önemli

    hatasını winrm or requests is not installed: No module named 'winrm'alırsanız, aşağıdaki komutla pywinrm'i yükleyin: pip install "pywinrm>=0.3.0"

  3. İçeriği aşağıdaki gibi olan ikinci bir ping.yml adlı playbook oluşturun.

    ---
    - hosts: all
      gather_facts: false
    
      vars_prompt:
        - name: username
          prompt: "Enter ssh user"
        - name: password
          prompt: "Enter password for ssh user"
    
      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
    
      tasks:
        - name: run ping
          ping:
    
  4. Playbook'u ping.yml çalıştırın.

    ansible-playbook ping.yml -i myazure_rm.yml
    

    İstendiğinde, Azure Linux VM için username ve password değerlerini girin.

    Enter ssh username: azureuser
    Enter password for ssh user:
    
    PLAY [linux] *******************************************************************************************************
    
    TASK [run ping] ****************************************************************************************************
    ok: [linux-vm_cdb4]
    
    PLAY RECAP *********************************************************************************************************
    linux-vm_cdb4              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
    

Kaynakları temizle

  1. Kaynak grubunu silmek için az group delete komutunu çalıştırın. Kaynak grubundaki tüm kaynaklar silinir.

    az group delete --name <resource_group>
    
  2. az group show kullanılarak kaynak grubunun silindiğini doğrulayın.

    az group show --name <resource_group>
    

Sonraki Adımlar