자습서: Ansible을 사용하여 Azure 리소스의 동적 인벤토리 구성
Important
이 문서의 샘플 플레이북을 실행하려면 Ansible 2.8 이상이 필요합니다.
Ansible 동적 인벤토리 기능은 정적 인벤토리 파일을 유지 관리해야 하는 부담을 제거합니다.
이 자습서에서는 Azure의 동적 인벤토리 플러그 인을 사용하여 Ansible 인벤토리를 채웁니다.
이 문서에서는 다음 방법을 설명합니다.
- 두 개의 테스트 가상 머신을 구성합니다.
- Azure 가상 머신에 태그 추가
- 동적 인벤토리 생성
- 조건부 및 키 그룹을 사용하여 그룹 멤버 자격 채우기
- 동적 인벤토리 내의 그룹에 대해 플레이북 실행
필수 조건
- Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Ansible 설치: 다음 옵션 중 하나를 수행합니다.
- Linux 가상 머신에서 Ansible 설치 및 구성
- Azure Cloud Shell 구성 - Linux 가상 머신에 액세스할 수 없는 경우 Ansible을 사용하여 가상 머신 만들기
Azure VM 만들기
Azure Portal에 로그인합니다.
Cloud Shell을 엽니다.
이 자습서의 가상 머신을 보관할 Azure 리소스 그룹을 만듭니다.
Important
이 단계에서 만든 Azure 리소스 그룹에는 모두 소문자로 구성된 이름이 있어야 합니다. 그렇지 않으면 동적 인벤토리 생성이 실패합니다.
az group create --resource-group ansible-inventory-test-rg --location eastus
다음 방법 중 하나를 사용하여 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 Ubuntu2204 \ --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 동적 인벤토리 플러그 인을 제공합니다.
다음 단계는 이 플러그 인을 사용하는 과정을 안내합니다.
myazure_rm.yml
이라는 이름의 동적 인벤토리 만들기plugin: azure_rm include_vm_resource_groups: - ansible-inventory-test-rg auth_source: auto
핵심 요소:
- Ansible은 인벤토리 파일 이름 및 확장명을 사용하여 사용할 인벤토리 플러그 인을 식별합니다. Azure 동적 인벤토리 플러그 인을 사용하려면 파일이 종료
azure_rm
되고 확장명이 하나yml
또는yaml
여야 합니다.
- Ansible은 인벤토리 파일 이름 및 확장명을 사용하여 사용할 인벤토리 플러그 인을 식별합니다. Azure 동적 인벤토리 플러그 인을 사용하려면 파일이 종료
다음 명령을 실행하여 리소스 그룹 내에서 VM을 쿼리합니다.
ansible-inventory -i myazure_rm.yml --graph
명령이 실행되면 다음 출력과 비슷한 결과가 표시됩니다.
@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": "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에서 정보를 끌어와 동적 인벤토리는 각 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: "'ubuntu' 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
볼 수 있습니다. 대신 각 VM은 동적 인벤토리에서 만든 새 그룹에 할당됩니다.
핵심 요소:
- 조건부 그룹을 사용하면 인벤토리 내에서 특정 그룹의 이름을 지정하고
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: "'ubuntu' 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: ""
합니다.
그룹 이름 패턴을 사용하여 플레이북 실행
동적 인벤토리에서 만든 그룹을 사용하여 하위 그룹을 대상으로 지정합니다.
다음 콘텐츠를 사용하여
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:
플레이북을 실행합니다
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"
다음 내용으로 명명된
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:
플레이북을 실행합니다
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
리소스 정리
az group delete를 실행하여 리소스 그룹을 삭제합니다. 리소스 그룹 내의 모든 리소스가 삭제됩니다.
az group delete --name <resource_group>
az group show를 사용하여 리소스 그룹이 삭제되었는지 확인합니다.
az group show --name <resource_group>