Herramienta de operación y mantenimiento automático Ansible-Jinja2
1. Introducción al fondo de la plantilla Ansible Jinja2
El archivo de configuración actual de Nginx es el mismo en todos los servidores, pero espero personalizar el proceso de inicio del servicio de acuerdo con el rendimiento de cada servidor.
Al mismo tiempo, personalice el encabezado de respuesta de cada servicio de Nginx, de modo que cuando un determinado servicio tenga un problema, pueda localizar rápidamente un servidor específico.
Hacer este tipo de personalización seguramente causará un problema. Nginx tiene diferentes archivos de configuración en cada servidor físico. ¿Cómo administrar dichos archivos de configuración?
Obviamente no es apropiado usar el módulo de copia para la administración. En este momento, use otra función de plantilla proporcionada por Ansible, que puede ayudarnos a resolver el problema a la perfección.
Dos, plantilla JinJa2
1. ¿Qué es JinJa2?
Jinja2 es un motor de plantillas escrito basado en Python. La función es similar a la plantilla Smarty de PHP.
2. JinJa2 debe saber y saber
.j2
sufijo del archivo jinja2 , no puede escribir el sufijo.- Hay tres tipos de delimitadores en jinja2
- Comentario: {# Comment content #}
- Referencia de variable: { {var}}
- Expresión lógica: (%%)
3. Control lógico JinJa2
3.1 Expresión condicional
{% if 条件表达式 %}
条件表达式为真,显示的内容
{% elif 条件表达式 %}
条件表达式为真,显示的内容
{% else %}
...
{% endif %}
Ejemplo
{# 如果定义了 idc 变量, 则输出 #}
{% if idc is defined %}
{
{ idc }}
{% else %}
没有定义
{% endif %}
3.2 Control de bucle
{% for %}
...
...
{% endfor %}
Ejemplo
{# 列举出 dbservers 这个 group 中的所有主机 #}
{% for host in groups['dbservers'] %}
{
{ host }}
{% endfor %}
{#与Python 语法不通,模板中的循环内不能break或continue。但你可以在迭代中过滤序列来跳过某些项#}
{#打印dbservers 组中的所有主机,但是不打印1.1.1.1 这台主机#}
{% for host in groups['dbservers'] if host != "1.1.1.1" %}
{
{host}}
{% endfor %}
Tres, cómo usar la plantilla
Una instancia de Jinja2 basada en hechos
# cat config.j2
{# use variable example #}
wlecome host {
{ ansible_hostname }}, os is {
{ ansible_os_family }}
today is {
{ ansible_date_time.date }}
cpucore numbers {
{ ansible_processor_vcpus }}
{# use condition example #}
{% if ansible_processor_vcpus > 1 %}
OS CPU more than one core
{% endif %}
{% for m in ansible_mounts if m['mount'] != "/" %}
mount {
{ m['mount'] }}, total size is {
{m['size_total']}}, free size is {
{m['size_available']}}
{% endfor %}
Usando plantillas en Ansible
---
- name: a template example
hosts: all
remote_user: root
tasks:
- name: update jinja2 config
template: src=config.j2 dest=/tmp/config.conf
Cuatro, demostración de ejemplo
Se han introducido las plantillas Jinja2 y cómo usar las plantillas en Ansible. Entonces, ¿cómo satisfacer nuestras necesidades?
# cat nginx.conf.j2
user nginx;
{# start process equal cpu cores #}
worker_processes {
{ ansible_processor_vcpus }};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
keepalive_timeout 0;
gzip on;
gzip_min_length 1k;
gzip_buffers 8 64k;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css application/json application/xml application/x-shockwave-flash application/javascript image/svg+xml image/x-icon;
gzip_vary on;
{# add_header {
{ ansible_hostname }}; #}
add_header x-hostname {
{ ansible_hostname }};
include /etc/nginx/conf.d/*.conf;
}
Continuar optimizando nuestro PlayBook y hacer que admita plantillas
- name: template playbook example
hosts: webservers
vars:
createuser:
- tomcat
- www
- mysql
tasks:
- name: create user
user: name={
{ item }} state=present
with_items: "{
{ createuser }}"
- name: yum nginx webserver
yum: name=nginx state=present
# use ansible template
- name: update nginx main config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
tags: updateconfig
notify: reload nginx server
- name: add virtualhost config
copy:
src: www.qfedu.com.conf
dest: /etc/nginx/conf.d/
tags: updateconfig
notify: reload nginx server
- name: check nginx syntax
shell: /usr/sbin/nginx -t
register: nginxsyntax
tags: updateconfig
- name: check nginx running
stat: path=/var/run/nginx.pid
register: nginxrunning
tags: updateconfig
- name: print nginx syntax
debug: var=nginxsyntax
- name: start nginx server
service: name=nginx state=started
when:
- nginxsyntax.rc == 0
- nginxrunning.stat.exists == false
handlers:
- name: reload nginx server
service: name=nginx state=started
when:
- nginxsyntax.rc == 0
- nginxrunning.stat.exists == true
La ejecución aún se puede ejecutar de la forma original.
ansible-playbook -i hosts site.yml