Table of Contents

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:

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:

  1. main.yml: Arquivo principal responsável em carregar os arquivos install.yml e configure.yml;
  2. install.yml: Arquivo responsável pela instalação do Nginx;
  3. 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