기존에 포스팅을 시작한 Puppet에 이어서 비슷한 자동화 Tool인 Ansible에 대한 정리입니다.
Puppet를 정리를 시작하다가, 잠깐 다른 부분을 정리하다보니 Ansible 부분을 다시 먼저 정리하기 시작했습니다.
기존 Puppet도 마찬가지고 Ansible도 함께 포스팅이 될 예정이며 제목은 Automation for Networker이라는 이름으로
통합 포스팅이 될 예정입니다.
Automation Tool이 Network보다는 System쪽에 보다 촛점이 맞혀져 있겠지만,
제 Posting에서는 보다 Networker를 위한 중심으로 진행될 예정입니다. ^^;
수정해야 할 부분, 보완해야 할 부분이 있으면 알려주시면 감사하겠습니다.
Ansible
- 시스템 구성(환경 설정), 초기 소프트웨어 Deploy는 물론 다운타임이 없이 Update에 따라 지속적인 Deploy가 가능.
- 단순하고, 사용하기 편리하도록 하는 것이 Ansible의 목표
- 에이전트가 없는 구조. 에이전트 관리에 신경을 쓰지 않아도 됨.
- SSH를 통한 통신.
- DevOps Tool
- 네트워크 엔지니어 활용 방법
: Configuration Management / Network Configuration Template
Ansible 기능
- Packge management : apt, yum, ..
- Remote execution : command, shell
- Service management : service
- File handling : copy, template..
- SCM : get_url, git, subversion...
Ansible 설치
- 별도의 Agent가 없기 때문에 서버에서만 Ansible을 설치
※ 단, Agent에 의해 관리받는 Host가 Python 2.4 이하 버전 사용 시에는 simplejson 모듈 설치 필요.
Ansible File
Inventory File
- Remote Server에 대한
- /etc/ansible/hosts/Ansible-hosts [Default]
- '-i' 옵션으로 별도의 inventory File 지정 가능
- Remote host Grouping 가능
Template File
- 실제 처리하고자 하는 업무에 대한 Template
- Jinja2 적용 가능(Template Task인 경우)
- 관례상 확장자는 '.j2'
Playbook File
- ansible 환경 설정 및 배포
- yaml 문법을 사용하여 기술
- 조건(when), 반복(with_items), Variables, include, register 지원.
- YAML의 제일 첫 줄은 '---'로 시작하며, 이는 YAML 포맷의 시작 지점을 뜻함.
- List의 동일한 Member들은 '-' 문자를 먼저 쓰고 뒤에 항목들을 입력한다.
- 각 항목들의 Indent는 동일하게 구성(2칸)
- Dictiory 혹은 Hash라고 부르는 key:value 의 형식으로 사용된다.
- 다양한 방식의 boolean 값을 사용할 수 있다.
ex) yes , no, True, TRUE, false
- 하나 이상의 'play'를 가진다. (play는 여러 호스트들에 정의된 'role'과 'task'를 매핑하는 역할)
‡ task : ansible module을 호출하는 단위(필수)
YAML & Jinja2
YAML
- 사람에게 친숙한 데이터 직렬화 양식으로 모든 프로그래밍 언어에서 사용
* Site: http://www.yaml.org/spec/1.2/spec.html#id2759768
Jinja2
- Jinja2 is a modern and designer-friendly templating language for Python, modelled after Django’s templates.
- Jinja2 is a full featured template engine for Python.
It has full unicode support, an optional integrated sandboxed execution environment, widely used and BSD licensed.
* Site : http://jinja.pocoo.org/
Ansible Example 1
우선 Ansible을 실행하기 위한 아주 기본 구성은 하나의 Template 파일(.j2), Playbook(.yml)로 구성하여 예제를 실행해봅니다.
Playbook 파일의 대략적인 구성은 아래와 같습니다.
hosts : vars: 구분자 : 실제 대입될 값 tasks: - name : Task명 - 출력 시에, 실행한 Task 이름을 표기 template: src=Template파일(경로 포함) dest =완성된 파일(경로포함) |
실제 예제 파일의 내용입니다. .
Template파일에는 기본적인 Configuration 설정이 있고, Hostname 부분에만 {{ }}로 묶인 것이 있습니다.
이 부분이 Template에서 변경이 이뤄질 부분입니다.
아래 Playbook 파일을 보면, vars 란에 hostname이라는 부분이 있습니다. 이것이 Template에 {{ }} 안에 변수명입니다.
즉 Template의 {{ }} 선언된 변수명이 Playbook 내에서 Vars 항목에 선언되어 있어야 합니다.
task는 실제 처리할 내용입니다. myT.j2(Template) 내용을 처리해서, hostname.cfg라는 파일로 만들어지게 됩니다.
이제 Playbook을 실행해봅니다.
실행은
ansible-playbook playbook_file
으로 실행하면 됩니다.
정상적으로 실행된 것을 확인할 수 있으며(실제 처음 실행하게 되면, Ok뒤의 Changed로도 체크가 됩니다.)
결과 파일을 살펴보면, hostname 부분이 vars에서 선언한 내용으로 변경되어 있음을 찾아볼 수 있습니다.
Ansible Example 2
두 번째 예제는 다수의 Variable을 사용하는 방법입니다.
vars 항목 대신에 task에서 with_items라는 항목을 넣고, 변수명:데이터값 을 지정하게 됩니다.
여기에서 선언한 개수만큼 해당 Task는 실행이 되게 됩니다.
간단한 예제로 보겠습니다.
hosts : tasks: - name : Task명 template: src=Template파일(경로 포함) dest =/home/zigi/{{item.변수명}} with_items: // 순환문 처럼 아래 변수에 대해서 차례대로 순환 - 변수명 : 실제 대입될 값1 - 변수명 : 실제 대입될 값2 - 변수명 : 실제 대입될 값3 - 변수명 : 실제 대입될 값4 |
예제 1과 Template은 동일하지만, Playbook 파일을 보면, vars부분 대신에 task의 with_items이 생긴 것을 볼 수 있습니다.
playbook을 실행하면 정상적으로 수행됨을 볼 수가 있고, Task에서도 5번의 changed가 생긴 것을 볼 수 있습니다.
(ex1에서 얘기했듯이 최초의 실행을 하게 되면, changed도 함께 표기가 됩니다. 파일을 생성자체가 변경사항이기 때문입니다.
실제 만들어진 파일의 내부를 보면, with_items에 선언된 값으로 변경되어 있음을 볼 수 있습니다.
Ansible Example 3
세 번째 예제는 하나의 Template에 하나의 값이 아니라 다수의 값을 지정하려고 하는 경우입니다.
기존의 변수와 값을 선언하던 것을 { }로 묶어서, 내부에서는 ','로 구분만 해주면 됩니다.
아래 예제를 보면 보다 쉽게 이해할 수 있습니다.
hosts : tasks: - name : Task명 template: src=Template파일(경로 포함) // Templeate 파일 dest =/home/zigi/{{item.변수명}} with_items: // 순환문 처럼 아래 변수에 대해서 차례대로 순환 - {변수명1: 실제 대입될 값1-1, 변수명2:실제 대입될 값1-2, ... } - {변수명2: 실제 대입될 값2-1, 변수명2:실제 대입될 값2-2, ... } - {변수명3: 실제 대입될 값3-1, 변수명2:실제 대입될 값3-2, ... } - {변수명4: 실제 대입될 값4-1, 변수명2:실제 대입될 값4-2, ... } |
아래 Template을 보시면, hostname뿐만이 아니라 Loopback의 address부분/ ip route의 nexthop이 추가된 것을 볼 수 있습니다.
playbook에서도 with_items 부분에 { }로 각 변수와 값이 들어가 있습니다
Playbook을 실행하면, Task에 각 item들이 입력된 값을 볼 수 있습니다.
실제 생성된 파일의 내용을 보면
정상적으로 각 variable 란에 지정된 변수 값으로 데이터가 들어간 것을 볼 수 있습니다.