[Dev] Ansible
in Dev
Ansible 이란
많은 서버들에 동시에, 동일한 환경을 배포하기 위해 사용 인프라의 상태를 코드로 정의(IaaC)하고 이를 타겟 서버들에 배포하여 특정 환경을 동일하게 세팅할 수 있음 가장 큰 장점은 클라이언트 에이전트가 필요없다는 것 타겟 서버에는 추가적인 설치없이 SSH 접근만 가능하면 됨
설치 및 사용법
pip
로 설치
pip install ansible
- 타겟 서버에서 비밀번호없이 sudo 사용하도록
visudo
수정
$ visudo
...
userid ALL=(ALL) NOPASSWD:ALL
- 실행 서버에서 타겟 서버에 비밀번호없이 ssh 접속이 가능하도록 설정
$ ssh-copy-id {user-id}@{target-server-ip-address}
Ansible의 3요소
세 가지 구성 요소가 존재 인벤토리(어디서) 플레이북(무엇을) 모듈(어떻게)
인벤토리
Ansible 스크립트가 수행될 타겟 서버 목록들을 정의함
# file: "hosts.ini"
server01 ansible_host=10.123.123.123 ansible_user=root ansible_port=22
server02 ansible_host=10.123.123.456 ansible_user=root ansible_port=22
server03 ansible_host=10.123.123.789 ansible_user=root ansible_port=22
[ubuntu-servers]
server01
[centos-servers]
server02
server03
특정 서버들을 그룹화해서 사용할 수도 있음
# ping 예제
$ ansible -m ping -i hosts.ini ubuntu-servers
플레이북
yaml 포맷 파일로, 타겟 서버들에서 무엇을 해야할 지를 정의
# file: "sample.yaml"
- name: nginx install
hosts: all
become: true
tasks:
-name: nginx package install
yum:
name: nginx
state: installed
become: true
는 sudo 권한으로 수행함을 의미 task 에서 실제 작업들을 정의. 여기서는 yum
모듈 사용
아래와 같이 플레이북과 조합으로 사용
$ ansible-playbook -i hosts.ini ubuntu-servers sample.yaml
모듈
플레이북에서 각 task 가 어떻게 수행될지에 대한 정의 위에 예제에서는 yum
모듈이 사용됨 다양한 모듈이 존재하기 때문에 공식 문서를 보는 것이 좋음
멱등성
Ansible 스크립트는 idempotent 한 특성이 있기 때문에 반복 수행에도 같은 결과를 보장함 예를 들어, 패키지를 설치하는 task 가 있다면 이미 설치되어 있을 시 해당 task 를 success 로 처리하고 pass 함