안녕하세요. kin입니다.
오늘은 configuration management tool 가운데 다크호스로 이미 떠오른 ansible을 한 번 후려쳐 볼까 합니다.
이미 Chef, Puppet, Salt등 다양한 tool들이 많이 사용되어지고 있지만 Ansible 은 흠 일단 쉬워요. Chef, Puppet 은 Ruby 기반이지만 Ansible은 YML(야믈 이라고 발음) 기반이지요. 물론 YML이 static 하기 때문에 dynamic 적으로 사용하려면 JINJA2 (python 기반)을 같이 사용해야 하기 때문에 복잡(?)성이 증가 한다고 생각할 수 있지만 기본적으로 간단합니다.
그럼 Ansible 의 가장 기본적인 특징을 알아볼까요?
- Ansible 은 Agentless합니다.
- ansible은 기본적으로 SSH(또는 옵션에 따라 ZeroMQ) 기반입니다. 따라서 Puppet 사용시 PKI등의 잡스러운(?) 요소가 필요 없지요.
- Ansible은 python 기반입니다. python 2.4 이상의 버전이 필요합니다.
- 풍부한 모듈 지원. 약 200개 이상의 모듈이 out of the box 로 지원됩니다.
- Ansible galaxy에서 다양한 role들을 다운로드하여 사용하세요. (chef의 recipe라고 생각하시면 됩니다.)
Playbook
- playbook은 ansible의 환경 설정, 배포를 가능케 하는 언어.
- 각 playbook은 하나 또는 하나 이상의 ‘play’를 둔다. 즉 collection of plays
- play의 목적은 여러 호스트들에 잘 정의된 ‘role’과 ‘task’를 매핑하는 역할
- task는 ansible모듈의 호출을 의미.
- Playbook files
- Yml files
- 1234567891011121314- name: Install nodejs required for webservershosts: webserversuser: kinsudo: yesroles:- nodejs- name: Install mongodb required for dbservershosts: dbserversuser: kinsudo: yesroles:- mongodb
cs - '야믈’이라 발음
- 사람이 쉽게 읽을 수 있는’ 데이터 직렬화(serialization) 양식.
- json은 간결함과 범용성에 초점을 둔다면, yaml은 json의 장점을 포함하고 임의의 고유 데이터 구조에 대한 직렬화 를 지원.
- yaml은 정적. ansible에서는 이를 동적으로 표현할 수 있는 무엇인가가 필요함.
- jinja2(http://jinja.pocoo.org/docs/)라는 python 라이브러리를 이용해서 yaml 문법의 단점 을 보완.
- Site.yml(플레이북 디폴트)
- block을 가지고 있음.
- block은 적용할 host와 role을 명시.
- Hosts file (inventory 파일이라고도 함)
- 1234567[webservers]web01web02192.168.100.1 set_hostname=web03[dbservers]db1
cs - inventory파일은 리모트서버에 대한 meta데이터를 기술하는 파일
- 파일 포맷은 Standard INI-like 파일
- ansible에서는inventory파일에는 yml을 적용하지 않았음.
- 기본파일은 /etc/ansible/hosts을 읽게 하거나, 따로 inventory파일을 만들고 옵션을 주어 동작하게 할 수 있음.
- [, ]안이 그룹 이름이고, 호스트명(host)은 해당 그룹에 속함
- 한 줄에 하나의 호스트 선언(IP 또는 hostname)
- 호스트 선언 뒤에 Host variable을 선언할 수 있음.
- 인벤토리 파일에서 호스트네임을 사용하면 /etc/hosts 파일에서 resolvable 하거나 dns lookup을 통해 찾을 수 있어야함.
- Group varible을 선언할 수 있음
- Role
- 12345678910111213141516171819.├── README.md├── defaults│ └── main.yml├── meta│ └── main.yml├── tasks│ └── main.yml├── templates│ └── nodesource.list.j2└── test└── integration├── default│ ├── default.yml│ └── serverspec│ └── default_spec.rb└── helpers└── serverspec└── spec_helper.rb
cs
- Role 들은 서로 dependency를 가질 수 있음. (meta에 정의)
- Files - 타겟으로 복사 되어져야 하는 파일들(설정 파일 들을 여기에 둔다)
- Handlers - YML file - notify에 triggered 되는 config의 부분이라고 할 수 있음
- Meta - YML file role dependencies
- Tasks - 스텝의 리스트로 구성되이 있는 YML 파일 즉 이 스텝들이 타겟 노드에서 명시된 순서대로 실행되어진다.
- Templates - jinja2 files(YML을 확장하는 동적 템플릿 파일)
- Task
- Name 아래 줄을 액션이라고 함. 이 액션이 ansible module을 사용하는 코드임
- 123456- name: Add the Redis PPAapt_repository: repo='ppa:rwky/redis' update_cache=yes- name: Install Redis from PPAapt: pkg=redis-server state=installed- name: Start Redisservice: name=redis state=started
cs
댓글 없음:
댓글 쓰기