2017년 11월 23일 목요일

[Ansible] Template의 용도는? (2/2)

- 0 개의 댓글


아~ 아~ 저번에 Template이 아무래도 너무 부족한게 많았던거 같아요

그래서 본질적으로 돌아가서 cfg를 생성하는걸 할까? 하다가..
그건...아무래도 적절한 예시가 없어서 두개를 해 보려고 합니다.

이 예제를 통하면 Template의 사용법이 이제는 이해가 되실꺼에요

1) yml을 template으로 만들기

이상하게 들리시겠지만, template의 output은 어떤 것이라도 만들수 있어요.
물론...binary는...안된다는게 함정이지만 -_-
그래서 yml은 어떻게 보면 plain text이기 때문에 확장자를 지정해 주고 만들수 있답니다.

예시를 볼까요?

여기서 만들었던 동적으로 변수를 할당해 보아요~ 라는 yml파일을 template를 통해서 생성해 보겠습니다.

[ nginx_template.yml ]
1
2
3
4
5
6
7
8
---
- name: Create yml by template
  hosts: localhost

  tasks:
  - template:
      src: which_lnx.j2
      dest: /home/vagrant/template/which_lnx.yml

[ which_lnx.j2 ]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#Create by Template at {{ ansible_date_time.date }}
---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ "{{'Ubuntu' if ansible_distribution == 'Ubuntu' else 'CentOS' if ansible_distribution == 'CentOS' else 'Just Linux'"}} }}"

  tasks:
  - name: nginx for Any Linux
    include_tasks: "{{ '{{ lnx_name }}' }}.yml"


어떻게 결과가 나올까요~?


해당 내용을 보면 이전 작성한 내용과 동일하게 작성되는 것을 볼 수 있습니다.


template을 이렇게도 쓸수 있구나~? 정도로 보시고 다음껄 볼까요?


2) 두번째는 hosts 파일을 생성
 - template을 통해서 /etc/hosts 파일을 생성해 주는 예제~ 예제입니다~!

[ hosts_template.yml ]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
---
- name: Create hosts file by template
  hosts: localhost
  become: yes

  vars:
    Node_Number: 8

  tasks:
  - template:
      src: hosts.j2
      dest: /etc/hosts

[ hosts.j2 ]
1
2
3
4
5
6
7
#Create by Template at {{  ansible_date_time.iso8601 }}

127.0.0.1 {{ ansible_hostname }}
192.168.1.10 ansible-server
{% for ip in range(Node_Number) %}
192.168.1.{{ip+101}} ansible-node0{{ip+1}}
{% endfor %}


길지 않은 줄로 어떤 결과가 나오는지 볼까요?


짜잔~~! for loop를 사용해서 해당 내용을 자동으로 생성해 준 것입니다.
template을 사용하면 장점이 짧은 줄로...결국 프로그래밍...이라고 생각해야 겠지만...여하튼 간단하게 여러가지의 내용들을 기입할 수가 있습니다. 그리구 중요한 것은 변수들이 Pre-defined 되어 있으니 그걸 이용하기도 좋죠 :)



여기서 끝일까요~?


로컬에 /etc/hosts에만 생성하면 무슨 의미가 있겠습니까~
전체 노드 (i.e. HPC나 web server farms이나..여러가지 목적으로~?) 배포를 해야 겠죠 
한줄만 수정합니다. 

host : nodes 로요~!
그러면 nodes에 해당 내용을 배포하고 적용해 버립니다 :) 

한번 볼까요~?



확인 확인~!!! 노드 01번에 접속해서 확인하니 잘 되네요 !!!



jinja2 template을 사용하면, 재사용성도 높이고, plain text 가공도 쉬워지고, 메인 코드를 줄일수 있고. 활용하기 나름이랍니다 :)


뿌잉뿌잉 :)  빠잉 입니다~!


[Continue reading...]

2017년 11월 19일 일요일

[Ansible] Template의 용도는? (1/2)

- 0 개의 댓글


앤서블을 하다 보면 Template은 처음에 상당히 생소한 개념이더라고요.
사실 알고보면 정말 별거 없는데....

가장 쉽게 설명하자면 파워포인트 템플릿이 있을 것입니다.
아래의 예제는 파워포인트에 내장되어 있는 비지니스 템플릿인데요
작성에 도움을 주기 위해 미리 지정되어 있는 걸 말하죠.

(출처 : http://meaningone.tistory.com/602)

이거랑 거의 1:1로 매칭 되는 개념이 앤서블의 Template입니다. 
즉 작성을 도움을 주기 위해 미리 지정되어 있는 서식 파일 같은 것입니다. 

사실 가장 template이 많이 쓰이는건..cfg 즉, 구성파일/환경 설정 파일을 가장 많이 사용합니다. 추후에 다루게 될텐데, 롤베이스로 해서 여러사람들이 사용하려면 각각에 사용환경에 맞게 구성 파일이 설정되어야 하는 경우가 있는데, 이때 여러가지의 환경 정보를 읽고 그에 맞게 cfg를 설정해서 적용할때 가장 많이 사용됩니다. 

그런데 이런건....배포하는 앤서블 패키지의 완성도를 높이려고 하는거고...
이를 위한 실습이나, 당장 사용에 목적에 부합하는 걸 찾아봐야 겠죠?

그래서 준비한 것은!!!

사골처럼 계속 우려먹는 nginx 입니다~
알다피시 nginx는 안되는 운영체제가 거의 없는 솔루션이다 보니..
설치 이후에 체크하는 방법도 운영체제에 따라 다르게 되죠. 

근데...저만 그런가..매번 헷깔리더라고요 -_-;

(이러지 맙시다, 우리는 운명공동체 / 동지동지!!)

그래서 맨 마지막에 각각 설치된 운영체제는 어떤건데, 이렇게 체크하는거야 라고 자동으로 알려주면 좋겠죠?

그런 목적으로 작성된 코드입니다~!

[ nginx_msg.yml ]

1
2
3
4
5
6
---
- hosts: nodes

  tasks:
    - name: How to check the status of nginx for each of OS.
      debug: msg="{{lookup('template','msg.j2').split('\n')}}"


[ msg.j2 ]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{% if ansible_distribution == 'Ubuntu' %}
   [ OS : Ubuntu ]
    >> dpkg -l | grep nginx
    OR
    >> service nginx status
{% elif ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' %}
   [ OS : CentOS ver7 ]
    >> yum list installed | grep nginx
    OR
    >> systemctl status nginx
{% elif ansible_distribution == 'CentOS' and ansible_distribution_major_version < '7' %}
   [ OS : CentOS ver6 ]
    >> yum list installed | grep nginx
    OR
    >> service nginx status
{% else %}
    >> service nginx status (* Gernally)
{% endif %}

참 특이한 점은 template은 jinja2라는 파이썬(주로 장고와 플라스크)에서 템플릿에서 사용하는 것을 차용해서 씁니다.
그래서 왠지 또 다른 언어를 배우는 느낌으로 짜야 되는...단점이 있긴 한데 말이죠..일단 많은 기능을 사용하지 않고, 스크립트 짜듯 짜도 되니 크게 신경 안 쓰셔도 될 것 같습니당!

결과는 어떻게 나오는지 확인하고 마쳐 볼까요~!



OS를 자동인식하고 조건에 맞게 출력해 주는 예제이며.. 상황에 따라 해당 template을 재 활용할 수 있고, 좀 더 조건을 세밀하게 조정한다면 더 다양한 상황에 맞게 동작하게 작성할 수 있겠네요.

template이 한번에 와 닫지 않을수 있으니, 다른 예제를 다음 시간에 한번 더 해볼께요.
빠잉!
[Continue reading...]

2017년 11월 18일 토요일

[Ansible] 동적으로 변수를 넣어 보아요~!

- 0 개의 댓글


저번 글([Ansible] 조건별로 nginx를 "한방에" 설치하기)에서는

fact에서 생성한 인자를 받아서, 그걸 다시 when이라는 조건을 걸어서 우분투나 센트OS를 설치했었죠~!!!

음...근데 솔직히 아름답지 않죠 무슨 뜻이냐면...세상에는 많은 종류의 OS가 있는데 이때 마다 3줄씩 추가해서 (아래처럼) 작성해야 한다는거거든요..
  - name: nginx for CentOS
    include_tasks: CentOS.yml
    when: ansible_distribution == 'CentOS'

모름지기 좋은 코드 혹은 좋은 내용이란 짧은 줄에 많은 내용을 담아야 하고, 그게 보기 좋아야 한다고...배웠거든요! 제가 하는 말이 아닙니다 그러니까 신뢰하셔도 되요



그래서 저쪽에서 중복되는 부분을 제거할꺼에요.
즉 CentOS? Ubuntu이렇게 생긴 부분인거죠.

이 부분을 변수 처리해서 현재의 ansible_distribution을 바로 인자로 쓸껀데, 이걸 하기 위해서는 조건문이라는 것을 써야 합니당.

개발자 분들이야 조건문이라는 말이 나오기 전부터 분기 해야 겠네 라고 생각하시겠지만요
(이 붕가는 아닙니다아 -_-;)


참 그리고 CentOS와 Ubuntu 같은 것을 변수 처리 하기 위해서 vars쪽에 선언해 주어야 합니다.

그러면 이번엔 특별히 바뀐 코드 부터 볼까요?
코드가 기존에 비하면 한결 간결....해져 보이겠죠...? 저만의 착각은 아니겠죠오~!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'Ubuntu' if ansible_distribution == 'Ubuntu' else 'CentOS' if ansible_distribution == 'CentOS' else 'Just Linux' }}"

  tasks:
  - name: nginx for Any Linux
    include_tasks: "{{ lnx_name }}.yml"


이걸 돌리면 이렇게 돌아간답니다.






[Continue reading...]
 
Copyright © . 엔지니어를 위한 파이썬 및 기술 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger