Ansible 配置文件变量 Jinja2

1.什么是Jinja2

jinja2是Python的全功能模板引擎

2.Jinja2与Ansible的关系

Ansible通常会使用jinja2模板来修改被管理主机的配置 文件等…在saltstack中同样会使用到jinja2
Ansible想要识别配置文件中的变量、判断、循 环,只能使用Jinja2语法

3.Ansible如何使用Jinja2

将原本推送配置文件的[copy]模块换成[template]模块即可
[template]模块就是一个能识别Jinja2语法模块
注意事项

Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。

注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。

#ansible playbook模板:
判断:when
循环:with_items

#Jinja2模板:
判断:if
循环:for while

4.Jinja2语法

注释和调用变量
# 注释
{# 注释内容 #}

# 调用变量
{{ 调用变量 }}
判断
{# Jinja2:判断 #}
{% if ansible_hostname == 'web01' %}
    echo 1
{% endif %}

{% if ansible_hostname == 'web01' %}
    echo 1
{% else %}
    echo 2
{% endif %}

{% if ansible_hostname == 'web01' %}-
    echo 1
{% else if ansible_hostname == 'web02'%}
    echo 2
{% else %}
    echo 3
{% endif %}
拓展:shell:判断
if [ ansible_hostname == 'web01' ];then
    echo 1
    echo 2
    echo 3
fi

if [];then
    echo 1
    else
    echo 2
fi

if [];then
    elif [];then
    else
fi
拓展: python:判断
if ansible_hostname == 'web01':
    print 1
    print 2

if xxx:
    else
if xxx:
    elif
循环
{# 循环 #}
{% for n in range(1,11) %}

循环体
{% endfor %}
拓展:shell:循环
for xxx in xxx;do
    循环体
done

for ip in 5 6 7 8;do
    echo 172.16.1.$ip
done

for num in `seq 10`;do
    echo $num
done

5.Jinja2实战keepalived

## if判断
global_defs {
    router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
    {% if ansible_hostname == 'web01' %}
        state MASTER
        priority 150
    {% else %}
        state BACKUP
        priority 100
        {% endif %}
        interface eth0
        virtual_router_id 50
        advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
        }
    virtual_ipaddress {
        10.0.0.3
        }
}
- hosts: all
  tasks:
  - name: 推送keepalived master配置文件
    template:
    src:/opt/ansible/keepalived/keepalived.conf
    dest: /usr/keepalived.conf
# 直接调用变量(使用变量进行计算,然后使用int转成整型)
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip_name_resolve
symbolic-links=0
innodb_buffer_pool_size={{
(ansible_memtotal_mb * 0.8)|int }}
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
# 直接调用变量(字符串切片)
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip_name_resolve
symbolic-links=0
server_id={{ ansible_hostname[-1] }}
innodb_buffer_pool_size={{
(ansible_memtotal_mb * 0.8)|int }}
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

6.Jinja2实战循环负载均衡配置文件

upstream {{ lb_name }} {
{% for num in range(7,10) %}
    server 10.0.0.{{ num }}
{% endfor %}
}

server{
    listen 80;
    server_name {{ wordpress_domain }};

    location / {
        proxy_pass http://{{ lb_name }}
    }
}

- hosts: all
  tasks:
  - name: 推送keepalived master配置文件
    template:
    src:/opt/ansible/nginx_php/lb.conf
    dest: /opt/lb.conf