5. Ansible 소개
v Configuration Management System
• Provision
• Orchestration
• System 설정을 code로 관리 합니다.
• 멱등성(indempotency) - 여러 번 적용해도 결과는 항상 동일합니다.
• chef, puppet, salt, ansible
6. Ansible 소개
v Pull-based & Push-based
Pull-based 방식이 큰 규모의 서버 관리 및 신규 서버 추가에 더 적합하다고 하지만,
ansible을 이용하여 수 천대 서버를 관리하고 있으며, 서버 추가 및 삭제도 용의 합니다.
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
실행
7. Ansible 소개
v Ansible 구성요소
• Inventory : 관리 대상 서버 리스트 입니다.
• Modules : host에 특정 action을 수행하는 패키지화된 sctips 입니다.
• play-book : 변수 및 task를 관리 호스트에 수행하기 위해 yaml 문법으로 정의된 파일 입니다
• plug-in : 확장 기능(email, logging ,etc) 을 제공 하고 있습니다,
• Custom module : 사용자가 직접 작성한 모듈을 사용 할 수 있습니다.
v Ansible 구성요소
• 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
v Ansible 연결 플러그인
• ssh, paramiko – ssh 연결
• local – localhost 연결
• winrm – windows 연결
• docker – docker에 연결
8. Ansible 소개
v Ansible 개요
• Configuration management tool
• Open Source
• Python 기반
• Michael DeHaan 개발(Cobbler 개발자)
• Ansible. Inc는 Redhat에 인수됨
• ssh 연결
• 순차 적용
• 수백개의 모듈 제공
• Template - jinja2
• Playbook은 yaml 사용하여, syntax 이해가 쉬움
• Agentlee 방식으로 관리 호스트에 별도 작업이 필요하지 않음
• Twitter가 ansible로 전환
• Web 관리 UI인 ansible-tower(상용)
10. Ansible 을 이용한 password 일괄 변경
v 데모 환경
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hostname 내부아이피 접속정보 역할
ansible_test_0 192.168.10.245 root/passowrd Ansible 실행 서버
ansible_test_1 192.168.10.230 root/passowrd 대상 서버
ansible_test_2 192.168.10.252 root/password 대상 서버
ansible_test_3 192.168.10.202 root/password 대상 서버
11. Ansible 설치/설정
v Ansible install
# yum install epel-release
# yum install ansible
Epel저장소를 이용하여 yum으로 설치 할 수 있습니다.
Yum 을 이용한 설치
# yum install autoconf gcc python-devel libffi-devel openssl-devel
# pip install ansible
Python기반으로 개발 되었기 때문에 pip으로 설치 가능 합니다.
pip 을 이용한 설치
# ansible --version
2019년 1월 기준 ansible 2.7 버전이 안정화 버전 입니다.
Ansible 확인
12. Ansible 설치/설정
v Ansible 디렉토리 구조
# ls /usr/lib/python2.7/site-packages/ansible
설치 디렉토리 PATH – CentOS7 기준
# ls /usr/lib/python2.7/site-packages/ansible/modules
Core Modules 위치
13. Ansible 설치/설정
v Ansible 디렉토리 구조
# ls /usr/lib/python2.7/site-packages/ansible/modules/system/ping.py
Ping Module 위치
# ls /usr/lib/python2.7/site-packages/ansible/modules/commands/shell.py
Shell Module 위치
14. Ansible 설치/설정
v Ansible hosts 설정
# cat /etc/hosts
Ansible에서 관리하는 호스트 정의하기 전 편의를 위하여 /etc/hosts 파일에 대상 서버 정보를 정의
합니다.
호스트를 그룹에 대한 특정 변수, 설정을 할 수 있습니다.
15. Ansible 설치/설정
v Ansible Inventory 설정
# cat /etc/ansible/hosts
Ansible에서 관리하는 호스트 정의하기 위해서 Inventory를 설정 합니다.
기본적인 설정은 “/etc/ansible/hosts” 에서 설정 하며, “/etc/ansible/ansible.cfg” 파일을 수정해서 별도의
파일로 설정 할 수도 있습니다.
호스트를 그룹화 하여 host를 관리 합니다.
호스트를 그룹에 대한 특정 변수, 설정을 할 수 있습니다.
16. Ansible 설치/설정
v Ansible Inventory 확인
# ansible --list-hosts webservers
# ansible --list-hosts all
설정된 inventory 에 대하여 “ --list-hosts "옵션을 사용 하여 확인 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
17. Ansible 설치/설정
v Ansible Ad-hoc
# ansible webservers -m shell -a "hostname"
Ansible ad-hoc 커맨드를 이용하여 해당 host에 접속 하여 명령어를 보내서 실행/응답 받을 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
# ansible webservers -m shell -a “whoami"
18. Ansible 설치/설정
v Ansible playbook
# cat /opt/ansible/rdate.yml
Playbook 은 배포에 내용(plays)을 정의한 파일로, 여러 작업(task)에 대하여 미리 정의된 yaml 형태의
문서 입니다. Playbook을 이용하여 복잡한 설정을 미리 정의 하여 반복적으로 사용 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
---: yaml 문법 처음을 정의 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
become: sudo 사용 지정 합니다.
tasks: host에 접속하여 해당 module 및 arg에 맞게 실제 action 수행하는 play를 list로 정의합니다.
yum: yum모듈을 사용하여 rdate 패키지를 설치 합니다.
shell : shell모듈을 사용하여 rdate 명령어를 실행합니다.
”webservers” 그룹에 rdate를 yum을 이용하여 설치 하고 , 설치된 rdate명령어를 이용하여 시간 동기화 하는 playbook
19. Ansible 설치/설정
v Ansible playbook
# ansible-playbook /opt/ansible/rdate.yml
Ansible-playbook 명령어를 이용 하여 정의된 playbook을 실행 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
21. Ansible 을 이용한 password 일괄 변경
v Ansible user module
Ansible에서 user 에 대한 설정은 미리 지정된 user 모듈을 이용하여 설정 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
22. Ansible 을 이용한 password 일괄 변경
v Host password 확인
”password” 문자로 호스트에 접속 시도 하여, 정상적으로 접속 되는지 확인 합니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
# sshpass -p 'password' ssh -o StrictHostKeyChecking=no ansible_test_1 hostname
23. Ansible 을 이용한 password 일괄 변경
v Ansible host 수정
각각의 호스트 마다 다른 패스워드를 설정 하기 위하여, host별로 new_password라는 변수로 지정하여
변경 할 패스워드를 미리 설정 합니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
# vi /etc/ansible/hosts
24. Ansible 을 이용한 password 일괄 변경
v Ansible password playbook
Ansible에서 user 에 대한 설정은 미리 지정된 user 모듈을 이용하여 설정 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
---
- name: Change password
become: true
hosts: webservers
tasks:
- name: Change password of existing user
user: name=root update_password=always password={{ new_password|password_hash('sha512') }}
# vi /opt/ansible/password.yml
new_password 변수를 sha512 해쉬로 설정하여 변경 합니다.
암호가 다를 경우 password를 업데이트 합니다.
변경할 user이름을 지정 합니다.
25. Ansible 을 이용한 password 일괄 변경
v Ansible password playbook
ansible playbook을 실행 하여 패스워드를 일괄적으로 변경 합니다.
Webservers 그룹에 대하여 확인을 합니다.
모든 그룹에 대하여 확인 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
# ansible-playbook /opt/ansible/password.yml
26. Ansible 을 이용한 password 일괄 변경
v Host password 확인
”password” 문자로 호스트에 접속 시도 하여, password가 변경되어 접속이 안되는 것을 확인 합니다.
변경된 “ new_password”로 접속 시도 하면 정상 적으로 접속이 가능 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
# sshpass -p 'password' ssh -o StrictHostKeyChecking=no ansible_test_1 hostname
# sshpass -p 'new_password' ssh -o StrictHostKeyChecking=no ansible_test_1 hostname
27. Ansible 을 이용한 password 일괄 변경
v Ansible host 변경
Password가 변경 되었기 때문에 “ansible_ssh_pass” 변수에 설정된 비밀번호를 변경 해야 정상적으로
실행 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
29. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# cat /opt/ansible/httpd_install.yml
Ansible playbook을 이용하여 동일한 서비스를 하는 host에 대하여 동일한 패키지 설정 및 설정을 변경 할
수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
httpd 이름의 패키지를 yum모듈을 이용 하여 설치 합니다.
service 모듈을 이용 하여 httpd 서비스를 등록 하고 실행 합니다.
copy 모듈을 이용 하여 ansible을 실행 하는 host파일을
대상 서버로 복사 합니다. mode를 이용 하면 권한을 설정 할 수 있습니다.
restart httpd라는 핸들러를 호출시 service모듈로 httpd데몬을 재실행 합니다.
해당 이름으로 지정된 핸들러를 호출 합니다.
30. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# ansible-playbook /opt/ansible/httpd_install.yml
Ansible playbook을 실행하여 httpd데몬을 일괄적으로 설치 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
31. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# ansible webservers -m shell -a "netstat -nltp | grep httpd"
copy로 복사된 설정에는 httpd데몬의 포트를 8998 로 변경 되는 설정이 있었습니다.
ad-hoc을 이용 하여 8998포트로 변경 되어 리스닝 되는지 확인 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
32. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# cat /opt/ansible/httpd.conf | grep Listen
설정을 일괄 적으로 변경 하기 위하여 ansible 서버에 있는 httd.conf파일을 수정 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
33. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# ansible-playbook /opt/ansible/httpd_install.yml
Ansible playbook을 다시 실행 하여 httpd데몬을 일괄적으로 설정을 덮어 쓰고 서비스를 재시작 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
34. Ansible 을 이용한 패키지 일괄 설치
v Ansible playbook
# ansible webservers -m shell -a "netstat -nltp | grep httpd"
다시 httpd의 리스닝 되어 있는 포트를 확인 하면 1000번 포트로 변경 된 것을 확인 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
36. Ansible을 이용한 파일 전송
v Ansible copy 모듈
# cat /opt/ansible/copy.yml
Ansible copy모듈을 사용 하면 Ansible서버에 있는 파일을 원격지 대상 서버로 일괄 전송 할 수 있습니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
Ansible server에서 전송 할 파일을 지정 합니다.
대상 서버에 저장 될 경로를 지정 합니다.
37. Ansible을 이용한 파일 전송
v Ansible copy 모듈
# ansible-playbook /opt/ansible/copy.yml
Playbook을 실행 하여 파일을 전송 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
38. Ansible을 이용한 파일 전송
v Ansible copy 모듈
# ansible -m shell -a 'ls -al /tmp/test.war' webservers
Shell 모듈을 사용 하여 대상 서버에 정상적으로 저장 된 것을 확인 합니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.
39. Ansible을 이용한 파일 전송
v Ansible copy 모듈
# ansible-playbook /opt/ansible/copy.yml
만약 동일한 파일을 동일한 playbook으로 실행 할 경우 파일이 동일 하기 때문에 변경 하지 않습니다.
Webservers 그룹에 대하여 확인을 합니다.
name: 해당 play에 대한 설명(주석), optional설정입니다.
hosts: Inventory의 ‘webservers’ group을 대상으로 지정 하여 실행 합니다.