DevOps/Automation2015.05.02 04:47

Automation, Arista, Ansible, Configuration  : Today Key


Automation for Networker의 8번째이자, Ansible의 7번째 포스팅입니다.

이번 포스팅에서는 실제 가장 적용이 많이 될 만한, Ansible을 활용한 Configuration 백업에 대한 예제입니다.


 

 

Automation Tool인 Ansible을 활용한 Arista Config 백업하기

 


지난 번까지 Ansible에서 eAPI Library를 활용한 Arista 장비를 제어하는 예제를 알아보았습니다.

 

이번에는 제일 유용하게(?) 사용될만한 Configruation 백업에 대한 예제를 다뤄봅니다.

지난 번에 다뤄진 예제와 비슷한 듯 하지만, 몇 가지 더 고려해야 할 만한 부분이 있는 예제입니다.

 

 

< YML  작성하기 >

  - Configuration을 백업하기 위한 commands를 vars로 입력하는 데, enable을 먼저 한 이후에 show running-config를 한다.

    왜냐하면, show running-config를 실행하기 위해서는 enable 모드에서 사용하기 때문이다.

  - 기본 ansbile을 사용하기 위한 Arista Library의 eos_command에서는 json 모드만 지원한다.

    하지만, show running-config는 json을 사용하여 실행하려고 하면 eAPI에서 json으로는 해당 command를 지원하지 않기 때문에

    eos_command에서 json 방식이 아닌 text 방식으로 eAPI에 command를 전송하도록 변경해야 한다.

    (현재도 별도의 라이브러리의 변경없이 text방식이 지원된다면, YML에서만 수정을 해도 된다. 혹은 추후 지원 시..)

  - YML을 작성하면서 언급한 위의 show running-config를 하기 위한 모드 변경 및 방식 변경과 관련한 부분은 arista에서 지원하는

    eAPI Command를 통해서 웹접속으로 직접 명령과 결과 확인이 가능하다. 

 

---
-  name: ARISTA-ANSIBLE
   hosts: arista
   vars:
     commands:
       - enable
       - show running-config

   tasks:
     - name: ZIGI_Arista_eAPI_Command
       eos_command1: eapi_username={{eapi_username}}
                    eapi_password={{eapi_password}}
                    eapi_hostname={{eapi_hostname}}
                    eapi_port={{eapi_port}}
       args: { commands: "{{ commands }}" }
       register: result

     - debug: var=result
     - name: var=result
       template: src=my2.j2 dest=./result2

 

 

 

< Template >

   - 기존의 예제처럼 결과 값의 result의 output에 대한 템플릿을 사용할 수도 있지만,

     아래와 같이 템플릿을 지정하면, 실제 장비에 바로 설정이 가능한 config 형식으로 결과 값을 만들 수 있다.

     (결과 값으로 반환된 값을 Python 데이터 타입으로 확인해보면, 아래와 같이 템플릿으로 지정할 수 있다. )

 

 {{ result['output'][1]['response']['output'] }}

 

 

 

 

< Playbook 실행하기 >

   - 위에서 작성한 YML과 Template을 가지고 실행하면 다음과 같이 정상적으로 실행되었음을 알 수 있다.

   - 그리고 실제 결과 값은 아래와 같이 조금은 한 눈에 들어오지 않게 출력해준다.

 

 

 

 

< 결과 확인하기 >

    - 이제 템플릿을 사용하여, 가공한 결과 값의 파일(result2)를 확인해 보면, 실제 장비 Configuration을 백업하던 것처럼

      바로 적용이 가능하도록 Config가 백업된 것을 확인할 수 있다.

 

.

 

 

Posted by 네떡지기
DevOps/Automation2014.12.08 10:22

 


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

 

 


 

 

 

Posted by 네떡지기

티스토리 툴바