앤서블을 사용하기 위해서 매번 긴 명령어를 입력하거나, 혹은 여러가지 순차적인 작업을 위해서 모든 내용을 기록 한다면 어렵겠죠?
그래서 나온게 ansible-playbook 입니다.
한마디로 정리하자면, 동작할 것을 미리 정해 놓고 '반복적으로 재 사용하자' 입니다.
보통 필요에 의해서 만든게 자신만 필요할 리가 없거든요 :)
쉬운 샘플 예제를 통해서 어떤 건지 어떻게 동작하는지 일단 볼까요?
우선 설치되어 있는지 확인합니다.
기존에 설치해둔 RHEL에서 그냥 ansible하고 tab키를 막 눌러줍니다.
[root@Ansible ~]# ansible
ansible ansible-doc-2 ansible-pull
ansible-2 ansible-doc-2.7 ansible-pull-2
ansible-2.7 ansible-galaxy ansible-pull-2.7
ansible-connection ansible-galaxy-2 ansible-vault
ansible-console ansible-galaxy-2.7 ansible-vault-2
ansible-console-2 ansible-playbook ansible-vault-2.7
ansible-console-2.7 ansible-playbook-2
ansible-doc ansible-playbook-2.7
이중에 ansible-playbook 이라는게 남들이 작성해 놓은 플레이북을 사용할 수 있게 해주는 명령어이며, 또는 본인이 자주 쓰는걸 작성해 둘 수도 있죠.
사실 이게 어떻게 보면....infrastructure as a code (IAAC)의 개념에 가까운데...
이건 나중에 기회되면 정리 및 pycon에서 발표할 생각입니다. (완전 미정~)
플레이북 파일은 YAML이라는 언어로 쓰여지는데, 사실 이 언어는 Ruby랑 좀 더 친한거 같습니다. 근데 저는 python을 더 좋아하는데 말이죠..
어쨌든...이 언어는 기본적으로 XML과 같은 마크업 계열의 언어인 것처럼 보여지는데, 재밌는게 YAML은 YAML Ain’t Markup Language” 즉 마크업 언어가 아니라고 하는게 공식적인 표현입니다. 또는 YAML은 다른 마크업 언어라는 얘기도 있고....
쓰다 보니까 자꾸 얘기가 다른 쪽으로 가네요...
어쨌든 YAML로 아래와 같은 파일을 작성해야 하는데..자 시스템/네트워크 엔지니어가 이 문법? 처럼 생긴걸 다 이해하고 작성하고 하는게...꼭 필요하다고 보진 않습니다. 그냥 그런거 있잖나요 누군가 만들어 놓은 것을 수정할 정도? 내가 필요에 의해서 쓸 수 있을 정도로?
그리고 nginx가 궁금하신 분을 위해서..(얘기가 자꾸 산으로..하하하)
웹서버는 정말 APM(Apach, PHP, MySQL) 시절부터 세계적인 강자였습니다.
최근 상황을 좀 볼까요? 아파치야..안녕 그리고 여러가지가 혼재한 상황이네요.
그런데, 정말 큰 규모로 운용하는 사이트들은 nginx가 엄청 점유율이 확대되는 상황이네 아파치 시장을 먹고 있는거 같네요. 그래서 실습은 nginx으로 :) 하하하;;;
자 다시 본문으로 돌아와서 아래의 예문도 nginx를 사용하기 위해서 hosts만 그냥 랩에 맞게 IP만 수정되었습니다.
[ nginx.yml ] - 1차 수정
---
- hosts: 10.0.2.4
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
오류#1
[root@Ansible ~]# ansible-playbook nginx.yml
PLAY [10.0.2.4]**************************************************
TASK [Gathering Facts] ****************************************************************
fatal: [10.0.2.4]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n", "unreachable": true}
to retry, use: --limit @/root/nginx.retry
PLAY RECAP ******************************************************
10.0.2.4 : ok=0 changed=0 unreachable=1 failed=0
이건...딱 보기에는 퍼미션 오류 입니다.
이거 때문에 우분투에 Root를 뚫어주기는 역시 싫습니다.
따라서 /etc/ansible/ansible.cfg 파일에 privilege_escalation을 수정해 줍니다.
[privilege_escalation]
become=True
become_method=sudo
become_user=root
#become_ask_pass=False
[root@Ansible ~]# ansible-playbook nginx.yml -k -K -u cuda
SSH password:
SUDO password[defaults to SSH password]:
PLAY [10.0.2.4] ***********************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [10.0.2.4]
TASK [Installs nginx web server] ******************************************************
changed: [10.0.2.4]
RUNNING HANDLER [start nginx] *********************************************************
ok: [10.0.2.4]
PLAY RECAP ****************************************************************************
10.0.2.4 : ok=3 changed=1 unreachable=0 failed=0
become=True
become_method=sudo
become_user=root
#become_ask_pass=False
[root@Ansible ~]# ansible-playbook nginx.yml -k -K -u cuda
SSH password:
SUDO password[defaults to SSH password]:
PLAY [10.0.2.4] ***********************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [10.0.2.4]
TASK [Installs nginx web server] ******************************************************
changed: [10.0.2.4]
RUNNING HANDLER [start nginx] *********************************************************
ok: [10.0.2.4]
PLAY RECAP ****************************************************************************
10.0.2.4 : ok=3 changed=1 unreachable=0 failed=0
그리고 이렇게 무심했던 우분투(cuda)가 이렇게 변했습니다.
(저는 우분투에서 작업한게 없어요~~!)
지금은 1대인데 말이죠...웹서버 같은 경우는 N모사? 수백 수천대를 운용하는데, 머 하나 배포하려면.....생각만 해도 끔찍하겠죠?
그래서 이런 툴이 관리자에게는 정말 드라마틱한 효과를 보여주는 겁니다!!
설치도 했으면 지워야 겠죠? ngnix를 지워볼까요?
[ nginx_rm.yml ]
---
- hosts: 10.0.2.4
remote_user: cuda
become: yes
tasks:
- name: Remove nginx web server
apt: pkg=nginx state=absent
한개가 바뀌었다고 나옵니다..
[root@Ansible ~]# ansible-playbook ngnix_rm.yml -K
SSH password:
SUDO password:
PLAY [10.0.2.4] ***********************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [10.0.2.4]
TASK [Installs nginx web server] ******************************************************
changed: [10.0.2.4]
RUNNING HANDLER [start nginx] *********************************************************
ok: [10.0.2.4]
PLAY RECAP ****************************************************************************
10.0.2.4 : ok=2 changed=1 unreachable=0 failed=0
한개만 지워졌네요....당황스럽네요..
의존성 패키지가 안 지워지네요..
하지만 이것은 당연한 결과로...우분투에서는 autoremove라는 기능을 제공합니다.
ansible도 이것을 2.1.0 버전 이후로 옵션 그대로 제공하고요 수정된 내용을 볼까요?
[ nginx_rm.yml ] - 1차 수정
---
- hosts: 10.0.2.4
remote_user: cuda
become: yes
tasks:
- name: Remove nginx web server
apt: pkg=nginx state=absent autoremove=yes
그냥 apt 뒤에 옵션에 autoremove를 넣고 yes를 해주면 됩니다. 쉽지 않나요?
사실 약간 갸우뚱 스러운게 있는데.....하하;;; 공홈에 있는 옵션 기입대로 하면 안돌아 갑니다. ㅎㅎㅎ;;;;
- name: Remove dependencies that are no longer required
apt:
autoremove: yes
http://docs.ansible.com/ansible/apt_module.html
처음에 제가 뭘 잘못 한 줄 알았죠.-_-;
어쨌든 위와 같이 돌리면
한개만 남게 되는데, 이것은 우분투에서 autoremove로 삭제해도 동일한 결과가 나옵니다.
ansible이 잘못한게 아니라는거죠 하하;;;
내용 결과가
cuda@cuda-VirtualBox:~$ sudo apt-get autoremove nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
nginx nginx-common nginx-core
0 upgraded, 0 newly installed, 3 to remove and 323 not upgraded.
After this operation, 1,482 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 220157 files and directories currently installed.)
Removing nginx (1.10.0-0ubuntu0.16.04.4) ...
Removing nginx-core (1.10.0-0ubuntu0.16.04.4) ...
Removing nginx-common (1.10.0-0ubuntu0.16.04.4) ...
3개 다 지웠다는걸 봐서는 아마 서비스만 살아서 동동 떠다니는 상황 같습니다.
cuda@cuda-VirtualBox:~$ sudo apt-get remove nginx-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'nginx-common' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 323 not upgraded.
그냥 지우려고 해도 지워지지 않습니다.
nginx을 완벽하게 지우는 것은 이 블로그의 목적이 아니니~~ 스킵합니당. :)
아마도 서비스를 내리거나, 프로세스만 죽이거나, 가장 확실하게는 재부팅하면 해결되겠네요.
지금까지는 한개에 대해서만 진행을 했는데요.
아까~ 설명한 것처럼 한개만 할꺼면 굳이 머하러..-_-; 이런걸 하겠습니까?
최소 수십대는 있는데, 새로운 걸로 쌈박하게 한다는 모습을 보여줄 수 있겠죠?
저는 수십대를 돌릴수가 없으니 ㅠㅠ 2대만 더 추가해서 진행합니다.
그리고 그룹으로 돌리려면 /etc/ansible/hosts에 그룹을 생성하고 그 이름으로 명령을 날리는게 휠~~~~~씬 편합니다.
/etc/ansible/hosts
[HoonJo]
10.0.2.4
10.0.2.5
10.0.2.6
#10.0.2.4 ansible_user=cuda
#10.0.2.5 ansible_user=minsky_offline_toolkit
#10.0.2.6 ansible_user=hoonjo
그 전에 한가지!! 가능한 (테스트를 위해서) 계정을 통일 시켜줍니다.
물론 현업에서는 꼭 그럴 필요는 없지만..그런 경우에는 아무래도..앤서블 파일을 여러개를 구성해서 돌려줘야 합니다. 또는 패스워드를 각각 넣어줘야 하거나, 아이디도 그렇고..
따라서 현재 3개의 우분투에 아래와 같이 계정을 우선 만듭니다.
hoonjo@hoonjo-VirtualBox:~$ sudo adduser nginx_user
Adding user `nginx_user' ...
Adding new group `nginx_user' (1002) ...
Adding new user `nginx_user' (1002) with group `nginx_user' ...
Creating home directory `/home/nginx_user' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for nginx_user
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
그리고 sudoers 파일에 nginx_user에 sudo 실행 권한을 부여합니다.
hoonjo@hoonjo-VirtualBox:~$ sudo vi /etc/sudoers
# User privilege specification
root ALL=(ALL:ALL) ALL
nginx_user ALL=(ALL:ALL) ALL
그리고 nginx_bulk 파일을 기존 파일에서 copy해서 만들고 딱 두개만 바꿔주면 됩니다.
hosts에 들어가는 그룹 이름이랑 유저 이름?
[ nginx_bulk.yml ]
---
- hosts: HoonJo
remote_user: nginx_user
become: yes
tasks:
- name: Installs nginx web server
apt: pkg=nginx state=installed update_cache=true
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
그럼 어디 한번 돌려볼까요?
이 생뚱 맞은 에러는 멀까요..?
우선 설치 된 애들 부터 보겠습니다.
아주 잘 되었네요~~!
그러면 에러는? 확인해 보니 sudo 권한을 줄때 유저 이름을 잘못 넣었네요
다시 잘 넣고 돌려봅니다.
마지막 한개만 바꾸면 되는거니, 해당 부분만 바뀌었다고 나오네요~!
확인~~! 완료~~!
생각보다 어렵지 않은데, 한번 배워두고...쓰면 관리자들은 정말 쉽게 쉽게 할 수 있는 일들이 무궁무진 할 것 같습니다. 꼭 관리자가 아니라도...처음에 썼던 것처럼 DevOP 개발자나, 대규모 패치등의 작업에 아주 유용할 것 같은데요?
그러면 차후 포스팅은 GUI에서 쉽게 사용이 가능한 것을 좀 알아보겠습니다.~!
아무래도 GUI가 다루기는 더 편하니까요~!
참고 문서 :
1. Markup이란?
http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000010047880
2. How to Create Ansible-playbooks
https://www.digitalocean.com/community/tutorials/how-to-create-ansible-playbooks-to-automate-system-configuration-on-ubuntu
3. 앤서블 공홈
http://docs.ansible.com/ansible/playbooks.html
참고 문서 :
1. Markup이란?
http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000010047880
2. How to Create Ansible-playbooks
https://www.digitalocean.com/community/tutorials/how-to-create-ansible-playbooks-to-automate-system-configuration-on-ubuntu
3. 앤서블 공홈
http://docs.ansible.com/ansible/playbooks.html
블로그 관리자가 댓글을 삭제했습니다.
답글삭제재밌는 글 감사합니다 ㅎㅎ
답글삭제오래 되었지만 덕분에 해결 방법에 대한 힌트를 얻었습니다 감사합니다!
답글삭제apt: name=nginx state=absent autoremove=yes purge=yes
이렇게 삭제하면 다 삭제되네용