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

  1. .j2sufijo del archivo jinja2 , no puede escribir el sufijo.
  2. 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

Supongo que te gusta

Origin blog.csdn.net/qq_30566629/article/details/111842207
Recomendado
Clasificación