This is an old revision of the document!
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:
- { { } }: 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
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
