[Ansible] 1) EC2 instance를 Dynamic Inventory로 가져오기

Hyun-Sung Kim·2025년 1월 23일

Ansible

목록 보기
1/3
post-thumbnail

< Ansible 이란? >
Ansible은 IT 자동화를 가능하게 하는 오픈 소스 툴입니다.
서버 관리, 애플리케이션 배포, 네트워크 설정 등을 효율적으로 관리 및 자동화하는 데 사용됩니다.

< Ansible 장점 >
Ansible은 에이전트리스(Agentless) 방식이기 때문에, 추가 소프트웨어나 에이전트를 클라이언트 머신에 설치할 필요가 없습니다.
단순히 SSH를 통해 목표 시스템에 접속해 작업을 수행하므로, 배포와 관리가 매우 간단합니다.
제어 노드(control node)에만 Ansible을 설치하면 되고, 관리 대상 리소스에는 SSH와 Python만 필요합니다.

< Dynamic Inventory >
클라우드 환경에서는 EC2 인스턴스가 자동으로 생성되거나 종료되는 경우가 빈번합니다. (예: Auto Scaling 등)

  • Static Inventory
    - 고정된 IP 또는 호스트 정보를 수동으로 관리해야 하므로, 인스턴스가 변경될 때마다 업데이트해야 하는 번거로움이 존재합니다.
  • Dynamic Inventory
    - EC2 인스턴스의 목록과 메타데이터를 AWS API를 통해 실시간으로 가져와 동적으로 관리할 수 있습니다.

이제 Dynamic Inventory를 구성해서, AWS 환경의 서버들의 목록을 가져오는 방법을 설명합니다.

<사전 요구 사항>

  • Ansible 제어 노드(Control Node) : Ansible을 설치
  • Windows 서버
    - winrm 활성화 : WinRM 프로토콜을 통해 Ansible이 Windows 서버를 관리
    - Target 서버 방화벽 오픈
    - Ansible을 인증할 관리자 계정(계정/PW)을 설정
  • Linux 서버
    - Target 서버 방화벽 오픈
  • EC2 instance
    - IAM Role 할당 : S3 버킷에 접근 권한

<사전 작업>

1) Ansible 설치

amazon-linux-extras enable ansible2
yum clean all
yum install ansible -y

2) boto3 설치 / 확인

  • boto3는 Python용 AWS SDK로, Python 환경에서 AWS 서비스와 상호작용할 수 있도록 도와주는 라이브러리입니다.
  • cloud9 환경에는 AWS SDK가 설치된 기본 환경이기 때문에, 아래 명령을 통해 boto3 설치 유무를 확인합니다.

    python3 -m pip show boto3

  • 다음 python 명령을 통한 확인도 가능합니다.

    python
    import boto3
    print(boto3._ version__)

  • 설치되어 있지 않다면, 다음 명령으로 설치해 줍니다.

    python3 -m pip install boto3 ## 설치
    python3 -m pip list | grep boto3 ## 설치 확인

<AWS 자격 증명>

ansible을 실행할 Node에서 EC2 instance들의 목록을 조회하려면 관련 AWS 권한들이 해당 Node에 할당해 줘야 합니다.

필요한 자격증명이 준비되어 있지 않다면, 다음 방법으로 할당합니다.

  • 방법1) IAM User (access key + secret key)
  • 방법2) IAM Role

ansible을 실행할 Node에서, 현재 할당된 AWS 자격증명을 확인합니다.

aws sts get-caller-identity

적당한 권한이 할당되었다면, 다음과 같이 EC2 instance 조회가 가능해 진다.

aws ec2 describe-instances | more

<ansible.cfg>

ansible 이용 시, 환경 설정들을 해당 파일에서 선언해 준다.

[defaults]
inventory = ./aws_ec2.yaml
host_key_checking = False
interpreter_python = auto_silent
remote_port = 22
remote_user = ec2-user
private_key_file = /home/ec2-user/pingping95-key.pem

[inventory]
enable_plugins = aws_ec2

<aws_ec2.yaml>

여러 설정 중에, 아래 필수 값들을 지정해 줍니다.

plugin: amazon.aws.aws_ec2
regions:
  - us-west-2
filters:
  instance-state-name : running
keyed_groups:
  - key: tags.Name
host_key: private_ip_address
hostnames:
  - private-ip-address
  • plugin
    - aws_ec2 : AWS EC2 플러그인 활성화
  • regions
    - us-west-2 : 검색할 AWS 리전
  • filters:
    - instance-state-name: running : 실행 중인 인스턴스만 검색
  • keyed_groups:
    - key: tags.Name : EC2 instance의 'Name' 태그를 기준으로 분류
  • host_key: private_ip_address
    - 반환된 인스턴스에서 사용할 키를 지정
    • 이 설정에서, public ip가 아닌 private ip를 가져오게 됨
  • hostnames : private-ip-address
    - inventory에서 보여줄 기본 아이덴티티(호스트 이름)

동적 인벤토리 가져오기

위 설정한 keyed_groups대로 그룹핑이 된 것을 아래와 같이 확인 가능합니다.

ansible-inventory -i aws_ec2.yml --graph

이렇게 동적으로 생성된 그룹은 ansible playbook에서 사용할 수 있습니다.

profile
Cloud Engineer

0개의 댓글