자습서: Ansible을 사용하여 Azure 리소스의 동적 인벤토리 구성

Important

이 문서의 샘플 플레이북을 실행하려면 Ansible 2.8 이상이 필요합니다.

주의

이 문서에서는 EOL(수명 종료) 상태에 가까워진 Linux 배포판인 CentOS를 참조하세요. 이에 따라 사용 및 플랜을 고려하세요. 자세한 내용은 CentOS 수명 종료 지침을 참조하세요.

Ansible 동적 인벤토리 기능은 정적 인벤토리 파일을 기본 부담을 제거합니다.

이 자습서에서는 Azure의 동적 인벤토리 플러그 인을 사용하여 Ansible 인벤토리를 채웁니다.

이 문서에서는 다음 방법을 설명합니다.

  • 두 개의 테스트 가상 머신을 구성합니다.
  • Azure 가상 머신에 태그 추가
  • 동적 인벤토리 생성
  • 조건부 및 키 그룹을 사용하여 그룹 멤버 자격 채우기
  • 동적 인벤토리 내의 그룹에 대해 플레이북 실행

필수 조건

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

Azure VM 만들기

  1. Azure Portal에 로그인합니다.

  2. Cloud Shell을 엽니다.

  3. 이 자습서의 가상 머신을 보관할 Azure 리소스 그룹을 만듭니다.

    Important

    이 단계에서 만든 Azure 리소스 그룹에는 모두 소문자로 구성된 이름이 있어야 합니다. 그렇지 않으면 동적 인벤토리 생성이 실패합니다.

    az group create --resource-group ansible-inventory-test-rg --location eastus
    
  4. 다음 방법 중 하나를 사용하여 Azure에 두 개의 Linux 가상 머신을 만듭니다.

    • Ansible 플레이북 - Ansible을 사용하여 Azure에서 기본 Linux 가상 머신 만들기 및 Ansible을 사용하여 Azure에서 기본 Windows 가상 머신 만들기 문서는 Ansible 플레이북에서 가상 머신을 만드는 방법을 보여 줍니다.

    • Azure CLI - Cloud Shell에서 다음 명령을 각각 실행하여 두 개의 가상 머신을 만듭니다.

      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 CentOS85Gen2 \
      --admin-username azureuser \
      --admin-password <password>
      

      <password> 암호를 바꿉니다.

애플리케이션 역할 태그 추가

태그는 Azure 리소스를 구성하고 분류하는 데 사용됩니다. Azure VM에 애플리케이션 역할을 할당하면 Azure 동적 인벤토리 내에서 태그를 그룹 이름으로 사용할 수 있습니다.

다음 명령을 실행하여 VM 태그를 업데이트합니다.

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 태그 지정 전략에 대해 자세히 알아봅니다.

동적 인벤토리 생성

Ansible은 Azure 동적 인벤토리 플러그 인을 제공합니다.

다음 단계는 이 플러그 인을 사용하는 과정을 안내합니다.

  1. myazure_rm.yml이라는 이름의 동적 인벤토리 만들기

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

    핵심 요소:

    • Ansible은 인벤토리 파일 이름 및 확장명을 사용하여 사용할 인벤토리 플러그 인을 식별합니다. Azure 동적 인벤토리 플러그 인을 사용하려면 파일이 종료 azure_rm 되고 확장명이 하나 yml 또는 yaml여야 합니다.
  2. 다음 명령을 실행하여 리소스 그룹 내에서 VM을 쿼리합니다.

    ansible-inventory -i myazure_rm.yml --graph
    
  3. 명령이 실행되면 다음 출력과 비슷한 결과가 표시됩니다.

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

두 VM 모두 Ansible 인벤토리에 있는 그룹의 자식 all 인 그룹에 속 ungrouped 합니다.

핵심 요소:

  • 기본적으로 Azure 동적 인벤토리 플러그 인은 전역적으로 고유한 이름을 반환합니다. 이것이 VM 이름 뒤의 추가 문자에 대한 이유입니다. 동적 인벤토리에 추가하여 plain_host_names: yes 사용하지 않도록 설정할 수 있습니다.

Azure VM hostvars 찾기

다음 명령을 실행하여 모든 다음을 확인합니다 hostvars.

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": "CentOS",
                    "publisher": "OpenLogic",
                    "sku": "7.7",
                    "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에서 정보를 끌어와 동적 인벤토리는 각 Azure VM에 hostvars 대한 정보를 채웁니다. 그런 다음, hostvars는 Ansible 인벤토리 내에서 VM 그룹 멤버 자격을 확인합니다.

conditional_groups 사용하여 그룹 멤버 자격 할당

각 조건부 그룹은 두 부분으로 구성됩니다. 그룹의 이름 및 그룹에 멤버를 추가하기 위한 조건입니다.

Linux-vm에 대한 조건부 그룹 멤버 자격을 만들려면 이 속성을 image.offer 사용합니다.

동적 인벤토리를 myazure_rm.yml 열고 다음을 추가합니다 conditional_group.

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

--graph 옵션으로 ansible-inventory를 실행합니다.

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

출력에서 VM이 더 이상 그룹과 연결되지 않는 것을 ungrouped 볼 수 있습니다. 대신 각각이 동적 인벤토리에 의해 만들어진 새 그룹에 할당됩니다.

핵심 요소:

  • 조건부 그룹을 사용하면 인벤토리 내에서 특정 그룹의 이름을 지정하고 hostvars를 사용하여 채울 수 있습니다.

keyed_groups를 사용하여 그룹 멤버 자격 할당

키 지정 그룹은 조건부 그룹과 동일한 방식으로 그룹 멤버 자격을 할당하지만 키 그룹을 사용하는 경우 그룹 이름도 동적으로 채워집니다.

myazure_rm.yml 동적 인벤토리에 다음 keyed_group을 추가합니다.

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

--graph 옵션으로 ansible-inventory를 실행합니다.

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

출력에는 두 개의 그룹 _message_broker_web_server가 모두 표시됩니다. 키 그룹을 사용하여 태그에 applicationRole 그룹 이름과 그룹 멤버 자격이 채워집니다.

핵심 요소:

  • 기본적으로 키 그룹에는 구분 기호가 포함됩니다. 구분 기호를 제거하려면 키 속성 아래에 추가 separator: "" 합니다.

그룹 이름 패턴을 사용하여 플레이북 실행

동적 인벤토리에서 만든 그룹을 사용하여 하위 그룹을 대상으로 지정합니다.

  1. 다음 콘텐츠를 사용하여 win_ping.yml이라는 플레이북을 만듭니다.

    ---
    - 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. 플레이북을 실행합니다 win_ping.yml .

    ansible-playbook win_ping.yml -i myazure_rm.yml
    

    메시지가 표시되면 Azure Windows VM을 username 입력합니다 password .

    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
    

    Important

    오류가 winrm or requests is not installed: No module named 'winrm'발생하면 다음 명령을 사용하여 pywinrm을 설치합니다. pip install "pywinrm>=0.3.0"

  3. 다음 내용으로 명명된 ping.yml 두 번째 플레이북을 만듭니다.

    ---
    - 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. 플레이북을 실행합니다 ping.yml .

    ansible-playbook ping.yml -i myazure_rm.yml
    

    메시지가 표시되면 Azure Linux VM을 username 입력합니다 password .

    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  
    

리소스 정리

  1. az group delete를 실행하여 리소스 그룹을 삭제합니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.

    az group delete --name <resource_group>
    
  2. az group show를 사용하여 리소스 그룹이 삭제되었는지 확인합니다.

    az group show --name <resource_group>
    

다음 단계