앤서블은 여러 서버를 효율적으로 관리할 수 있게 만드는 툴이다. IaC
, Infrastructure as Code
를 구현한 툴 중 하나이다.
이번에 팀 내부에서 인프라 교육을 할 필요가 있었는데, 당연히 운영 중인 서버에 할 수는 없고 EC2 여러 대에 각각 실제 서버와 같은 환경을 모의해놓고 이용하려고 했다. 그러나 이번에는 이 서버들에 실제와 같은 환경을 만드는 것이 문제가 되었다. tmux
등을 이용해 할 수도 있지만 이참에 Ansible
을 활용해 구축해 보기로 했다.
pip3 install ansible
위 커맨드를 통해 앤서블을 설치한다.
ansible -h
를 통해 잘 설치되었는지 확인하자.
잘 설치된 경우 위와 같이 나온다.
ansible localhost -m ping
으로 다시 한번 확인해보자.
이렇게 나온다면 성공이다.
앤서블은 ssh 기반으로 동작하기 때문에 에이전트를 설치할 필요 없이 ssh 접속 정보만을 주면 된다. 접속 정보의 경우 /etc/ansible/hosts
에 적으면 된다.
[ec2:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=/etc/ansible/ec2.pem
[ec2]
ec2-public-ip-01.ap-northeast-2.compute.amazonaws.com
ec2-public-ip-02.ap-northeast-2.compute.amazonaws.com
ec2-public-ip-03.ap-northeast-2.compute.amazonaws.com
ec2-public-ip-04.ap-northeast-2.compute.amazonaws.com
[ec2]
의 경우 그룹 명을, [ec2:vars]
의 경우 해당 그룹에서 이용할 전역 변수를 말한다. ec2를 만들 때 ubuntu20.04를 기준으로 만들었는데, ec2에서 ubuntu os의 기본 유저는 ec2이다. 따라서 로그인에 사용할 Pem 키와 유저를 저렇게 지정해주면 된다.
그 후 다음과 같이 입력해주자.
ansible ec2 -m ping
위와 같이 뜨면 성공이다. 첫 연결의 경우 확인을 받는데, 그 경우 그냥 yes
를 입력해주면 된다.
💡 연결이 되지 않을 경우 Ec2의 방화벽 설정을 다시 확인하자.
보안 그룹 -> 인바운드규칙편집
인바운드 규칙을 추가한 후ssh
를 선택한 후Ip
를 입력하고 저장한다.
이제 docker
설정을 docker-compose
를 활용해 yaml
로 관리하는 것처럼 ansible
커맨드들을 yaml
로 관리하기 위해 ansible-playbook
을 도입하자.
---
- name: 이름
hosts: 호스트들
tasks:
- name: 작업 1
모듈:
명령어: 명령
- name: 작업 2
모듈:
명령어: 명령
위와 같이 yaml
파일을 작성한다. 파일은 다음과 같이 실행한다.
ansible-playbook <name>.yml
간단한 예시로 root
계정의 패스워드를 바꾸는 플레이북을 만들어보자.
# password.yml
- name: 패스워드 업데이트
hosts: ec2
become: true
tasks:
- name: Update password
user:
name: root
update_password: always
password: "{{ 'password' | password_hash('sha512') }}"
이 플레이북을 password.yml
로 이름지었다면 ansible-playpook password.yml
로 실행하면 된다.
도커 설치를 위해서는 다음과 같이 입력하자.
---
- name: 도커 설치
hosts: ec2
become: true
tasks:
- name: Install docker
shell: curl https://get.docker.com | sh
도커 이미지 다운로드 및 도커 스웜 실행을 다음과 같이 할 수 있다.
---
# docker.yml
- name: 도커 로그인 및 다운로드, 서비스 실행
hosts: ec2
become: true
tasks:
- name: Login to docker
shell: echo <token> | docker login ghcr.io -u <username> --password-stdin
- name: Pull image
become: true
shell: docker pull ghcr.io/heka1024/repo/jordy:v1
- name: init swarm
shell: docker swarm init
run_once: true
- name: Create service
become: true
shell: |
sudo docker service create\
--name ryan \
--replicas 2 \
--publish target=80,published=80 \
ghcr.io/heka1024/repo/jordy:v1
위와 같이 여러 커맨드를 앤서블로 잘 정리하여 편하게 이용해보자.