EC2에 앤서블 설치해보기

duckiee·2022년 12월 7일
0

이번 포스트는 EC2에 엔서블을 설치하고 앤서블 매니지드 노드에 ssh 설정하는 작업


구성환경

  • controller : EC2, ubuntu 20.04 / 1EA
  • managed : EC2, ubuntu 20.04 / 3EA

  • 예상 구성도

  1. 파이썬 설치

앤서블은 파이썬 환경에서 동작하며 컨트롤러 서버에서는 파이썬을 설치해야함
설치 되지 않았다면 아래와 같이 설치

sudo apt update -y
sudo apt install -y python3
  1. 앤서블 cli 및 플러그인 설치
  • pip로 설치
sudo apt install -y pip
python3 -m pip install --user ansible

앤서블은 인벤토리라는 개념을 통해 명령어를 전달, 실행할 대상을 설정합니다. 하지만 클라우드 환경의 경우, 인스턴스가 반려동물이 아니라 가축으로 구성되기 때문에 언제든지 그 대상의 구성이 바뀔 수 있습니다. 따라서 특정 조건에 맞는 대상을 찾고, 해당 대상들로 인벤토리를 구성해야 합니다. 앤서블은 이를 위해 동적 인벤토리(dynamic inventory) 기능을 제공합니다.
출처 : https://always-kimkim.tistory.com/entry/ansible-dynamic-inventory-on-aws-ec2

AWS EC2 환경에서 태그 기반으로 동적 인벤토리를 구성할 수 있도록 AWS 플러그인 설치

우선 동적 인벤토리를 구성 하고 EC2의 상태를 조회 하기위해 controller 서버는 IAM 권한이 필요하며, IAM 에서 AmazonEC2FullAccess 권한을 포함하는 역할을 생성하여 controller 서버에 적용

controller 서버에서 아래 명령어로 AWS 플러그인(ansible-galaxy) 설치

ansible-galaxy collection install amazon.aws

  1. controller 서버에서 앤서블 설정에 필요한 디렉터리 및 설정파일 생성
mkdir ansible_demo
cd ansible_demo
ssh-keygen -C "ansible ssh key" -q -f ./ansible_key -t rsa -b 2048 -N ""

위 명령어를 실행할 경우 개인키와 공개키 쌍이 생성되며, 추후에 앤서블을 사용하여 managed 노드(EC2) 생성시 지정한 키페어가 아닌 해당 공개키로 접속 가능


  1. managed 노드(EC2) 생성
    AWS 웹콘솔에서 managed 노드(EC2)를 생성하며, EC2 생성 시 아래와 같이 유저데이터를 작성
  • 유저데이터 양식
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: ansible
    groups: [ sudo, adm ]
    sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
    shell: /bin/bash
    ssh_authorized_keys: 
    - [ansible_key.pub파일 내용]


  1. 호스트 파일 생성 및 타겟 호스트 IP 추가
  • target_aws_ec2.yaml 파일을 생성하며 아래와 같이 작성
  • 동적인벤터리 파일명은 ~aws_ec2.yaml로 작성 되어야함
plugin: aws_ec2
filters:
  instance-state-name: running
keyed_groups:
  # tag_Name_Value 형식의 그룹을 생성
  - prefix: tag
    key: tags

  1. ansible 설정 파일 생성
  • ansible.cfg 파일을 생성하며 아래와 같이 작성
[defaults]
inventory = /home/ubuntu/ansible_demo/target_aws_ec2.yaml
remote_user = ansible
private_key_file = /home/ubuntu/ansible_demo/ansible_key
host_key_checking = False

  1. 타겟 호스트 목록 및 접속 상태 확인
ansible-inventory --graph

ansible all -m ping


  1. 매니지드 노드 설정내용 (playbook)
  • user_mgmt.yaml 파일로 플레이북 작성
---
- name: user module demo 
  hosts: tag_Name_managed #매니지드 노드 EC2의 네임태그 지정, EC2 이름을 managed로 설정하여 tag_Name_managed 
  become: true
  tasks:
    - name: Create a new user 
      ansible.builtin.user:
        name: test #매니지드 노드에서 사용할 사용자
        password: "{{ '1234qwer' | password_hash('sha512') }}" #매니지드 노드에서 사용할 사용자 암호
        groups:
          - adm
          - sudo
        state: "present"
        shell: "/bin/bash"
        system: false
        create_home: true
        home: "/home/fast"
        comment: "Ansible demo user"

    - name: Enable SSH password authentication
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^PasswordAuthentication'
        line: PasswordAuthentication yes

    - name: Restart sshd service
      ansible.builtin.service:
        name: sshd
        state: restarted
  • 플레이북 설정 적용
ansible-playbook user_mgmt.yaml


  1. ssh 명령어로 매니지드 노드(EC2) 접속
ssh test@[호스트 IP 및 도메인]
profile
DevOps로 진화하기

0개의 댓글