2017년 4월 30일 일요일

지름신이 강림하사 (IKEA Workstation, LG 34인치 울트라와이드 34UM59)

질렀다

모니터...21인치가 인생 가장 큰 모니터였던 내가

까이꺼 함 질러보지뭐!  하고 확 질러주셨음

잘팔려서 그런지 내가 원하는 기종(34UM59)은 시장에서 품절

4월 중순 예약 주문하고 4월 28일 배송 시작 29일 배송이 되었다

우아...박스 사이즈봐라....깡패내  ㅋㅋ

모니터를 질러놓고 보니 다이닝테이블인 내 책상이..... 꺼떡꺼떡 거리는 불안한 나무 다리를 보다가  아침에 눈뜨자 마자 이케아로 달려갔다(집이 안양...광명 이케아 차몰고 15분)

모니터와
IKEA Fredde Workstation 책상
집에와서 풀어 놓고 보니

어쩔.....

이거 혼자 어케 만들지....

그래도 한다.


아놔...

2시간 정도 걸려서 조립후 내 방에 밀어넣었다

양쪽으로 날개가 달렸는데 폭이 180이라 한쪽으로 몰아서 붙였다는

사이즈가 이 방에 딱이다!!

무게가 예술임....

일단 모니터와 놋북부터 올려봄
34UM59는 사이즈로 이야기 하면 27인치 모니터를 두개 이어 놓은 사이즈로

높이는 그리 높지 않다

만약 32인치 모니터라면 사진 처럼 안들어가고 아래쪽 페널을 제거하고 올려놓아야 할 듯


AMD 설정
59를 산 이유가 AMD FreeSync 기능때문이였는데...
뭐가 문제인지 지원안함으로 나온다.... 해결해야지....
 여하간 대략 올려두고 PC도 아래쪽에 밀어 넣어놓고 보니 간지는 작렬한다

(자...이제 대체 뭘 할꺼냐????)


참고로 이케아 워크스테이션 아래쪽에는 좌 우로 물건을 올릴 수 있는 자리가 있다.

PC를 올리라고 해놓은 것으로 보이고

5.1 체널 우퍼를 왼쪽에 올리고

우측에 PC를 넣는데....... ㅠ.ㅠ

공간이 높이 50Cm

PC케이스가 50Cm 상단 배기팬이 있고 전원이 위쪽에 있음...

넣을 수 는 있는데  전원을 켤 수 가 없음...

포기하고 그냥 바닥에 놓고 선방에는 허브와 뭐...잡다구리한거 대충 던져놓고 셋팅 끝

지금 이 포스팅을 하는데도 모니터의 어마무시한 사이즈가 적응이 잘 안됨 ^^;;

우측을 보려면 고개가 돌아감

제공하는 어플을 깔면 PIP나 화면 분할(기본 밝기, 명도등은 당연히 조정됨)이 지원되는데

동영상 편집작업과 뭐 몇가지 하다보니 처음 써봐서 그런지 살짝 당혹(?)스럽지만

넓은 화면에 대충 던져 놓는것 보다 알아서 들러붙는 기능이 상당히 편한듯 함


고장만 나지말고 백년 만년 쓰자꾸나 ^^;;

아래는 조립과정 동영상



2017년 3월 29일 수요일

Ansible 개발환경 구성하기

언제까지 vi로 시커먼데서 스페이스로 줄 맞춰가며 yml파일을 만들껀가!!!!

이번에는 좀 간지나게 playbook을 만들기위해 eclipse를 사용해 보도록 하자

개발자면 깔린 eclipse가 있을것이니 플러그인 몇 개 깔면 될것이고

취향에 따라 여러가지가 있으니 알아서 하시면 됨...

여기서는 잘 모르고 일단 시작할때 어떻게 하는것인가 정도로 참고하시면 되겠음.

가벼운거 좋아하심 edit+ 쓰시덩가  딴지걸지 말자   (개발환경운 개취임)


1. eclipse 설치
https://www.eclipse.org/downloads
아무거나 받아서 깔자 나는 최신판으로 받았더니 neon 이라는 버젼이 떨어졌다.

몇 년만에 이클립스인지 몰것다...



2. eclipse plugin설치
이클립스는 기본 설치만 하면 그냥 편집기 수준이다.

내가 java 개발자면 거기에 맞춰서 다른 언어 개발자라면 또 거기에 맞춰서....

힙분석이나 UML 에디터로 사용할 수 도 있다.

플러그인을 뭘 쓰고 얼마나 익숙한지가 관건이므로

회사마다 개발조직마다의 암묵적인 룰이 있을 것으로 안다.

아래 플러그인은 꼭 써야 하는게 아니라

개발환경의 편의성증대(생산성)를 위한 것이므로 그저 참고만 하도록 하자
(잘 몰것으면 그냥 찾아서 깔아주자)

플러그인은 아래 링크를 클릭해 들어가서 검색후 설치하면 된다.

https://marketplace.eclipse.org

Eclipse Runner - for grouping of Run configurations  ansible-playbook으로 yml을 런칭하기위해 사용한다.

Grep Console - for log output highlighting  출력결과 보기 편하라고

Shell Script (DLTK) - shell 스크립트 editor도 하나 깔자  쉘스크립트 편집기

YEdit - for YAML syntax highlighting  yml 파일 편집기

PyDev - Python IDE (if you want to develop custom Python modules or dig into Ansible core)  파이선편집

세상좋아졌다.



마켓 플레이스에 접속해서 install 이라는 링크를 끌어서

이클립스 작업공간에 드랍하면 설치된다 0.0!!!

리파지토리 추가하고 뭐하고뭐하고 하니라 삽질하고 하얗게 밤새던 그때가...지랄....


3. 공개된 sample을 받아와서 참고하도록 하자
뭐 해본적이 없는 사람이 가장 빠르게 뭔갈 하는방법(?)은 일단 샘플보고 연습하는것 아니겠는가

조금씩 하다 보면 참고하고 배끼기 위해서라도 샘플 정도는 한세트 받아서 참고하도록 하자

좀 간지나게 git으로 함 빨아보기로 했다.

https://github.com/ansible/ansible-examples/  사이트에 제공하는 셈플이 있으므로

git으로 빨아서 내 작업공간에 저장하도록 한다.


yckwon@yckwonS440 ~/work/git $ git clone https://github.com/ansible/ansible-examples/ ~/work/git/ansible-examples/
Cloning into '/home/yckwon/work/git/ansible-examples'...
remote: Counting objects: 3190, done.
remote: Total 3190 (delta 0), reused 0 (delta 0), pack-reused 3189
Receiving objects: 100% (3190/3190), 16.25 MiB | 124.00 KiB/s, done.
Resolving deltas: 100% (1105/1105), done.
Checking connectivity... done.


!! 혹시 git이 안갈렸다면 아래와 같이 설치한다.
yckwon@yckwonS440 ~/work/git $ sudo apt install git


4. 이클립스에 샘플 등록 및 창 추가

별건 아니고 이클립스에 받은 셈플을 프로젝트로 등록해서 필요할때 열어 볼 수 있도록 하자

아래순서를 참고해서 이클립스의 메뉴를 열어서 프로젝트를 만들고

참고로 git로 연결되어 있으면 이리저리 번거러우므로 연결을 끊는 작업까지 하도록 하자

File -> New -> Project
General -> Project
Project name: ansible-examples  (그냥 맘대로 정하자)

Uncheck "Use default location" and select directory with ansible-examples sources (/.../ansible-examples)

왼쪽에 project가 추가되고 git과 연결되었다고 파란색 표시가 있을 것이다.
그 다음에

Right-Click on the project -> Team -> Disconnect   <== git원본과 연결을 끊어준다...난 다 망쳐버릴꺼니까 ㅋㅋ

앞서 설치한 플러그인 창도 보이도록 하자 (깔아놓고 안보면 뭐하러 까나)
Window -> Show View -> Other.. > General -> Runner
Window -> Show View -> Console

쪼끔 다르겠지만 아래같이 왼쪽에는 프로젝트 가운데는 코드
(yml을 클릭해서 열면 색으로 구분-하일라이팅-되면 yedit가 잘 먹은거다)

아래쪽 창에 runner 와 console이 보이면 대충 된거다




혹시나 아직 ansible이 설치되어 있지도 않다면 아래처럼 그냥 깔믄된다.

Ansible설치 (난 민트리눅스라)
#sudo apt install ansible


5.eclipse Runner plugin에 Ansible 실행환경 등록
ansible-playbook이 실행(?)시키는 yml 파일은 일반적인 실행 파일이나 java APP 아니므로

런쳐(ansible-playbook)과 연결하여 실행할 수 있도록 구성을 추가해야한다.

이 런쳐는 playbook을 만들때 마다 이하나씩 만들어줘야 이클립스에서 play 버튼을 눌러서 쉽게 테스트 할 수 있다.

물론 이렇게 안하고 eclips에서는 편집만 하고 쉘에서 직접 돌려도 아무상관없다....

편하게 살자고....편하게...

아래 메뉴로 접근 하여 런쳐를 추가한다.

Run -> External Tools -> External Tools Configurations -> Program(우클릭하면 new나온다) -> New launch configuration

런쳐에 내가 실행시킬 플레이북을 돌릴 수 있도록 설정을 추가한다.

location : /usr/bin/ansible-playbook    (ansible-palybook 명령어 위치 )
working Directory : ${workspace_loc:/Ansible-Examples/jboss-eap7-standalone} (ansible project 위치 )
변수처리된 path가 해깔리면 그냥 하드코딩 해도 된다. 내경우
/home/yckwon/work/git/ansible-examples/jboss-eap7-standalone  이다.
Arguments : ${workspace_loc:/Ansible-Examples/jboss-eap7-standalone/site.yml} -i hosts -u jboss -v

-i 옵션이 없으면 기본으로 /etc/ansible/hosts 파일을 참고한다
-u 대상 서버에 접근할때 사용할 계정정보를 fix했다. 없으면 hosts파일에 넣어도 되고 playbook에서 지정할 수 도 있다.
-v 수행결과가 상세하게 출력되도록

이렇게 하면 화면에서 play 버튼을 누르면 수행이 되고 결과는 앞서 설치한 console 플러그인 윈도우로 출력된다.


위에 주황색으로 표시한 부분은 playbook 연습시에 실제 eclipse project의 폴더명과 같아야 한다는 것을 강조하려고...
안맞으면 당근 site.yml을 못찾아서 실행이 안될것이다.
일단 개발환경 설정하는건 이정도 까지 하고


다음에는 ad hoc으로 날리던 간단한 명령들을 playbook으로 만들어 돌려보고

작업이 복잡해 지면 task의 재 사용성을 높이고

표준화된 환경을 사용하기 위해 role로 task들을 쪼개서 사용하는 연습을 해보자

.이상



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 타워는 언제하냐.... ㅋ상ㅋ  뭘 알아야 태워서 돌려보지

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

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

.이상













2017년 3월 27일 월요일

Ansible Node추가 및 Inventory구문이해

노드 추가 및 작업 환경 만들기 및 Inventory(서버목록)

여기서 테스트를 위해 아래 3개를 노드로 구성한다
192.168.56.10 : ansible tower 설치
192.168.56.11 : node1
192.168.56.12 : node2


1. 관리대상 node에 ssh key 기반 접속 환경 구성 
Ansible은 모든 target node 작업을 ssh 기반으로 접근하여 처리한다
이때 ansible tower에서 관리하는 계정이 타 시스템으로 접근하여 작업을 하기 위해서는
ID/PASS 문의 없이 암호화된 키를 전달하여 상호 인증하는 환경을 구성해야 한다.

SSH Key를 이용하면 이러한 구성이 가능하다가

-flow
ansible tower server에서  관리용 계정을 만든다 (예 jboss)
jboss계정에서 ssh key를 생성한다

!! 생성시에는 패스워드 없이 만들도록 한다.
[jboss@rockplace ~]$ ssh-keygen -t rsa -C "yckwon@rockplace.co.kr"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jboss/.ssh/id_rsa):     <== 키 생성할 위치 및 파일명
Enter passphrase (empty for no passphrase):   <== 키 패스워드 없이 만든다.  (만드는 경우 반듯이 잘 보관해야 함 일어버리면 다시만들고 다시 복사하는 작업 필요)
Enter same passphrase again:
Your identification has been saved in /home/jboss/.ssh/id_rsa.
Your public key has been saved in /home/jboss/.ssh/id_rsa.pub.
The key fingerprint is:
bd:64:16:57:84:d2:ef:76:1b:50:35:8b:07:f0:8c:b8 yckwon@rockplace.co.kr
The key's randomart image is:
+--[ RSA 2048]----+
|           o.+o.o|
|          o *.o.o|
|         ..o.=.o |
|         ..o .o  |
|        SE=  ..  |
|         + .  o..|
|          .  . .o|
|               . |
|                 |
+-----------------+

아래 같은 파일이 생성 되어 있다.
[jboss@rockplace ~]$ cd ./.ssh
[jboss@rockplace .ssh]$ pwd
/home/jboss/.ssh
[jboss@rockplace .ssh]$ ls -al
합계 20
drwx------.  2 jboss jboss   80  3월 27 14:02 .
drwx------. 18 jboss jboss 4096  3월 27 14:04 ..
-rw-------.  1 jboss jboss 1675  3월 27 14:02 id_rsa
-rw-r--r--.  1 jboss jboss  404  3월 27 14:02 id_rsa.pub
-rw-r--r--.  1 jboss jboss  175  3월 22 16:25 known_hosts

자기자신에게도 패스워드 없이 로그인해야 할 수 있으므로 공개키 저장소 파일을 만든다

[jboss@rockplace .ssh]$ cp id_rsa.pub authorized_keys    (authorized_keys 파일은 ssh가 내부적으로 인식하는 승인된 서버의 암호화 키다 들어있는 파일이다)

다른 서버에도 모두 복사한다
최초 1회 이러한 작업을 모두 수행한다. 이후부터는 jboss계정은 패스워드 질의 없이 접근 된다.

[jboss@rockplace ~] ssh jboss@192.168.56.11 "mkdir ./.ssh;chmod 700 ./.ssh"
[jboss@rockplace ~] ssh jboss@192.168.56.12 "mkdir ./.ssh;chmod 700 ./.ssh
[jboss@rockplace ~] scp authorized_keys jboss@192.168.56.11:~/.ssh/authorized_keys
[jboss@rockplace ~] scp authorized_keys jboss@192.168.56.12:~/.ssh/authorized_keys

.ssh 폴더가 없을 경우 실패할 수 있다. 폴더를 만들되 권한을 700 으로 해야 정상동작한다(ssh서비스 보안사항임)
위의 ssh 명령으로 해도 되고 직접 접속시 아래와 같이 수행하도록 한다.
[jboss@rockplace ~]$ mkdir ./.ssh
[jboss@rockplace ~]$ chmod 700 ./.ssh
[jboss@rockplace ~]$ ls -al | grep ssh
drwx------.  2 jboss jboss   29  3월 27 14:04 .ssh


2. 간단한 ansible ping으로 확인

[jboss@rockplace .ssh]$ ansible 192.168.56.10 -m ping  (여기서 ping은 icmp가 아니라 ssh 포트를 체크한다)
[jboss@rockplace .ssh]$ ansible 192.168.56.11 -m ping
[jboss@rockplace .ssh]$ ansible 192.168.56.12 -m ping

정상이면 아래처럼 나온다.
192.168.56.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}


absible ping 수행시 오류발생 케이스
192.168.56.11 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", <== pub key없어서 오류
    "unreachable": true
}

192.168.56.10 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Host key verification failed.\r\n",   <== pub key를 복사했으나 직접 1회 접속해서 known hosts에 들어가도록 해야함
    "unreachable": true
}


ssh는 대상 node에 최초 접근시 호스트키 확인과정을 통해 known hosts 파일에 내용을 기록합니다. (최초1회)
이러한 과정때문에 한번도 접속한 이력이 없는(known_hosts 목록에 없는경우)경우 ansible 수행시 검증실패로 인하여 동작하지 않을 수 있습니다.
한번 수작업으로 ssh 접속을 하면서 등록을 하던가
이런 확인 과정을 비활성화 하길 원한다면 /etc/ansible/ansible.cfg
또는 ~/.ansible.cfg 파일을 수정하여 해결할 수 있습니다.

예 : /etc/ansible/ansible.cfg
[defaults]
...
# uncomment this to disable SSH key host checking
#host_key_checking = False


3. hosts 리스트를 만들자   (인벤토리 Inventory 설명)
2항에서는 하나하나 서버에 테스트하기 위해 host 명을 명시했지만
자동화를 위해 매번이렇게 할 수 없다
ansible에서는 여러대의 서버를 그룹 과 목록으로 관리하기 위하여 /etc/ansible/hosts 파일에 인벤토리를 만들어서 일괄작업이 가능하도록 한다.

기본 파일 또는 작업별로 여러 hosts파일을 만들어서 지정해서 쓸 수 있다

기본 파일 수정  (/etc/ansible/hosts)
[jboss@rockplace .ssh]$ cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
...
[testserver]
#ansible node1
#192.168.56.11
#ansible node2
#192.168.56.12

192.168.56.[10:12]  <== 여러대의 경우 이런식도 가능하다,  hostname으로 해도 된다.



inventory 파일 예제

mail.example.com

[webservers]
foo.example.com
bar.example.com

[wasservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com:2456
two.example.com:2456
three.example.com:2456

[wasservers]
www[01:10].was.com  ansible_connection=ssh ansible_user=mpdehaan

[pgsqldb]
db-[a:f].pgsqldb.com

[tunneling_DB]
db-[1:3].oracle.com ansible_port=5555 ansible_host=192.0.2.50

3.0 사용하는 host name은  ansible에서  lookup 이 가능하도록 DNS에 있거나 hosts 파일에 정의 되어 있어야 한다.
3.1. [] 는 그룹명으로 ansible에서 지정할 수 있다. 그룹을 지정하면 목록의 범위는 그룹아래 쪽 host가 target이 된다,
3.2. target node는 여러 그룹에 포함 될 수 있다. (하나의 서버에 WEB / WAS가 다 있는경우)
3.3. 대상서버의 ssh 서비스가 비표준(22번이 아닌)번호를 쓰는경우 : 으로 명시한다.  (특정 서비스 포트가 아니라 ssh 서비스포트)
3.4. 동일서비스의 다수서버의 이름이 순차적일때 일일이 넣지 않고 패턴으로 넣을 수 있다.
db-[a:f].pgsqldb.com는
db-a.pgsqldb.com
db-b.pgsqldb.com
db-c.pgsqldb.com ... f까지
www[01:10].was.com 는
www01.was.com
www02.was.com ... 10번까지

숫자와 문자 패턴만 지원한다.
~(web|db).*\.example\.com  등으로 정규식 지원가능...하지만  잘 모르면 머리아프다 ...단순하게 하자 단순하게


3.5. 터널링을 하는경우(보안이나....여하간의...이런방법을 기본으로 쓰는건 좋지 않다.)  특정 서버를 거쳐 다른권한으로 다른 서버에 접속하기 위하여
ansible_port= ansible_host=  옵션을 추가한다.
예를 들어
db-1.oracle.com ansible_port=5555 ansible_host=192.0.2.50
은  192.0.2.50 서버의 5555 ssh 포트에 접속하여 터널링을 만들고 db-1.oralce.com으로 접근하여 작업을 수행한다.

!! Ansible 2.0 부터
   ansible_ssh_user, ansible_ssh_host, and ansible_ssh_port 는
   ansible_user, ansible_host, and ansible_port 로 변경되었다.

별도파일을 쓰는 경우 -i 옵션을 주고 수행할 수 있다.
#ansible -i /ansible/inven/webserver.list all -m ping

3.6. 특정 서버에 접근시 계정을 지정하고 하는경우 (없으면 실행하는 계정으로 접근을 시도한다)

www[01:10].was.com  ansible_connection=ssh ansible_user=jboss


3.7. 특정서버에 connection을 ssh가 아닌 다른 형식으로 접근할 수 있다 

www[01:10].was.com  ansible_connection=ssh ansible_user=jboss

ansible 1.2.x + paramiko  (예전방식, openssh보다 빨라서 사용했음)
ansible 1.2.x + openssh   (명령어에 -c ssh 를 명시해줬어야했음)
ansible 1.3.x + openssh   (이후 부터는 기본 통신이 ssh로 변경되었기 때문에 그냥 쓰면됨, 하위호환성을 위한)

기타 ssh 접근이 아닌 방식
local
docker
smart (스마트하게....기본 값이다. 일반적으로 안넣어도 된다)


3.8 host와 group에 대한 변수처리 

호스트에서
[atlanta]
host1 http_port=80 maxRequestsPerChild=808   이렇게 넣으면 뒤에 playbook에서 변수를 가져다 쓸 수 있다. 꼭 이럴 필요는 없으나 필요하면...
host2 http_port=303 maxRequestsPerChild=909

그룹에서

[atlanta:vars]  <== 이렇게 주면 위의 atlanta 그룹에서 변수를 사용할 수 있다. 이것도 필요하면..playbook에서 변수처리를 다 할 수 있다.
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com


3.9 그룹의 그룹도 가능하다 (children)

[atlanta]
host1
host2

[raleigh]
host2
host3

[southeast:children]  <== southeast는 atlanta 그룹과 raleigh 그룹을 병합한 그룹이다.
atlanta
raleigh

[southeast:vars]  <== southeast 그룹에 변수를 추가할 수 있다.
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2

[usa:children]  <== usa 그룹은 그룹의 그룹을 또 그룹으로 만드는 예
southeast
northeast
southwest
northwest

정리하면

과천센터의
WEB 서버 그룹 , DB 서버 그룹 을   과천그룹 으로 지정하고

분당센터의
WEB 서버 그룹 , DB 서버 그룹 을 분당그룹으로 지정하고

과천그룹과 분당그룹을  수도권역그룹으로 지정

....걔속 확장하면 한국 서버 전체 목록이 만들어지겠지요.....

Ansible Tower 따위를 쓰는 이유





Ansible 따위를 쓰는 이유

호랭이 담배 물던 시절에는 IDC 라는 것 자체가 없었다

대부분 전산실이라는 이름을 붙여서 연구소에 끼워놓거나

좀 커도 전산실이였다

장비도 DB 몇 대  스위치 몇 개 라우터 Mux 등등 해서 수십내 미만..

그냥 창고형 전산실(?)도 부지기수

이때는 윈도우건 unix건 그냥 접속해서 일일이 작업하는 것이 그다지 부담스럽지도 않았고

같은 기능의 서버의 여러대 있지도 않았기에 반복작업 이랄께 그다지 없었다
(콘솔열고 몇대 접속해서 작업하는게 무슨부담?  꺼먼화면에 뭔가 휙휙~ 지나가면 간지도 나잖아?)

현재는

같은 서비스의 웹서버만 30대

같은 서비스의 WAS만 40대

비슷비슷한 또는 마이크로서비스형태의 수많은 서버

가상화로 인한 엄청나게 많은 장비들의 구성되었고

가끔 1명당 담당서버가 300대를 넘어가는 IT기업도 있다

이런 경우  hosts 파일에 정보하나 넣으려고

또는 수정된 APP 배포를 위해 수십대의 WEB/WAS를 재구동하기 위해

수십~수백대에 접속한다는건 말이 안되는 현실이다

하지만

이미 이러한 문제는 쉘 스크립트 + SSH 로 해결하고 있었고

돈 많은 곳에서는 Automation Solution을 도만입하기도 하였으나

전자는 회사내에 스크립트 장인(?)이 있어야 하고 (가끔 잘못 돌려서 잣되는 경우도....)

후자는 옛다 쳐먹어라!

할 만큼 돈이 많이 든다 (가끔 솔루션이 맛이 가서 아무것도 못하는 경우도...)

그래서 OSS 쪽에서 만들어진 자동화도구들 중에 최근 많이들 관심가지는 것이 Ansible
(책임감있는 앤서블.. 앤~씨불 아님...ㅋㅋ)

특히나 PaaS(퍼블릭가상화)에 대한 기대치가 높아지면서

PaaS환경내에서 사용자 작업없이 자동화되는 부분에서 높은 필요성이 대두 되었고

PaaS 솔루션인 RedHat OpenSift의 경우 내부적인 설치, 관리, 배포 등에서 사용되고 있다
(사용자가 하는게 아니라 솔루션 내부에 built-in)



그럼 Ansible Tower는 뭔데?

앞서 말한 OSS(Open Source Software)인 Ansible은 말그대로 뼈대만 제공한다.

설치하면 명령어 몇 개가 포함된 패키지와 관련된 파이선이라는 언어가 설치되는데....

설치야 한다치고 까만 화면에 뭘 해야 할 지 알 수가 없다. ㅜ.ㅜ

그걸 극복하고 에드혹(?)명령어를 오타없이 날리고  플레이북(?)을 만들 능력이 된다해도

실제 기업에 적용하여 사용하려면  문제발생시 통보와 결과에 대한 관리 ,

작업자 마다 수행할 작업이 다르고

혹시모를 실수를 방지 하기 위해 권한 및 그룹 관리를 해야 하는데

이건 OSS Ansible에서는 할 수 없는 것이고  필요하다면

뭇 OSS의 미덕이 그러하듯 다 너님이 개발해서 써야한다

그런데.... Ansible 하나 쓰겠다고  수십명의 개발자(억단위  프로젝트가 된다)를 쓸수도 없고

결국 뚝딱뚝딱 개발해낼 능력자가 없는 대부분의 회사에서는

기업의 크기가 어떠하든 서버의 댓수가 얼마이든

잘 하는 사람이

잘 아는 서비스에

잘 아는 서버를 대상으로

완벽하게 컨트롤 가능한 환경에서 일부 쓰일 뿐이다

그래서

순수 "오픈소스" 가 아닌 "오픈소스 비지니스"(오픈소스로 돈벌기)영역에서는

뼈대 수준인 Ansible에 살을 붙여서

GUI 콘솔, 워크플로우, 인증환경, 그룹 및 사용자관리, 작업결과 관리, 모니터링 등의

실 업무를 위한 기능을 추가하여 기업제품으로 제공하고

그 제품이름이 Ansible Tower가 되시겠다.  (레드햇 제공)




그렇다고 사람들이 생각하듯 이거 사면 자동화가 다 되는건가? 하는 생각은 버려야 한다.

이 제품을 쓰기 위해서는 Ansible에 대한 이해가 필요하고

실제 운영자는 Ansible AdHoc과 Playbook을 만드는 수준의 기술이 필요하다

이 제품은 Ansible을 운영할 줄 아는 사용자가

Enterprise에서 실제 확장 적용하여 사용할 수 있게끔 만들어주는 솔루션이다.

HP OPS군같이 GUI에서 클릭클릭 해서 뭔가 하려는 생각은 버려야 한다
(알다시피 이 비싼 제품들도 고난이도 작업은 어짜피 스크립트로 해결한다..)

이것 저것 떠나서

- 우리는 300대 서버에 대해서 과거 10년간 사용하던 shell script로 잘 운영하고 있고
- 이걸 관리하는 사람들도 큰 불편없고
- 이걸 쓰는 사람들도 스크립트에 불만이 없다면
- 또는 jenkins씨에 SSH 플러그인 먹여서 잘 쓰고는 있다면......

그냥 그대로 사시라.... 이거 사서 설치한다고 세상이 변하지않는다(혁신은 개나 주자고!)


각설하고 OSS로 개발된 SW를 개선하여 메뉴얼과 기술을 판매하여 수익을 생산하는....



이러한 비지니스형태는 단지 Ansible에 국한 된 것이 아니라 대부분의 오픈소스가 취하는 비지니스형태이다

다만 한국에서는 아직 이런 비지니스의 개념보다 "공짜" 라는 생각만 하는 사람이 많다보니

오픈소스 하는사람을 무슨 봉이 김선달 보듯이 하는 경향이 있지만

나는 이야기 해주고 싶다

다운로드 받아서 쓸써면 그냥 잘 쓰시면 되구요...  안말려요

하다가 몰라서 물어볼꺼믄 돈을 내라니깐???  나도 먹고 살아야죠?  같이 삽시다 웅?


.이상