Ansible 다중 인벤토리 관리

AnsibleBeginner
지금 연습하기

소개

이 랩에서는 Ansible 에서 여러 인벤토리를 사용하는 방법을 배우게 됩니다. 여러 인벤토리 관리는 서로 다른 호스트 그룹 또는 별도의 환경을 가진 복잡한 환경에서 흔히 발생하는 시나리오입니다. 여러 인벤토리를 정의하고 구성하는 방법, 서로 다른 인벤토리의 호스트에 접근하는 방법, 그리고 여러 인벤토리에서 작업을 수행하는 방법을 배우게 됩니다.

인벤토리 디렉토리 및 파일 생성

이제 인벤토리 파일을 저장할 디렉토리를 만들고 개발 및 프로덕션 환경에 대한 두 개의 별도 인벤토리 파일을 생성해 보겠습니다.

먼저, /home/labex/project 경로에 inventory라는 새 디렉토리를 생성합니다.

mkdir -p /home/labex/project/inventory

이 명령어는 inventory라는 새 디렉토리를 생성합니다. -p 옵션은 상위 디렉토리가 존재하지 않는 경우 생성되도록 합니다.

이제 inventory 디렉토리 내에 dev_inventory.iniprod_inventory.ini의 두 개의 인벤토리 파일을 생성합니다.

touch /home/labex/project/inventory/dev_inventory.ini
touch /home/labex/project/inventory/prod_inventory.ini

touch 명령어는 파일이 존재하지 않으면 빈 파일을 생성하고, 파일이 존재하면 수정 시간을 업데이트합니다.

다음으로, 이러한 인벤토리 파일에 내용을 추가합니다. 텍스트 편집기 (예: nano 또는 다른 텍스트 편집기) 에서 dev_inventory.ini를 엽니다.

nano /home/labex/project/inventory/dev_inventory.ini

다음 내용을 추가합니다.

[dev]
localhost ansible_connection=local

파일을 저장하고 편집기를 종료합니다 (nano 에서는 Ctrl+X, Y, Enter 를 누르면 됩니다).

이제 prod_inventory.ini를 엽니다.

nano /home/labex/project/inventory/prod_inventory.ini

다음 내용을 추가합니다.

[prod]
localhost ansible_connection=local

저장하고 편집기를 종료합니다.

이러한 인벤토리 파일에서:

  • [dev][prod]는 그룹 이름입니다. 호스트를 논리적 그룹으로 구성하는 데 도움이 됩니다.
  • localhost는 호스트 이름입니다. 동일한 머신에서 서로 다른 환경을 시뮬레이션하기 위해 localhost 를 사용하고 있습니다.
  • ansible_connection=local은 Ansible 이 머신에 SSH 로 접속하는 대신 로컬에서 명령을 실행하도록 지시합니다. 이는 Ansible 을 설치된 동일한 머신에서 실행하는 데 유용합니다.

실제 시나리오에서는 일반적으로 두 호스트 모두에 localhost 를 사용하는 대신 개발 및 프로덕션 서버에 서로 다른 IP 주소 또는 호스트 이름을 사용합니다.

다중 인벤토리를 위한 Playbook 생성

이 단계에서는 개발 및 프로덕션 인벤토리 모두에서 작동할 수 있는 플레이북을 생성합니다. Ansible 에서 플레이북은 호스트에서 실행할 작업 집합을 정의하는 YAML 파일입니다.

먼저, /home/labex/project 디렉토리에 multi_env_playbook.yaml이라는 새 파일을 생성합니다.

touch /home/labex/project/multi_env_playbook.yaml

이제 텍스트 편집기에서 multi_env_playbook.yaml 파일을 엽니다. 간단한 명령줄 텍스트 편집기인 nano를 사용합니다.

nano /home/labex/project/multi_env_playbook.yaml

다음 내용을 복사하여 파일에 붙여넣습니다.

---
- name: Demonstrate multi-environment playbook
  hosts: all
  gather_facts: no
  tasks:
    - name: Print environment type
      debug:
        msg: "This host belongs to the {{ 'production' if 'prod' in group_names else 'development' }} environment"

    - name: Show hostname
      command: hostname
      register: hostname_output

    - name: Display hostname
      debug:
        msg: "The hostname is: {{ hostname_output.stdout }}"

붙여넣은 후 Ctrl + X, Y, 마지막으로 Enter를 눌러 저장하고 nano 를 종료합니다.

이 플레이북을 분석하여 각 부분을 이해해 보겠습니다.

  1. 파일 상단의 ---는 YAML 문서의 시작을 나타냅니다.
  2. name: Demonstrate multi-environment playbook은 이 플레이에 대한 설명적인 이름입니다.
  3. hosts: all은 이 플레이북이 인벤토리의 모든 호스트에서 실행됨을 의미합니다.
  4. gather_facts: no는 실행 속도를 높이기 위해 팩트 수집 단계를 건너뜁니다. 팩트 수집은 Ansible 이 대상 호스트에 대한 정보를 수집하는 단계입니다.
  5. tasks:는 실행할 작업 목록을 시작합니다.
  6. 첫 번째 작업은 debug 모듈을 사용하여 메시지를 출력합니다. 조건문을 사용하여 호스트가 프로덕션 또는 개발 환경에 있는지 확인합니다.
    • group_names는 현재 호스트가 속한 모든 그룹의 목록을 포함하는 특수 변수입니다.
    • 'prod'가 group_names 목록에 있으면 "production"을 출력하고, 그렇지 않으면 "development"를 출력합니다.
  7. 두 번째 작업은 hostname 명령을 실행하고 출력을 hostname_output이라는 변수에 저장합니다.
  8. 세 번째 작업은 debug 모듈을 사용하여 호스트 이름을 표시합니다. hostname_output.stdout을 사용하여 저장된 출력에 접근합니다.

개발 인벤토리로 Playbook 실행

이제 플레이북과 인벤토리가 설정되었으므로 개발 인벤토리를 사용하여 플레이북을 실행해 보겠습니다.

터미널에서 다음 명령을 실행합니다.

ansible-playbook -i /home/labex/project/inventory/dev_inventory.ini /home/labex/project/multi_env_playbook.yaml

이 명령을 분석해 보겠습니다.

  • ansible-playbook은 Ansible 플레이북을 실행하는 명령어입니다.
  • -i /home/labex/project/inventory/dev_inventory.ini는 사용할 인벤토리 파일을 지정합니다. -i 옵션은 "inventory"를 의미합니다.
  • /home/labex/project/multi_env_playbook.yaml은 플레이북 파일의 경로입니다.

이 명령은 Ansible 에게 dev_inventory.ini 파일을 사용하고 multi_env_playbook.yaml 플레이북을 실행하도록 지시합니다.

다음과 유사한 출력을 볼 수 있습니다.

PLAY [Demonstrate multi-environment playbook] *******************************************

TASK [Print environment type] *********************************************************
ok: [localhost] => {
    "msg": "This host belongs to the development environment"
}

TASK [Show hostname] ******************************************************************
changed: [localhost]

TASK [Display hostname] ***************************************************************
ok: [localhost] => {
    "msg": "The hostname is: 66d80191e483433f91fbdca9"
}

PLAY RECAP ****************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

이 출력은 다음을 보여줍니다.

  1. 플레이북이 개발 환경에서 성공적으로 실행되었습니다.
  2. 호스트가 개발 환경에 속함을 올바르게 식별했습니다.
  3. 호스트 이름을 성공적으로 검색하고 표시했습니다.
  4. "PLAY RECAP"은 플레이북 실행 요약을 보여줍니다. 여기서 "ok=3"은 세 개의 작업이 성공적으로 실행되었음을 의미하고, "changed=1"은 하나의 작업이 시스템을 변경했음 (예: hostname 명령 실행) 을 의미합니다.

운영 인벤토리로 Playbook 실행

이제 프로덕션 인벤토리를 사용하여 동일한 플레이북을 실행하여 동작이 어떻게 다른지 확인해 보겠습니다.

터미널에서 다음 명령을 실행합니다.

ansible-playbook -i /home/labex/project/inventory/prod_inventory.ini /home/labex/project/multi_env_playbook.yaml

이 명령은 이전 명령과 유사하지만 dev_inventory.ini 대신 prod_inventory.ini 파일을 사용합니다.

다음과 유사한 출력을 볼 수 있습니다.

PLAY [Demonstrate multi-environment playbook] *********************************

TASK [Print environment type] *************************************************
ok: [localhost] => {
    "msg": "This host belongs to the production environment"
}

TASK [Show hostname] **********************************************************
changed: [localhost]

TASK [Display hostname] *******************************************************
ok: [localhost] => {
    "msg": "The hostname is: labex-instance"
}

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

이번에는 플레이북이 프로덕션 환경에서 실행되고 있음을 올바르게 식별한다는 점에 유의하십시오. 이는 [prod] 그룹 아래에 호스트를 정의하는 프로덕션 인벤토리 파일을 사용하고 있기 때문입니다.

나머지 출력은 개발 인벤토리에서 본 것과 유사합니다. 이는 여전히 동일한 로컬 머신에서 실행되고 있기 때문에 예상되는 결과입니다.

두 개의 인벤토리로 플레이북 실행하기

마지막으로, 두 개의 인벤토리를 동시에 사용하여 플레이북을 실행해 보겠습니다. 이를 통해 Ansible 이 여러 인벤토리를 동시에 어떻게 처리하는지 확인할 수 있습니다.

터미널에서 다음 명령을 실행하세요:

ansible-playbook -i /home/labex/project/inventory/dev_inventory.ini -i /home/labex/project/inventory/prod_inventory.ini /home/labex/project/multi_env_playbook.yaml

이 명령은 여러 개의 -i 옵션을 사용하여 두 개의 인벤토리 파일을 포함합니다. Ansible 은 플레이북을 실행할 때 이 인벤토리들을 결합합니다.

다음과 유사한 출력을 볼 수 있습니다:

PLAY [Demonstrate multi-environment playbook] *******************************************************************************************************************************************************************************************************************************************

TASK [Print environment type] ***********************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "This host belongs to the production environment"
}

TASK [Show hostname] ********************************************************************************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [Display hostname] *****************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "The hostname is: 66d80191e483433f91fbdca9"
}

PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

두 개의 인벤토리를 포함했음에도 불구하고 플레이북이 한 번만 실행된 것을 알 수 있습니다. 이는 두 인벤토리 모두 동일한 localhost를 참조하고 있으며, Ansible 은 기본적으로 호스트를 중복 제거하기 때문입니다. 각 인벤토리에 다른 호스트가 있었다면 Ansible 은 고유한 각 호스트에 대해 플레이북을 실행했을 것입니다.

환경이 "production"으로 식별되는 이유는 동일한 호스트가 다른 그룹을 가진 여러 인벤토리에 나타날 때, Ansible 은 해당 호스트를 자신이 속한 모든 그룹에 추가하기 때문입니다. localhost[dev][prod] 그룹 모두에 정의되어 있으므로, group_names 변수에는 'dev'와 'prod'가 모두 포함됩니다. 플레이북 로직은 'prod'가 group_names에 있는지 확인하며, 이 경우 항상 참이므로 인벤토리 순서에 관계없이 "production"을 표시합니다.

이처럼 여러 인벤토리를 사용하는 접근 방식은 실제 시나리오에서 환경 간에 공통 호스트가 있거나, 다른 인벤토리 파일의 호스트 조합에 대해 플레이북을 실행하려는 경우 매우 유용할 수 있습니다.

요약

이 랩에서는 여러 Ansible 인벤토리를 관리하는 방법을 배웠습니다. 개발 및 프로덕션 환경에 대한 별도의 인벤토리 파일을 만들고, 두 환경 모두에서 작동할 수 있는 플레이북을 작성했으며, 서로 다른 인벤토리 구성을 사용하여 플레이북을 실행했습니다.

이 랩의 주요 내용은 다음과 같습니다.

  1. 여러 인벤토리 파일 생성 및 구성: 서로 다른 환경에 대한 별도의 인벤토리 파일을 만드는 방법을 배웠으며, 이는 호스트를 구성하고 관리하는 데 도움이 됩니다.
  2. 서로 다른 환경에 적응할 수 있는 플레이북 작성: 실행 중인 환경을 확인하고 그에 따라 동작을 조정하는 플레이북을 만들었습니다.
  3. 단일 및 여러 인벤토리로 플레이북 실행: 플레이북을 실행할 때 하나 이상의 인벤토리 파일을 지정하는 방법을 배웠으며, 이를 통해 유연하게 호스트를 타겟팅할 수 있습니다.
  4. Ansible 이 여러 인벤토리에 나타나는 호스트를 처리하는 방법 이해: Ansible 이 호스트를 중복 제거하고 그룹 멤버십을 결정할 때 호스트의 마지막 발생을 사용한다는 것을 확인했습니다.

이러한 기술은 별개의 환경을 가진 복잡한 인프라를 관리할 때 매우 중요합니다. 여러 인벤토리를 활용하여 서로 다른 호스트 또는 환경 집합에서 Ansible 자동화를 더 잘 구성하고 제어할 수 있습니다.