정의
배포 자동화 도구
다수의 원격 서버를 대상으로 설정 관리, 애플리케이션 배포(설치) 등을 코드로 관리할 수 있도록 도움을 주는 도구
예전에는 관리자들이 쉘 스크립트 등을 이용해 서버를 관리하는 것이 일반적이었으나, 관리해야할 서버가 많아지자 사용법이 간단한 앤서블을 많이 사용하게 됐다
특징
반복적인 작업에서 탈출할 수 있으며 자동화를 통해 애플리케이션의 제공 시간을 단축할 수 있다
앤서블 관리 노드를 이용해 여러 개의 원격 서버들을 효율적으로 관리할 수 있다
시간 절약, 생산성 증가, 반복 작업 제거, 실수 및 에러율 감소, 코드 가독성 향상, 매우 간단한 코딩 방식, SSH 기반 실행
- 앤서블 관리 노드(PC / 서버)
- SSH 통신 -> 서버 1
- SSH 통신 -> 서버 2
- ..
별도의 에이전트 없이 SSH 기반으로 동작하므로 SSH 키를 미리 등록해놓아야 한다
- ssh-keygen
- cat .ssh/id_rsa.pub
- 출력된 키값을 복사해 vi로 배포 대상 서버의 ~/.ssh/authorized_keys 파일에 저장
- chmod 600 ~/.ssh/authorized_keys
기능 살펴보기
Inventory
제어하려는 원격 대상 서버들의 목록
인벤토리 파일은 /etc/ansible/hosts에 위치하고 있다
[testservers]
test01.foo.bar
test02.foo.bar
호스트명만 추가할 수도 있고, []를 이용해 그룹을 지정한 후 추가할 수도 있다
test[01:02].foo.bar와 같이 패턴을 사용해 범위로도 추가할 수 있다
ansible -m ping test01.foo.bar
- -m: 모듈명
test01.foo.bar | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ansible -m ping test02.foo.bar
ansible -m ping testservers
이제 shell 모듈을 이용해 test01, test02의 /home 디렉터리를 확인해보겠다
ansible -m shell -a 'ls /home' testservers
- -a 모듈인자
test01.foo.bar | CHANGED | rc=0 >>
ec2-user
test02.foo.bar | CHANGED | rc=0 >>
ec2-user
/home 디렉터리에 ec2-user라는 폴더가 있음을 알 수 있다
이처럼 다양한 모듈을 제공한다
Playbook
원격 서버에서 실행할 여러 개의 모듈 또는 명령어를 모아둔 것
ansible-master01
echo "Example" > ex.txt
vi playbook.yml
- name: 앤서블 플레이북
hosts: testservers
remote_user: ec2-user
connection: ssh
tasks:
- name: Copy
copy:
src: /home/ec2-user/ex.txt
dest: /home/ec2-user/ex.txt
mode: '0644'
- name: Shell
shell:
cmd: mv ex.txt ex1.txt
ansible-playbook playbook.yml
PLAY [앤서블 플레이북] ****************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [test01.foo.bar]
ok: [test02.foo.bar]
TASK [Copy] ********************************************************************************************************************************************************************************************************
changed: [test01.foo.bar]
changed: [test02.foo.bar]
TASK [Shell] *******************************************************************************************************************************************************************************************************
changed: [test01.foo.bar]
changed: [test02.foo.bar]
PLAY RECAP *********************************************************************************************************************************************************************************************************
test01.foo.bar : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
test02.foo.bar : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible -m shell -a 'cat /home/ec2-user/ex1.txt'
test01.foo.bar | CHANGED | rc=0 >>
Example
test02.foo.bar | CHANGED | rc=0 >>
Example