3. - Internal Use Only -
Configuration Management System
• Provision
• Orchestration
• System 설정을 code로 관리
• 멱등성(indempotency) - 여러 번 적용해도 결과는 항상 동일
• chef, puppet, salt, ansible
4. - Internal Use Only -
Ansible 개요
• Configuration management tool
• Open Source
• Python 기반
• Michael DeHaan 개발(Cobbler 개발자)
• Ansible. Inc는 Redhat에 인수됨
• ssh 연결
• 순차 적용
• 수백개의 모듈 제공
• Template - jinja2
• Playbook은 yaml 사용하여, syntax 이해가 쉬움
• Agentlee 방식으로 관리 호스트에 별도 작업이
필요하지 않음
• Pull-based 방식도 지원(ansible-pull - 상용)
• Twitter가 ansible로 전환
• Web 관리 UI인 ansible-tower(상용)
5. - Internal Use Only -
Not support
• 최초 OS 설치에 관여할 수 없음.
• 구성 변화는 멱동으로 관리할 수 있으나, 모니터링은 할 수 없음.
• 파일 변경 추적 X
6. Pull-based(chef, puppet) Push-based(ansible)
Agent Agentless
1. Admin : Configuration management script 변경
2. Admin : 변경 파일을 서버로 업로드
3. Agent : 일정 시간마다 서버로 접속하여 변경이력 확인
4. Agent : 새롭게 변경된 파일 다운로드
5. Agent : 변경된 파일 실행
1. Admin : playbook(Configuration Management script) 변경
2. Admin : 새로운 playbook 실행
3. Ansible on Control : 서버로 접속하여 변경된 playbook 실행
Pull-based & Push-based
Pull-based 방식이 큰 규모의 서버 관리 및 신규 서버 추가에 더 적합하다고
하지만, ansible을 이용하여 수천대 서버를 관리하고 있으며, 서버 추가 및 삭제도 용의
8. - Internal Use Only -
구성요소
• Inventory : 관리 대상 서버 리스트
• Modules : host에 특정 action을 수행하는 패키지화된 sctips
• play-book : 변수 및 task를 관리 호스트에 수행하기 위해 yaml 문법으로 정의된 파일
• plug-in : 확장 기능(email, logging etc)
• Custom module : 사용자가 직접 작성한 모듈
9. - Internal Use Only -
Modules
• Package mgmt : apt-get, yum, package
• Commands : shell, command
• File 관련 : file, copy
• Template 관련 : template
• Download : get_url, git, subversion
• Server info : setup
• Service 관리 : service
• Cloud 관리 : aws, openstack
10. - Internal Use Only -
연결 플러그인
• ssh, paramiko – ssh 연결
• local – localhost 연결
• winrm – windows 연결
• docker – docker에 연결
11. - Internal Use Only -
설치
[설치방법 1 - 패키지]
# yum install epel-release
# yum install ansible
[설치방법 2 – pip]
# yum install autoconf gcc python-devel libffi-devel openssl-devel
# pip install ansible
[update]
# yum update ansible
# pip install ansible --upgrade
관리 호스트 : python 2.6 or 2.7 이상
* 관리 대상 호스트 : python 2.4은 python-simplejson python 2.5 이상은 필요 없음
12. - Internal Use Only -
디렉토리 구성
/usr/lib/python2.7/site-packages/ansible/modules
Core Modules 위치
/usr/lib/python2.7/site-packages/ansible
설치 디렉토리 PATH – CentOS7 기준
/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py
Ping Module 위치
/usr/lib/python2.7/site-packages/ansible/modules/commands/shell.py
Shell Module 위치
13. - Internal Use Only -
설정 – ansible.cfg
# vi ansible.cfg
[defaults]
inventory = hosts
host_key_checking = False
remote_user = ansible
log_path=~/ansible.log
no_log=False
no_target_syslog=False
forks = 20
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
• inventory : inveroty 파일 or 디렉토리 경로
• host_key_checking : Host_key(~/.ssh/known_host) 체크
• remote_user : ssh 접속 시 사용할 user
• log_path : ansible 실행 로그 파일 경로
• no_log :
• no_target_syslog : 관리 host의 syslog에 ansible 로그 여부
• forks : 동시 접속 노드 수(default : 5)
• privilege_escalation : sudo 관련 설정
14. - Internal Use Only -
ansible.cfg 순서
ANSIBLE_CONFIG=<ansible.cfg PATH>
기본 경로
홈 디렉토리
현재 디렉토리
환경 변수
15. - Internal Use Only -
설정 - Inventory file
• Ansible에서 관리하는 호스트 정의
• 호스트 인벤토리 기본 위치 : /etc/ansible/hosts
• --inventory PATH
위 옵션으로 임의 경로의 파일을 지정
호스트 그룹 이름
연결 방법, ssh 접속 유저, ssh 패스워드 설정
특정 호스트 그룹의 변수 설정
호스트 그룹을 서브그룹으로 다시 그룹핑
19. - Internal Use Only -
ansible 실행
Ansible 수행 시, 실행 프로세스
/usr/bin/ssh
-o ForwardX11 no
-o ForwardAgent no
-o PermitLocalCommand no
-o ClearAllForwardings yes
-o batchmode yes -C
-o ControlMaster=auto
-o ControlPersist=60s
-o StrictHostKeyChecking=no
-o KbdInteractiveAuthentication=no
-o PreferredAuthentications=gssapi-with-
mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no
-o User=centos
-o ConnectTimeout=10
-o ControlPath=/root/.ansible/cp/d8ac695b15
-o Protocol 2
-s -- 192.168.2.131 sftp
ansible_ssh_user
ansible_connection
ansible.cfg 및 inventory 설정에 따라 ‘–o ‘에 설정되는
ssh-client 옵션들이 변경됨.
- ansible_connection : ssh 세션 재활용
- ansible_python_interpreter : host의 python path가
/usr/bin/python이 아닌 경우 설정 필요
20. - Internal Use Only -
YAML
Json과 비슷한 포맷
--- : dash 3개는 document의 시작을 알림
# : 주석
String : 따음표를 사용하지 않아도 됨.
단, 변수를 표현할 때 사용
ex) {{ 변수 }}
YAML JSON
List - Value1
- Value2
[
“Value1”,
“Value2”
]
Dictionary key1: value1
key2: value2
{
“key1”: “value1”,
“key2”: “value2”
}
Line Folding key1: >
long values1 go on,
long values2 go on
Key2: short value
{
“key1: “long values1 go on,
long value2 go on”,
“key2”: “short value”
}
22. - Internal Use Only -
Playbook
• ansible 배포에 내용(plays)을 정의한 파일
• yaml 문법
* Play : host에 접속하여 action을 수행하는 것
---: yaml 문법 처음
name: 해당 play에 대한 설명(주석), optional
become: sudo 사용 지정
hosts: Inventory의 ‘loadbalancer’ group을 대상으로 지정
tasks: host에 접속하여 해당 module 및 arg에 맞게 실제 action 수행하는
play를 list로 정의
- yum을 사용하여 패키지 설정, yum cache 업데이트
- service: systemd로 서비스 시작, enabled
- copy: 설정 파일 복사, permission 644
- template: jinja2 작성된 tempate 파일 복사, permission 644
- file: file 삭제
handlers: tasks에 정의된 play 중, notify에 의해 호출될 service 모듈로 정의된
handler, 서비스 재시작 등
service : nginx 재시작 handler
23. ansible 동작 순서
1. Playbook에 정의된 task를 수행하기 위한 python script 생성
2. 해당 script를 대상서버로 복사
3. 해당 script 실행
4. 모든 host에서 script 실행이 완료될 때까지 기다림
24. - Internal Use Only -
Playbook & Shell
playbook
- name: Ensure NTP is installed.
yum: name=ntp state=present
Shell script
if ! rpm -qa | grep -qw ntp; then
yum install ntp
fi
playbook Shell script
- name: Ensure NTP is running
service: name=ntpd state=started enabled=yes
if ps aux | grep -v grep | grep "[n]tpd" > /dev/null
then
echo "ntpd is running." > /dev/null
else systemctl start ntpd.service > /dev/null
echo "Started ntpd.”
fi
systemctl enable ntpd.service
출처 : “ansible for devops” by Jeff Geerling, 2015
25. - Internal Use Only -
Jinja2
Jinja2
- Python Template 언어
- 템플릿 적용을 위해 사용
- 참고 : http://jinja.pocoo.org/docs/dev/templates/
- loop statement
- If statement(조건이 만족할 때만 내부 로직 수행)
26. - Internal Use Only -
명령어
# ansible-playbook
Ex) # ansible-playbook <play-book file>
[Task 리스팅]
# ansible-playbook --list-tasks <play-book file>
27. - Internal Use Only -
실행
ansible-playbook Options :
-i --invertory=host-file
-v --verbose
-e --extra-vars=VARS
-f --forks=NUM
-c --connection=TYPE
--check : run in Check Mode
[Syntax check]
# ansible-playbook –syntax-check <playbook.yml>
[dry run]
# ansible-playbook –C <playbook.yml>
28. - Internal Use Only -
ansible-facts
• Tasks 수행 전, 서버의 정보
수집(hostname, IP, Mac etc)
• 변수로 사용 가능
• gather_facts 사용 X
# vi playbook.yml
자주 사용되는 facts
ansible_os_family
ansible_hostname
ansible_memtotal_mb
- hosts: test
gather_facts: no
29. - Internal Use Only -
setup
• Cache enable
[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
# redis 사용 설정
#fact_caching = redis
# memcached 사용 설정
#fact_caching = memcached
30. - Internal Use Only -
file
• 파일, 디렉토리, 링크 파일 생성
• path: 파일 및 디렉토리 PATH
• state: 대상 PATH의 타입
- link : 링크 파일
- directory : 디렉토리
- absent : 삭제
• mode: 파일 퍼미션(8진수 표현을 위하 ‘0’을 앞에 붙여야 함
31. - Internal Use Only -
copy
• remote 서버로 복사를 위한 파일
• src: 소스 파일 위치
• dest: 대상 서버의 복사될 위치
• mode: 파일 퍼미션(8진수 표현을 위하 ‘0’을 앞에 붙여야 함
32. - Internal Use Only -
templates
• Jinja2 작성
• File Contents 변경이 내부 로직에 따라 자동으로 이루어지는 파일
33. - Internal Use Only -
with_items
• Iteration
• 2개 이상의 변수를 리스트로 선언, 반복문으로 사용 가능
35. - Internal Use Only -
handlers
• notify 지시자를 사용하는 task에서 해당 module을 실행을 완료한 후,
notification 발생(notify에 지정된 handler 호출)
• notify에 지정된 ‘handler 이름’으로 handlers에 정의된 handler를 찾아
task(restarting services) 수행
36. - Internal Use Only -
vars
• playbook or template에서 사용한 변수 정의
vars 지시자
Playbook 내부의 vars 지시자에 설정
ex)
vars_files 변수가 설정된 개별 파일을 include하는 설정
roles의 defaults
Role별 변수 설정
- 설정 위치 :
roles/<role name>/defaults/main.yml
- roles/<role name>/vars/main.yml
inventory에 설정
Host 및 host group별 변수 설정
- 설정 위치 :
Inventory 파일
group_vars
Host group별 변수 설정
- 설정 위치 :
file - group_vars/<group name>
directory - group_vars/<group name>/xxx
host_vars
Host 별 변수 설정
- 설정 위치 :
file - host_vars/<host name>
directory - host_vars/<host name>/yyy
38. - Internal Use Only -
wait_for
• 특정 서비스 데몬의 실행 후에 해당 play을 진행하기 위한 지시자
• host: 서비스 확인할 host 정보
• port: open 상태를 확인할 Port
• search_regex : 파일이나 soket의 문자 매칭에 사용
39. - Internal Use Only -
local_action
• control host 자신에서 모듈 실행하기 위함
• delegate_to : play를 다른 host에서 실행
40. - Internal Use Only -
기타
• ignore_errors : error로 playbook 중단 회피
• serial: 동시에 접속 및 play 수행할 host 수 지정 설정
• max_fail_percentage: 최대 실패 비율 초과일 경우, playbook 실행 중단
• run_once: 1회만 실행
• changed_when, failed_when: 특정 조건일 때 상태
• set_facts : playbook 내에 새로운 변수 설정(register로 받은 결과를 변수 저장)
• hostvars: 특정 호스트만 사용할 변수 선언
{{ hostvars['db.osci.kr'].ansible_eth1.ipv4.address }}
41. - Internal Use Only -
roles
• playbook을 여러개의 작은 단위로 분리
• Directory 별로 구분
• playbook 재사용 가능
• playbook 중복 사용 제거
• 특정 기능 구현을 위한 playbook의 묶음
[Create roles]
# mkdir -p nodejs-app/roles/nodejs/{meta,tasks,defaults,vars}
# vi nodejs-app/roles/nodejs/meta/main.yml
--------------------
---
dependencies: []
--------------------
• role skeleton directory 생성
42. - Internal Use Only -
Single playbook to role
playbook Role 변경
Playbook – role 사용
43. - Internal Use Only -
기타
• pre-tasks: role 실행 시작 전 수행할 play 정의
• post-tasks: role 실행 완료 후 수행할 play 정의
• dependencies: 해당 role이 함께 실행될 role 정의