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에 국한 된 것이 아니라 대부분의 오픈소스가 취하는 비지니스형태이다

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

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

나는 이야기 해주고 싶다

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

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


.이상

Ansible Tower 설치

설치... 그냥 설치임...별거없음

- TEST Env
ansible tower설치 (version 3.1)
CentOS 7 64bit
Virtual Box  2 CPU, 2Gbyte MEM, 50G Vol,

- Document
http://docs.ansible.com/ansible-tower/

- 요구사항
supported Operating Systems:
Red Hat Enterprise Linux 7 64-bit
CentOS 7 64-bit
Ubuntu 14.04 LTS 64-bit
Ubuntu 16.04 LTS 64-bit
(yml 내부를 보면 RedHat-7*:CentOS-7*:Ubuntu-14.04:Ubuntu-16.04:OracleLinux-7*)

2GRAM (4G이상)
only 64bit
20GHDD (/var/)

- Sizing
저장소 용량산정
관리서버 수 * 스케쥴 수행 * ((평균 모듈사이즈 * 모듈수) / 3) =
For example, assuming a schedule of 1 scan per day for a year:
(hosts = 1,000) * (number of scans = 365) * ((average module fact size = 100 kb) * (number of modules = 4) / 3) = 48 GB

메모리 산성
fork 수를 지준으로 한다.
4G에 100개의 fork를 기준으로 함
원하는 fork수 / 기준 fork 100 * 기준 메모리 4G =
400 fork를 지원하기 위해서는
400fork / 100fork * 4G = 16G

가이드에는 없으나 스켄횟수는 모듈별 1일 1회 정도가 맞겠으나 모듈 수는 가변적이므로 최소 2배수 정도는 잡는게 어떨까 싶다....
내부적으로 pgsql db가 사용됨

- HA 구성 지원
단독설치, DB 분리, Tower HA 구성 제공



1. 리파지토리 구성 (connect & disconnected env)

인터넷이 되더라도 리파지토리 추가는 해줘야 함
#root@localhost:~$ yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm


2. ansible 설치  (Tower 자체가 Ansible로 설치되므로 필요, Tower 2.3버젼부터는 설치과정에서 깔림, 그전에 설치필요)

#sudo yum install ansible


설치되는 패키지
Dependencies Resolved

================================================================================
 Package                  Arch          Version               Repository   Size
================================================================================
Installing:
 ansible                  noarch        2.2.1.0-1.el7         epel        4.6 M
Installing for dependencies:
 PyYAML                   x86_64        3.10-11.el7           base        153 k
 libtomcrypt              x86_64        1.17-23.el7           epel        224 k
 libtommath               x86_64        0.42.0-4.el7          epel         35 k
 libyaml                  x86_64        0.1.4-11.el7_0        base         55 k
 python-babel             noarch        0.9.6-8.el7           base        1.4 M
 python-httplib2          noarch        0.7.7-3.el7           epel         70 k
 python-jinja2            noarch        2.7.2-2.el7           base        515 k
 python-keyczar           noarch        0.71c-2.el7           epel        218 k
 python-markupsafe        x86_64        0.11-10.el7           base         25 k
 python2-crypto           x86_64        2.6.1-13.el7          epel        476 k
 python2-ecdsa            noarch        0.13-4.el7            epel         83 k
 python2-paramiko         noarch        1.16.1-2.el7          epel        258 k
 sshpass                  x86_64        1.06-1.el7            epel         21 k

Transaction Summary
================================================================================
Install  1 Package (+13 Dependent packages)


3. 설치 환경정의  (inventory 파일 수정)


#vi /home/jboss/ansibleTower/ansible-tower-setup-3.1.0/inventory

[tower]
localhost ansible_connection=local

[database]

[all:vars]
admin_password='jboss!'

pg_host=''
pg_port=''

pg_database='awx'
pg_username='jboss'
pg_password='jboss!'

rabbitmq_port=5672
rabbitmq_vhost=tower
rabbitmq_username=tower
rabbitmq_password='jboss!'
rabbitmq_cookie=cookiemonster

# Needs to be true for fqdns and ip addresses
rabbitmq_use_long_name=false


4. 설치 파일 수행 (임의의 위치에 설치본을  풀어놓았다고 가정, 설치는 root로 수행

/home/jboss/ansibleTower/ansible-tower-setup-3.1.0/setup.sh

VM에서 수행시간 : 11:08 ~ 27  :  약 20분 소요  (VM 2CPU, 2Gbyte 할당 ENV)


구동되는 관련 프로세스 (파이선기반의 Ansible본체, Pgsql DB, Rabbit MQ)
awx      15523 14715  0 11:27 ?        00:00:05 python /usr/bin/tower-manage runworker --only-channels websocket.*
awx      15524 14715  0 11:27 ?        00:00:00 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
awx      15525 14715  0 11:27 ?        00:00:03 python /usr/bin/tower-manage run_fact_cache_receiver
awx      15526 14715  1 11:27 ?        00:01:14 /var/lib/awx/venv/tower/bin/python /var/lib/awx/venv/tower/bin/daphne -b 127.0.0.1 -p 8051 awx.asgi:channel_layer
awx      15527 14715  0 11:27 ?        00:00:03 python /usr/bin/tower-manage run_callback_receiver
awx      15528 14715  0 11:27 ?        00:00:06 python /usr/bin/tower-manage celery beat -l debug --pidfile= -s /var/lib/awx/beat.db
awx      15529 14715  0 11:27 ?        00:00:10 python /usr/bin/tower-manage celery worker -l debug --autoscale=50,4 -Ofair -Q projects,jobs,default,scheduler,broadcast_all,localhost -n celery@localhost
awx      15550 15524  0 11:27 ?        00:00:05 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
awx      15551 15524  0 11:27 ?        00:00:04 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
awx      15552 15524  0 11:27 ?        00:00:03 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
awx      15553 15524  0 11:27 ?        00:00:03 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
awx      15554 15524  0 11:27 ?        00:00:08 /var/lib/awx/venv/tower/bin/uwsgi --socket :8050 --module=awx.wsgi:application --vacuum --processes=5 --harakiri=120 --no-orphans --master --max-requests=1000 --master-fifo=/var/lib/awx/awxfifo --lazy-apps
postgres 15812  6959  0 11:27 ?        00:00:00 postgres: jboss awx 127.0.0.1(43308) idle
postgres 15836  6959  0 11:27 ?        00:00:00 postgres: jboss awx 127.0.0.1(43322) idle
awx      15846 15527  0 11:27 ?        00:00:00 python /usr/bin/tower-manage run_callback_receiver
awx      15847 15527  0 11:27 ?        00:00:00 python /usr/bin/tower-manage run_callback_receiver
awx      15848 15527  0 11:27 ?        00:00:00 python /usr/bin/tower-manage run_callback_receiver
awx      15849 15527  0 11:27 ?        00:00:00 python /usr/bin/tower-manage run_callback_receiver
awx      15851 15529  0 11:27 ?        00:00:04 python /usr/bin/tower-manage celery worker -l debug --autoscale=50,4 -Ofair -Q projects,jobs,default,scheduler,broadcast_all,localhost -n celery@localhost
awx      15852 15529  0 11:27 ?        00:00:04 python /usr/bin/tower-manage celery worker -l debug --autoscale=50,4 -Ofair -Q projects,jobs,default,scheduler,broadcast_all,localhost -n celery@localhost
awx      15853 15529  0 11:27 ?        00:00:03 python /usr/bin/tower-manage celery worker -l debug --autoscale=50,4 -Ofair -Q projects,jobs,default,scheduler,broadcast_all,localhost -n celery@localhost
awx      15854 15529  0 11:27 ?        00:00:04 python /usr/bin/tower-manage celery worker -l debug --autoscale=50,4 -Ofair -Q projects,jobs,default,scheduler,broadcast_all,localhost -n celery@localhost


[root@rockplace ansible-tower-setup-3.1.0]# ps -ef | grep post
root      1370     1  0 10:33 ?        00:00:00 /usr/libexec/postfix/master -w
postfix   1372  1370  0 10:33 ?        00:00:00 qmgr -l -t unix -u
postgres  6959     1  0 11:19 ?        00:00:00 /usr/pgsql-9.4/bin/postgres -D /var/lib/pgsql/9.4/data
postgres  6960  6959  0 11:19 ?        00:00:00 postgres: logger process
postgres  6962  6959  0 11:19 ?        00:00:00 postgres: checkpointer process
postgres  6963  6959  0 11:19 ?        00:00:00 postgres: writer process
postgres  6964  6959  0 11:19 ?        00:00:00 postgres: wal writer process
postgres  6965  6959  0 11:19 ?        00:00:00 postgres: autovacuum launcher process
postgres  6966  6959  0 11:19 ?        00:00:00 postgres: stats collector process
postgres 15812  6959  0 11:27 ?        00:00:00 postgres: jboss awx 127.0.0.1(43308) idle
postgres 15836  6959  0 11:27 ?        00:00:00 postgres: jboss awx 127.0.0.1(43322) idle


rabbitmq  7339     1  0 11:19 ?        00:00:00 /usr/lib64/erlang/erts-8.0.3/bin/epmd -daemon
root      7722     1  0 11:19 ?        00:00:00 /bin/sh /etc/rc.d/init.d/rabbitmq-server start
root      7724  7722  0 11:19 ?        00:00:00 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/sbin/rabbitm-server
root      7727  7724  0 11:19 ?        00:00:00 /bin/sh /usr/sbin/rabbitmq-server
root      7741  7727  0 11:19 ?        00:00:00 su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq  7755  7741  0 11:19 ?        00:00:00 /bin/sh -e /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq  7937  7755  1 11:19 ?        00:01:03 /usr/lib64/erlang/erts-8.0.3/bin/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db -K true -B i -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin -noshell -noinput -s rabbit boot -sname rabbitmq@localhost -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/rabbitmq@localhost.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbitmq@localhost-sasl.log"} -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbitmq@localhost-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbitmq@localhost" -kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
rabbitmq  8031  7937  0 11:19 ?        00:00:00 erl_child_setup 1024
rabbitmq  8065  8031  0 11:19 ?        00:00:00 inet_gethost 4
rabbitmq  8066  8065  0 11:19 ?        00:00:00 inet_gethost 4

5. 접속확인
https://192.168.56.10:80  으로 기본 설치됨
이 정보들은 초기 설치시 inventory  파일에서 정의할 수 있음
기본 계정으로 admin / password
inventory에 지정하지 않고 설치했다면  명령어로 초기화 하여 접속

#tower-manage changepassword admin

[root@rockplace ansible-tower-setup-3.1.0]# tower-manage changepassword admin
Changing password for user 'admin'
Password:
Password (again):
Password changed successfully for user 'admin'
You have new mail in /var/spool/mail/root




.이상

2017년 3월 8일 수요일

OpenShift Version 3 - Block Arch


Platform as a service (PaaS)가 하두 대세라...

회사서도 하자고 하고 ,,,

Version 2.x에서 좀 보다가 말았는데 

1년을 수원에 팔려가서 딴짓 하다보니 공부했던 것도 다 잊어버렸음 

Version 3이 나왔는데 내부가 완전 딴거임...

기존에는 자체적으로 구성하거나 뭔가 오픈소스를 누덕누덕 하더니 이번에는 

Docker 기반으로 싹 갈아치웠다 

덕분에  OpenShift 하면서 Docker와 쿠버네티스와 엔시블까지 한방에 가보는걸로 

일단 Open Shift V3의 아키텍쳐 변경사항과 항목에 대한 기초적인 설명 부터 공부....




= 개념  =
0. Master 는
- The Master is an instance of Red Hat Enterprise Linux or Red Hat Atomic Host
  (EHEL기반으로 단독서버든 가상화든 OS에 구성되는 인스턴스라는 의미)
- Master primary functions is :
     > Orchestrate all activities on nodes
     > Know and maintain state within OpenShift environment

0. Node는
 - The Node is an instance of Red Hat Enterprise Linux or Red Hat Atomic Host
   (MASTER와 동급으로 구성된다, 역할이 POD를 가지고 가는 서버로 실제 서비스를 하는놈이라고 보면 됨)
 -  Nodes are where end-user applications, Pods, are run
 -  Nodes are orchestrated by masters

0. POD 란
쉽게 말해 여러개의 docker image로 구동된 Instance를 가질 수 있는 가상의 Container 환경
-.-;; 어렵나???
여하간 Docker의 컨테이너이고 안에 image(APP)야 여러개 구성할 수 있으나 POD = Container로 이해 하믄 되는것 같음

POD 의 내부적인 IP나 할당된 Port는 실제 외부로 서비스 되기 위해서는 물리주소와 Port 로의 메핑이 필요하다 (이 기능은 service 개층에서 추상화 되어 실제 서비스로 제공된다)

- Consists of co-located group of containers with shared resources such as volumes and IP addresses
(컨테이너 그룹에 구성되고 볼륨과 IP를 공유해서 구성됨)
- Smallest compute unit that can be defined, deployed, and managed
(배포의 대상이 되는 가장 작은 단위, 미니언)
- May contain one or more co-located applications that are relatively tightly coupled--run with shared context
(POD에 상호 긴밀하게 구성된 하나 이상의 APP이 배포될 수 다. - 텍스트로 실행됨)


= 역할 =   (Master에 포함된 기능과 각 Layer에 대한 역할)

1. Scheduler 의 역할
-Determines where to place pods  (클러스터에  POD 생성시 POD의 위치결정 - 여유있는 NODE에 POD 생성시 기준생성)
-Reads pod data and finds node that is good fit (POD 데이터를 읽어서 적절한  NODE-여유있는-를 찾아낸다)
-Is independent, standalone, pluggable solution  (독립적이고 단독실행되고 플러깅이 가능하다)

2. Replication Controller 역할
하나로 모자라면 더 생성해서 부하 수용량을 늘리고
만들어진 다음에 안쓰면 줄이는 작업을 주로 담당

-Ensures that the desired number of pods actually exist (설정된 포드의 수를 확인 - 기준에 맞도록 POD의 수를 조정한)
-If pods exit or deleted, replication controller instantiates more (POD가 정지되거나 지워지면 설정한 만큼 생성하는 작업 수행)
-If more pods running than desired, replication controller deletes as many as necessary ( 설정보다 많은 수의 POD가 있으면 줄이는 작업 수행)


3. Routing Layer
Paas 환경은 내부의 APP들이 가지는 IP:Port 정보가 사설 IP라고 보면 된다.
즉 외부 환경과 내부 환경이 분리 된다. 이때 외부에서 내부의 서비스에 접근하기 위해서는
적절한 이름찾기 서비스(DNS)와 실제 IP로 접근하기 위하여 NAT Proxy 기능을 제공해야 한다.
이 부분을  Routing 에서 제공한다.

내부-> 외부  뿐 아니라 내부->내부 접속도 처리한다.

외부(공인IP, FQDN으로 접속) --> 서비스 Layer (여러 POD를 단일 서비스로 추상화) --> Router (적절한 POD로 Proxy 처리)

- Provides for external connectivity into services running on OpenShift (서비스에 외부 연결방법을 제공함)
- Takes care of internal and external requests to/from the applications running on OpenShift (실행되는 APP의 내,외부 요청의 처리, 분기 등)

- Router의 역할 :
- Ingress point for traffic destined for OpenShift services (OC서비스 접속 요청의 수신 지점)
- A mapping of an FQDN and path to the endpoints of a service (URL과 접속경로 메핑)
- The router can run on any node in an OpenShift environment (모든 노드에 라우터 구성이 가능하다.)

4.  Service layer
- Provides abstraction for accessing members of a logical set of pods (논리집합-여러개의 포드, 서비스)에 접근하기 위한 추상화 기능제공)
- Provides abstraction of service endpoints and internal load balancing (endponts 즉 POD의 추상화와 내부 분산기능 수행)

5. software defined network(SDN)의 역할
내부 네트워크...

Allows pods to connect to the network and communicate (POD를 네트워크에 연결하고 통신하도록 한다)

6. 라벨
Pods tagged with labels, services use label selectors to identify pods they proxy to  (서비스계층에서 레이블정보를 기반으로 전달할 POD를 식별한다)
Labels are simple key-value pairs  (단순한 키 페어로 구성된다)
Most resources in OpenShift can be given a label (대부분의  리소스를 레이블링 할 수 있다)


 = POD의 deploy 단계 =
-OpenShift API/authentication layer- Approves request, considering user's permissions, resource quotas, and other information
-OpenShift scheduling layer - Designates node host for each pod, considering resources' availability and load and application spread between nodes for application high availability
-OpenShift node - Pulls down image to be used from external or integrated registry and starts container (pod) on node


=Changed OpenShift Logical Architect=
기존 V2   -   현 V3
Broker - MASTER  :  관리기능및 주요컴포넌트가 운영되는 서버
Mcollective - ocastration은 kubernetes로 : Master와 Node간의 제어를 담당
Gear - POD : 하나의 서버(VM,물리관계없음)에 구성되는 Container, Docker 로 보면 된다
Cartidge - Image : 서비스하는 소프트웨어의 Docker 이미지, Apache, JBoss WAS, Mysql 등등등...만들어도 되고 받아서 해도 된다.

기타

Ansible : Docker Image의 성성 배포 등의 작업에 자동화를 담당하도록...유사한 배포도구가 많이 있으나 RedHat은 이쪽을 미는듯, 범용 Deploy Tool 이므로 여러가지로 사용가능

.이상