[Ansible] 2 . Ansible Playbook 활용 및 예제
https://docs.ansible.com/ansible/2.3/ 내 문서를 Study하며 작성했습니다.
Ansible 은 ADHOC이라는 task 실행 모드를 통해 Inventory 내 서버 대상 원격 명령어 실행을 지원한다.
하지만, Ansible 의 자동화 기능중 가장 필요한 부분은 YAML 언어를 활용한 Playbook이다.
Playbook 구성
Playbook은 YAML 형식으로 작성된다. YALM 문법은 리스트 및 해쉬로 구성되어 있다.
관련 내용은 https://ko.wikipedia.org/wiki/YAML 위키페이지를 한 번 정독하고 Playbook 예제를 따라해본다면 금방 적응할 수 있다.
참고로, YAML에서는 tab을 지원하지 않는다. 매우 불편하다..
Playbook의 목적은 정해진 대상서버(hosts)에 정해진 순서의 작업들(tasks)들을 실행하는 것이다.
ansible 에서 지원하는 다양한 module을 통해 원하는 각 작업(task)을 할 수 있다.
Playbook 예제
1) ping
hosts는 하나의 서버 또는 그룹을 지정할 수 있다. wilecard(*)와 같은 patten 지정도 가능하다.
remote_user는 원격 서버에 접속할 계정명이다.
playbook 내에 password를 별도로 저장하는 항목이 없는 것으로 봐서 ssh key 설정 후 ansible실행을 일반적인 경우로 생각하는 것 같다.
tasks에는 모듈 기반으로 필요한 작업들을 listing 하여 작성할 수 있다.
playbook 실행은 task 단위로 top->bottom 순으로 실행된다.
ansible 에서 지원하는 모듈 리스트 및 구체적인 사항은 ansible 공식 document URL을 참고https://docs.ansible.com/ansible/2.3
server2 에 test 라는 유저 계정으로 ping 테스트를 수행하는 playbook
ansible-playook 명령어를 통해 제작한 playbook을 실행할 수 있다.
ssh key 설정을 하지 않았다면 -k 옵션을 별도로 지정하면 password 입력을 통해 실행 가능하다.
개인적인 생각으로 운영자가 개입된 ansible 실행이라면 password 를 입력 후 실행하도록 하는 것이 보안상 좋을 것 같다.
2) Ping 테스트 후 User 생성
이전에 생성한 playbook에 novebmer11 라는 신규 user를 생성한다.
user 생성은 원격 서버의 root 권한이 필요하기 때문에 sudo 권한이 필요하다.
[Playbook]
위에 작성한 playbook을 실행 시 ping check 는 정상적으로 실행되지만, 신규 user 생성의 경우 root 권한이 없기 때문에 아래와 같이 Permission denied 에러가 발생한다. (아래 Error 메시지를 보면 user 모듈에서는 내부적으로 /sbin/useradd 쉘을 실행하여 신규 유저를 생성함을 알 수 있다.)
fatal: [server2]: FAILED! => {"changed": false, "cmd": "/sbin/useradd -m november11", "msg": "[Errno 13] Permission denied", "rc": 13}
위 문제를 해결하기 위해 playbook 을 수정한다.
root 권한이 필요한 user 모듈에 become 을 활용하여 sudo 를 수행하도록 한다.
이전 ansible 버전에서는 sudo_user 를 활용했지만 1.9 버전 부터는 become 모듈로 대체되었다.
ansible-playbook 명령어 실행 또한 sudo 패스워드를 입력할 수 있도록 -K 옵션을 추가로 넣어준다.
playbook 실행 시 아래와 같이 Create User task가 정상적으로 수행된 것을 확인할 수 있다.
신규 유저 생성으로 서버 내 변경이 일어났기 때문에 changed 상태로 기록된다.
대상 서버인 server4 에서 /etc/passwd을 통해 november11 계정이 추가되었음을 확인할 수 있다.
'Ansible' 카테고리의 다른 글
[Ansible] 6 . Ansible Playbook에서 Command line을 통해 입력 받은 변수 사용 방법 (2) | 2018.08.25 |
---|---|
[Ansible] 5 . Ansible 의 멱등성 이해 및 Cron 모듈 예제 (0) | 2018.08.22 |
[Ansible] 4 . Ansible Playbook 에서 hosts 인벤토리 파일 지정 (0) | 2018.08.22 |
[Ansible] 3 . Ansible Playbook 에서 gather_facts 설정 해제 (0) | 2018.08.22 |
[Ansible] 1. Ansible 개요 및 설치 방법 (0) | 2018.08.11 |