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 서버 그룹 을 분당그룹으로 지정하고

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

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

댓글 없음:

댓글 쓰기

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