2017년 6월 11일 일요일

[Ansible] 플레이북(PlayBook)으로 여러 대에 nginx을 한방에 설치하기 (3)



앤서블을 사용하기 위해서 매번 긴 명령어를 입력하거나, 혹은 여러가지 순차적인 작업을 위해서 모든 내용을 기록 한다면 어렵겠죠?

그래서 나온게 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 말고도 여러개가 보이죠?

이중에 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




그리고 이렇게 무심했던 우분투(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대에 한번에 nginx를 설치해 볼까요?
그 전에 한가지!! 가능한 (테스트를 위해서) 계정을 통일 시켜줍니다. 
물론 현업에서는 꼭 그럴 필요는 없지만..그런 경우에는 아무래도..앤서블 파일을 여러개를 구성해서 돌려줘야 합니다. 또는 패스워드를 각각 넣어줘야 하거나, 아이디도 그렇고..

따라서 현재 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에서 쉽게 사용이 가능한 것을 좀 알아보겠습니다.~!


0 개의 댓글:

댓글 쓰기

 
Copyright © . 엔지니어를 위한 파이썬 및 기술 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger