웹사이트 검색

관리형 노드에서 구성을 생성하기 위해 Ansible에서 템플릿을 생성하는 방법 - 7부


Ansible 시리즈의 7부에서는 Ansible에서 템플릿을 생성하고 사용하여 관리형 노드에서 사용자 정의 구성을 생성하는 방법을 알아봅니다. Ansible의 템플릿 작성은 플레이북 파일을 최소한으로 편집하면서 다양한 시스템을 실행하는 관리형 노드에 사용자 정의 구성을 푸시하는 쉽고 친숙한 방법입니다.

Ansible의 템플릿이란 무엇입니까?

템플릿이 무엇인지 더 잘 이해하기 위해 IT 관리자가 자신의 부서를 칵테일 파티에 초대하기 위해 이메일 초안을 작성하는 경우를 생각해 보겠습니다. 이메일은 각 회원에게 전송되며 배우자와 함께 태그하도록 초대합니다.

이메일은 본문은 동일하게 유지되지만 수신인과 배우자의 이름이 다르도록 맞춤 설정되었습니다. 이메일은 템플릿이 되고 수신자와 각 배우자는 변수가 됩니다.

그것은 일반적인 예였습니다. Ansible은 동적 콘텐츠나 표현식을 생성하는 데 사용되는 Python 프레임워크용 최신 템플릿 엔진인 Jinja2를 사용합니다. 템플릿은 여러 서버에 대한 사용자 정의 구성 파일을 만들 때 매우 유용하지만 각 서버마다 고유합니다.

Jinja2는 이중 중괄호 {{ ... }}를 사용하여 정의된 변수를 묶습니다. 주석에는 {{# #}를 사용하고 조건문에는 {% … %}를 사용하세요.

표시된 대로 해당 VLAN에 푸시하려는 호스트 시스템이 있는 네트워크에 VLAN의 데이터 모델이 있다고 가정해 보겠습니다.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

이 구성을 렌더링하려면 vlans.j2라는 해당 jinja2 템플릿이 다음과 같이 표시됩니다. 보시다시피 vlan.idvlan.name 변수는 중괄호로 묶여 있습니다.

vlan {{ vlan.id }}
  name {{ vlan.name }}

다양한 호스트 시스템을 배치하는 플레이북에 이 모든 것을 합치면 다음과 같이 표시됩니다.

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

예제 1: 다양한 Distros에서 웹 서버 구성

이 예에서는 CentOS 및 Ubuntu를 실행하는 2개의 웹 서버의 호스트 이름 및 OS에 대한 정보를 표시하는 index.html 파일을 생성합니다. .

설정

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Apache 웹 서버는 두 서버 모두에 이미 설치되어 있습니다.

CentOS 7의 경우

우분투 18.04의 경우

그럼 다음과 같이 플레이북 test_server.yml을 만들어 보겠습니다.

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Jinja 파일 템플릿은 index.html.j2이며 각 웹 서버의 index.html 파일로 푸시됩니다. jinja2 파일임을 나타내기 위해 항상 .j2 확장자를 끝에 두는 것을 기억하세요.

이제 템플릿 파일 index.html.j2을 만들어 보겠습니다.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

이 템플릿은 ansible_hostnameansible_os_family가 브라우저에 있는 개별 웹 서버의 해당 호스트 이름 및 운영 체제로 대체되는 내장 변수인 기본 HTML 파일입니다.

이제 플레이북을 실행해 보겠습니다.

ansible-playbook test_server.yml

이제 CentOS 7Ubuntu 웹 서버 모두에 대한 웹페이지를 다시 로드해 보겠습니다.

CentOS 7의 경우

우분투 18.04의 경우

보시다시피 호스트 이름과 OS 제품군에 대한 다양한 정보가 각 서버에 표시되었습니다. Jinja2 템플릿이 정말 멋지네요!

필터:

때로는 변수 값을 특정 방식으로 나타나는 문자열로 대체하기로 결정할 수도 있습니다.

예 1: 문자열을 대문자/소문자로 표시

예를 들어, 이전 예에서는 Ansible 변수가 대문자로 표시되도록 결정할 수 있습니다. 이렇게 하려면 변수에 upper 값을 추가하세요. 이렇게 하면 변수의 값이 대문자 형식으로 변환됩니다.

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

마찬가지로, 하위 인수를 추가하여 문자열 출력을 소문자로 변환할 수 있습니다.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

예 2: 문자열을 다른 문자열로 바꾸기

또한 문자열을 다른 문자열로 바꿀 수도 있습니다.

예를 들어:

영화 제목은 {{ movie_name }} =>입니다. 영화 제목은 Ring입니다.

출력을 다른 문자열로 바꾸려면 다음과 같이 바꾸기 인수를 사용하십시오.

영화 제목은 {{ movie_name | replacement (“Ring“, ”Heist ”) }} => 영화 제목은 Heist입니다.

예 3: 필터 나열 및 설정

배열에서 가장 작은 값을 검색하려면 min 필터를 사용하세요.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

마찬가지로, 가장 큰 숫자를 검색하려면 max 필터를 사용하세요.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

고유한 값을 표시하려면 고유 필터를 사용하세요.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

0과 값 사이의 임의의 숫자를 얻으려면 무작위 필터를 사용하세요.

{{ 50 | random }} =>  Some random number

루프:

프로그래밍 언어와 마찬가지로 Ansible Jinja2에도 루프가 있습니다.

예를 들어 숫자 목록이 포함된 파일을 생성하려면 아래 예와 같이 for 루프를 사용하세요.

예시 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

for 루프를 if-else 문과 결합하여 특정 값을 필터링하고 얻을 수도 있습니다.

예 2:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

이것이 이번 강의의 전부입니다. Ansible 변수와 사실을 다루는 다음 주제에 참여하세요.