ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible] AWS EC2 환경에서 동적 인벤토리 사용해보기
    개발자 라이프 2021. 9. 26. 23:44
    반응형

    들어가며

    앤서블은 인벤토리라는 개념을 통해 명령어를 전달, 실행할 대상을 설정합니다. 하지만 클라우드 환경의 경우, 인스턴스가 반려동물이 아니라 가축으로 구성되기 때문에 언제든지 그 대상의 구성이 바뀔 수 있습니다. 따라서 특정 조건에 맞는 대상을 찾고, 해당 대상들로 인벤토리를 구성해야 합니다. 앤서블은 이를 위해 동적 인벤토리(dynamic inventory) 기능을 제공합니다. 이번 글은 AWS EC2 환경에서 태그 기반으로 동적 인벤토리를 구성해보는 방법을 알아봅니다.

    AWS EC2 환경에서 동적 인벤토리 사용해보기

    환경 준비하기

    이번 글에서 예제로 진행해볼 AWS EC2 환경은 아래와 같습니다.

    • 인스턴스 :
      • Contoller node 1대
        • AmazonEC2FullAccess 권한을 가지는 Role을 바인딩해주세요.
        • Managed node와 통신을 위해 pem 파일을 가지고 있어야 합니다.
        • 아래 예제 파일 구성 및 명령어 실행은 이 노드에서 진행합니다.
      • Managed node 1대 이상
        • Tag 에 조회에 사용할 태그를 추가해주세요.
    • ami : Amazon Linux 2
    • ansible core version : 2.11.5

     여기서 주의할 점은 앞으로 태그 기반의 인스턴스 조회에 사용할 aws.aws_ec2 모듈이 파이썬 인터프리터의 버전을 3 이상으로 요구한다는 점입니다. 하지만 아마존 리눅스의 패키지 관리자인 `amazon-linux-extras` 를 이용하여 앤서블을 설치하게 되면 파이썬 모듈이 2.7 버전으로 구성되기 때문에 정상적인 스크립트 실행이 어렵습니다. 그러므로 파이썬 3 기반의 앤서블을 구성하기 위해, 예제 환경의 컨트롤러 노드에서 앤서블을 설치할 때는 `pip3 install ansible` 명령어를 통해 앤서블을 구성하시길 바랍니다. 

     또한 플레이북 파일을 구성하고, 그 플레이북 파일에서 참조할 인벤토리 파일과 ansible.cfg 파일을 구성하기 위해 별도의 디렉토리를 구성해줍니다. 저는 dynamic-inventory라는 이름으로 디렉토리를 구성하겠습니다. 

    AWS 인벤토리 모듈을 이용하여 인벤토리 파일 구성하기 

     aws.aws_ec2 모듈은 EC2를 대상으로 동적 인벤토리를 구성할 수 있도록 하는 모듈입니다. `filters`(include_filters, exclude_filters) 키를 통해 특정 조건으로 인스턴스를 조회할 수 있습니다. 그리고 `keyed_groups` 키로 조회된 인스턴스들을 묶을 수 있습니다. 이번 예제는 태그를 기반으로 인스턴스를 조회하는 것이므로 인벤토리 파일(inventory_aws_ec2.yml)을 아래와 같이 구성해봅니다.

    plugin: aws_ec2
    regions:
      - ap-northeast-2
    keyed_groups:
      - key: tags.Name
    filters:
      instance-state-name : running
      tag:Creator: daehokimm
    compose:
      ansible_host: private_ip_address

     파일의 몇가지 키워드를 설명하면 아래와 같습니다.

    • keyed_groups : 아래 조건을 기준으로 조회된 인스턴스를 그룹핑합니다.
      • tags.Name : 인스턴스 태그 중 `Name` 태그를 기반으로 그룹핑합니다. 즉, 같은 이름을 같은 인스턴스끼리 그룹이 됩니다.
    • filters : 아래 조건에 해당하는 인스턴스를 조회합니다.
      • instance-state-name : 상태가 일치 인스턴스를 조회합니다. 현재는 정상 실행 중인 인스턴스를 조회합니다.
      • tag:Creator : 태그 중 `Creator` 라는 항목이 일치하는 인스턴스를 조회합니다. 현재는 `Creator` 태그의 값이 `daehokimm` 인 인스턴스를 조회합니다.
    • compose : 조회된 인스턴스들을 접근하기 위한 호스트 설정을 구성합니다. 

     위 인벤토리 파일이 정상적으로 구성되었는지 확인하기 위해 `ansible-inventory -i inventory_aws_ec2.yml --graph` 명령어를 실행해봅니다.

    정상적으로 managed node가 조회된 모습. Name 태그를 이용하여 그룹핑 된 것을 확인할 수 있다.

    만약 위와 같이 조회에 실패한다면 아래를 참고해주시길 바랍니다.

    이슈 1. The ec2 dynamic inventory plugin requires boto3 and botocore.

     만약 위와 같은 메시지가 발생하면 먼저 `pip3 install boto3` 명령어를 통해 boto3을 설치해줍니다. 해당 의존성 설치 후에도 정상 실행이 되지 않는다면 python의 버전이 3 버전 이상인지 확인해주시길 바랍니다.

    이슈 2. Insufficient boto credentials found.

     만약 위와 같은 메시지가 발생하면 앤서블을 실행하는 컨트롤러 노드에 Role이 정상적으로 바인딩 되었는지 확인하시길 바랍니다.

    동적 인벤토리를 사용하여 ping 실행해보기

    구성된 동적 인벤토리 파일을 이용하여 플레이북을 구성하고, 실제로 ping을 요청해봅니다. 먼저 동적 인벤토리를 기본 값으로 사용하기 위해 아래와 같이 ansible.cfg 파일을 구성합니다.

    [defaults]
    host_key_checking = False
    inventory=inventory_aws_ec2.yml
    interpreter_python=auto_silent

     그리고 ping 을 실행하는 플레이북 파일(ping-playbook.yml)을 아래와 같이 구성합니다.

    ---
    - name: ping them all
      hosts: _daehokimm_ansible_managed_node
      vars:
        ansible_ssh_private_key_file: "/home/ec2-user/daehokimm.pem"
      tasks:
        - name: pinging
          ping:

     플레이북 파일의 몇가지 키워드를 살펴봅니다. 

    • hosts : 앞서 동적 인벤토리를 통해 구성된 그룹의 이름(`_daehokimm_ansible_managed_node`)을 이용하여 명령어를 실행할 호스트를 구성합니다. 
    • ansible_ssh_private_key_file : ssh 통신에 사용할 키파일 경로를 설정합니다.

    위와 같이 구성된 플레이북을 `ansible-playbook ping-playbook.yml` 명령어를 통해 실행해보면, 아래와 같이 동적 인벤토리로 구성된 인스턴스에 ping 명령어를 호출하는 것을 확인할 수 있습니다.

    매니지드 노드에 ping 명령어 호출이 정상적으로 실행된 것을 확인할 수 있다.

    만약 현재 상황에서 매니지드 노드가 사라지면 어떻게 될까?

    실제로 매니지드 노드를 종료(terminate)하고 플레이북을 재실행해봅니다. 먼저 매니지드 노드를 종료합니다.

    정상적으로 종료되었다.

    이후 플레이북을 재실행해봅니다.

    동적 인벤토리를 통해 조회된 대상이 없으므로 요청이 처리되지 않았습니다.

    마무리

     이번 글을 통해 EC2 환경에서 태그를 기반으로 간단한 동적 인벤토리를 구성하고 사용해봤습니다. 필자는 동적 인벤토리는 클라우드 환경에서 기본적인 사용 패턴으로 생각됩니다. 더욱 자세한 필터 적용 방법과 사용법은 aws_ec2 모듈 깃헙은 참고하시길 바랍니다.

    참조

     

    Ansible: Working With Dynamic Inventory Using AWS EC2 | Clarusway

    This article will talk about how to configure Ansible to get inventory hosts from Amazon Web Services EC2 dynamically using the EC2 plugin.

    clarusway.com

     

     

    GitHub - ansible-collections/amazon.aws: Ansible Collection for Amazon AWS

    Ansible Collection for Amazon AWS. Contribute to ansible-collections/amazon.aws development by creating an account on GitHub.

    github.com

     

    Interpreter Discovery — Ansible Documentation

    Detects the target OS platform, distribution, and version, then consults a table listing the correct Python interpreter and path for each platform/distribution/version. If an entry is found, and /usr/bin/python is absent, uses the discovered interpreter (a

    docs.ansible.com

     

    반응형

    댓글

Designed by Tistory.