====== Templates ======
Templates são arquivos de configuração com conteúdo dinâmico, que substitui diversos arquivos estáticos em uma infraestrutura com um grande número de servidores.
Através de Templates precisamos apenas de um único arquivo que leva entradas dinâmicas, que são específicos para o host que está sendo executado.
Templates utilizam Jinja2 que é uma linguagem de modelagem moderna para o designer que utiliza Python. Os arquivos de templates podem conter variáveis com base no template Jinja2 do Python.
===== Tipos de Templates =====
Tipos de tags que os templates Jinja2 aceitam:
* **{ { } }:** Incorpora variáveis dentro de um template e imprime seu valor no arquivo resultante. Este é o uso mais comum de um template;
* **{% %}:** Incorpora declarações de código dentro de um template, por exemplo, para um loop. Ele incorpora as declarações if-else, que são avaliadas em tempo de execução, mas não são impressas.
**Exemplos de Tags:**
Incorporar variáveis:
{{ pacotes_php }}
Incorporar declarações:
{{ ansible_default_ipv4 }}
===== Gerenciar Roles com templates =====
$ cd /etc/ansible/roles
$ sudo ansible-galaxy role init balancer
- Role balancer was created successfully
$ sudo ansible-galaxy role list
# /etc/ansible/roles
- balancer, (unknown version)
- conf-base, 1.0.0
- nfs-server, 1.0.0
$ sudo cp -r ~/roles/balancer/* balancer/
$ sudo cp -r ~/roles/balancer/*.* balancer/
**Conteúdo do diretório tasks:**
- **main.yml:** Arquivo principal responsável em carregar os arquivos install.yml e configure.yml;
- **install.yml:** Arquivo responsável pela instalação do Nginx;
- **configure.yml:** Arquivo responsável pela configuração do Nginx.
Arquivo main.yml:
$ cat balancer/tasks/main.yml
---
- name: Define instalacao do servidor Nginx
import_tasks: install.yml
- name: Define configuracao do servidor Nginx
import_tasks: configure.yml
**Arquivo install.yml:**
$ cat balancer/tasks/install.yml
---
- name: Instala servidor Nginx no Debian/Ubuntu
when: ansible_os_family == "Debian"
apt:
name: nginx
state: present
update_cache: true
notify:
- Start Nginx
tags: balancer
- name: Instala servidor Ngin no RedHat/CentOS
when: ansible_os_family == "RedHat"
yum:
name: nginx
state: present
notify:
- Start Nginx
tags: balancer
- name: Inicia e ativa na inicializacao o servico nginx
when: ansible_os_family == "RedHat"
systemd:
name: nginx
state: started
enabled: true
tags: balancer
**Arquivo configure.yml:**
$ cat balancer/tasks/configure.yml
---
- name: Define o arquivo de configuracao do servidor Nginx no Debian/Ubuntu
when: ansible_os_family == "Debian"
template:
src: nginx-debian.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify:
- Restart Nginx
tags: balancer
- name: Define o arquivo de configuracao do servidor Nginx no RedHat/CentOS
when: ansible_os_family == "RedHat"
template:
src: nginx-redhat.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify:
- Restart Nginx
tags: balancer
FIXME Quando você utiliza o módulo template, é preciso adicionar a extensão ''.j2'' nos arquivos de origem. Exemplo: ''nginx-debian.conf.j2''.
**Conteúdo do diretório meta:**
$ cat balancer/meta/main.yml
---
galaxy_info:
role_name: balancer
author: 4Linux DevOps
description: Instalacao e Configuracao do servidor Nginx Load Balancer
company: 4Linux
license: GPLv3
min_ansible_version: 2.9
platforms:
- name: Ubuntu
versions:
- focal
- name: EL
versions:
- 8
galaxy_tags:
- balancer
dependencies:
- conf-base
**Conteúdo do diretório handlers:**
$ cat balancer/handlers/main.yml
---
- name: Start Nginx
service:
name: nginx
state: started
- name: Restart Nginx
service:
name: nginx
state: restarted
**Conteúdo do diretório templates:**
$ cat balancer/templates/nginx-redhat.conf.j2
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
upstream cluster {
server {{ webserver01 }} weight=1;
server {{ webserver02 }} weight=1;
}
server {
listen {{ ansible_enp0s8.ipv4.address }}:80;
server_name www.dexter.com.br dexter.com.br;
location / {
proxy_pass http://cluster;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers 8 32k;
default_type "text/html; charset=utf-8";
error_page 501 502 404 405 = @fallback;
}
location @fallback {
proxy_pass http://cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
**Conteúdo do diretório defaults:**
**Arquivo main.yml**
$ cat balancer/defaults/main.yml
---
ol-vm-02: 10.240.0.202
de-vm-03: 10.240.0.203
Para finalizar, é preciso criar um arquivo responsável em carregar a Role e definir em qual máquina ela será aplicada.
$ cat ~/roles/playbooks/balancer.yml
---
- hosts: ol-vm-02
vars:
ansible_python_interpreter: /usr/bin/python3.9
roles:
- balancer
$ sudo ansible-playbook --syntax-check ~/roles/playbooks/balancer.yml
$ sudo ansible-playbook ~/roles/playbooks/balancer.yml