본문 바로가기

DevOps/Automation

Automation for Networker[2] - Ansible : Part 1

 


기존에 포스팅을 시작한 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 란에 지정된 변수 값으로 데이터가 들어간 것을 볼 수 있습니다.