2017년 3월 28일 화요일

Ansible Ad Hoc 해보기

Ansible Ad Hoc 해보기 (모듈의 기본적인 사용)

먼저 글에서 이야기 했듯이

Ansible Tower를 운영(단순사용자말고)하려면

Ansible 명령어의 구문을 어느정도 익히고  미리 제공되는 module에 조금 익숙해야 한다

모듈 안쓰고 그냥 쉘로 주구장창 날려서 처리 할 수 있으나

이렇게 되면 멱등성(?) 이나 반영전 테스트에 번거로움이 많을것 같다

일단 이 글에서는 Ansible을 깔고

가장먼서 CLI에서 몇가지 module로 작업하는 예를 수행해봤다.

Ansible을 보면  Ad Hoc(에드혹)이라는것이 나오는데...

간단하게 이야기 해서 /etc/ansible/hosts 에 나열된 서버들에 대해서
원격지 명령을 보냄과 같다

AdHoc "특별한 목적을 위해 " 라는 뜻의 라틴어인데
네떡(network)에서 사용하더니 요즘은 이쪽에서도 쓴다
그냥 있던 단어 쓰면되지....

그냥 작업중에 별도의 일을 하기 위해 명령어를 날리는 것이고
여기서는 터미널 상에서 명령어 날리는 것이라고 이해 하자


아래 처럼 3개의 서버 리스트를 만들고 그룹명을 testserver 라고 지었다면

[testserver]
192.168.56.10 : ansible tower 설치
192.168.56.11 : node1
192.168.56.12 : node2

일단 ls를 해보자

단일 서버에는

[jboss@rockplace .ssh]$ ansible 192.168.56.11 -a "ls -al"   <== 요래 보내면

192.168.56.11 | SUCCESS | rc=0 >>
합계 28
drwx------. 16 jboss jboss 4096  3월 27 14:45 .
drwxr-xr-x.  3 root  root    19  3월 22 15:12 ..
-rw-------.  1 jboss jboss  930  3월 27 13:15 .ICEauthority
drwx------.  3 jboss jboss   17  3월 27 14:08 .ansible
...
요런식으로 출력된다

그룹단위로 몽땅 보낼꺼면

[jboss@rockplace .ssh]$ ansible testserver -a "ls -al"

192.168.56.11 | SUCCESS | rc=0 >>
합계 28
...
192.168.56.12 | SUCCESS | rc=0 >>
합계 28
...
192.168.56.10 | SUCCESS | rc=0 >>
합계 56

요런식으로 나온다


잠시 딴 이야기로

각 호스트에 대한 명령은 병렬로 처리되는데(전체 또는 그룹단위로실행하는경우)

동시에 몇 개까지 처리할것인지의 갯수를 fork 라고 한다

아래 config 파일에서 기본값이 수정 가능하다.  주석되어 있으나 기본 5개로 처리한다.

 /etc/ansible/ansible.cfg
#forks          = 5

os에서 Process를 구동하는것을 fork라고 하고 유사한 개념에서

ansible 명령어를 여러 서버에 전달할때  동시에 몇 개까지 수행할(보낼)지를 지정한다

이 fork갯수는 ansible server(ansible tower)의 처리 속도와 관계가 있다고 하겠다

물론 fork 갯수를 많이 하면 수행하는  Ansible server의 부하가 높아지므로 자원량에 따라 적절히 조정해야 하겠다  (5개는 너무 작다   WAS 서버 30대를 동시에 처리하면 30개 이상 잡아야하겠다)

또한

Multi Process로 fork 되어 수행되므로 수행 할 때 마다 먼저 처리되는 서버의 응답이 먼저 출력된다

hosts 파일에 10.11.12 순으로 있다고 그 순서대로 결과가 나오는게 아니다


여하간 이런식으로 간단히 명령어를 날릴 수 있다

만약 쉘로 짠다면

for node in 10 11 12
do
    ssh 192.168.56.$node "ls -al"
done

뭐 이렇게 되겠다. 별 차이 없어 보이겠지만 업무가 복잡해지면(조건) 엄청나게 코드에서 차이가 발생한다

Ansible은 보시다시피 상당히 간결하게 된다

단순한 명령어가 이정도 이고  좀더 복잡한 작업을 단순화 하기 위해

모듈이라는 개념이 사용된다

만약 파일을 원격지의 다수의 서버에 복사한다고 치면

Shell)
#scp /tmp/file.txt  jboss@192.168.56.10:/home/jboss
#scp /tmp/file.txt  jboss@192.168.56.11:/home/jboss
#scp /tmp/file.txt  jboss@192.168.56.12:/home/jboss

Ansible)
#ansible testserver -m copy -a "src=/tmp/file.txt dest=/home/jboss"

한줄로 끝난다.

여기서 -m 옵션이 module을 의미하고  Ansible에 이미 정의된 여러 모듈중에서 copy 모듈을 사용한다는 의미가 되겠다

만약 파일을 복사하고 권한을 755로 변경하고 오너 및 그룹을 변경하기 위한 작업은 어찌될까

Shell)
#scp /tmp/file.txt  jboss@192.168.56.10:/home/jboss
#scp /tmp/file.txt  jboss@192.168.56.11:/home/jboss
#scp /tmp/file.txt  jboss@192.168.56.12:/home/jboss
#ssh jboss@192.168.56.10 "chmod 755 /home/jboss/file.txt;chown jboss:jboss home/jboss/file.txt"
#ssh jboss@192.168.56.11 "chmod 755 /home/jboss/file.txt;chown jboss:jboss home/jboss/file.txt""
#ssh jboss@192.168.56.12 "chmod 755 /home/jboss/file.txt;chown jboss:jboss home/jboss/file.txt""

Ansible) - copy, file module 사용
#ansible testserver -m copy -a "src=/tmp/file.txt dest=/home/jboss"
#ansible testserver -m file -a "dest=/home/jboss/file.txt mode=755 owner=jboss group=jboss"

점점 차이가 나는것을 알 수 있다.

물론 쉘을 루프를 걸면 되겠지만 로직을 짜는것 자체가 공수(Ansible에는 이미 제공되는 모듈에서 이 부분을 커버한다)이고
이때 발생할 수 있는 오타.... 로지컬한 실수...
특히나  쉘의 경우 상용에 테스트를 해볼 수 없으니 별도의 서버에 한번쯤 돌려보는 수고를 해야 겠으나

ansible에서는 -C (or --check) 옵션을 포함하여 간단하게 수행이 가능하다
(나중에 알겠지만 shell 모듈이 있다.
모듈을 쓰지 않고 직접 쉘명령을 사용하는경우 주의해야 한다.
모듈은 테스트가 가능하지만 쉘명령은 실행 되면 그냥 반영되버릴 수 있다.)

#ansible testserver -C -m copy -a "src=/tmp/file.txt dest=/tmp"   <== 되는지 테스트
#ansible testserver -m copy -a "src=/tmp/file.txt dest=/tmp" <==실제 복사

#ansible testserver --check -m file -a "dest=/tmp/file.txt mode=755 owner=jboss group=jboss"
테스트 결과는 아래와 같이 출력된다.

192.168.56.10 | SUCCESS => {
    "changed": true,
    "gid": 1000,
    "group": "jboss",
    "mode": "0664",
    "owner": "jboss",
    "path": "/tmp/file.txt",
    "secontext": "unconfined_u:object_r:user_tmp_t:s0",
    "size": 4,
    "state": "file",
    "uid": 1000
}

#ansible testserver -m file -a "dest=/tmp/file.txt mode=755 owner=jboss group=jboss"
실제 반영된 결과는

192.168.56.10 | SUCCESS => {
    "changed": true,
    "gid": 1000,
    "group": "jboss",
    "mode": "0755",
    "owner": "jboss",
    "path": "/tmp/file.txt",
    "secontext": "unconfined_u:object_r:user_tmp_t:s0",
    "size": 4,
    "state": "file",
    "uid": 1000
}


이제 마무리로 ... 모든 모듈을 나열 할 수도 의미도 없으니 기본 모듈은 아래 URL에서 확인할 수 있다
별별 모듈이 다있는데
예를 들어 L7장비인 Big-IP  F5에 원격으로 붙어서 그룹을 제어하거나...하는짓(?) 도 할 수 있다.

Module Index
http://docs.ansible.com/ansible/modules_by_category.html


위 예 이외에 몇가지 기본 사용법은 아래를 참고한다.



Introduction To Ad-Hoc Commands

http://docs.ansible.com/ansible/intro_adhoc.html

다양한 모듈을 쓰지 않고 shell모듈 하나만 가지고..

또는 쌩으로  쉘스크립트를 날려서 처리할 수 있지만

Ansible의 자동화 기능을 잘 사용하기 위해서는 어느정도 module에 대한 이해가 필요하니

처음부터 끝까지 읽어보라기 보다는

지금 내가 하는 작업을 ansible로 몇가지 해보면 금방 적을 될 듯 하다.

또한 모듈이 기본 기능이라면

이미 사전정의된 작업파일을 템플릿으로 제공하고 있다. (ansible galaxy)

요건 다음에 공부해보자....

Ansible 타워는 언제하냐.... ㅋ상ㅋ  뭘 알아야 태워서 돌려보지

막 그냥 돌리는건 메뉴얼보고 하면 되기는 하는데....

기본은 어느정도 봐야 하지 않겠내 싶어서 바닥부터 간다

.이상













댓글 1개:

본 블로그의 댓글은 검토후 등록됩니다.