[toc]

Ansible Jinja2模板概述

什么是jinja2模板

jinja2是Python的全功能模板引擎

  • Jinja2与Ansible啥关系
    • Ansible通常会使用jinja2模板来修改被管理主机的配置文件等,在saltstack中同样会使用到jinja2
  • Ansible如何使用Jinja2
    • 使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。
    • 之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是,不变,如果使用template,则会变成对应的主机名。
  • Ansible使用Jinja2注意事项
    • Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。 注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。

Ansible Jinja2模板使用

Jinja2基本语法

  1. 输出变量值,会输出自定义的变量值或facts
  2. playbook文件使用template模块
  3. 模板文件里面变量使用,比如或使用facts

Jinja2逻辑判断

1
2
3
4
5
6
7
8
9
10
11
12
# 循环表达式
{% for i in EXPR %}
{% endfor %}

# 条件判断
{% if EXPR %} # 第一个条件
{% elif EXPR %} # 第二个条件
{% else %} # 剩余的条件
{% endif %} # 结束

# 注释
{# COMMENT #}

jinja2示例

jinja2部署keepalived

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 使用jinja2推送keepalive配置文件
vim keepalive.yml
global_defs {
router_id {{ ansible_hostname }}
}
{% if ansible_hostname == 'web01' %}
vrrp_script check_web_zls {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
track_script {
check_web_zls
}
priority 150
state MASTER
{% else %} # 这是不同的部分
vrrp_instance VI_1 {
priority 100
state BACKUP
{% endif %} # 相同的部分在判断之外,就是全部都推
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}

# config.keelalived.yml
- name: 推送keepalived配置文件
template:
src: /root/wordpress_ansible/keepalived/keepalived.j2
dest: /tmp/keepalived.conf
notify: Restart keepalived
tags: test_keep

# test1.yml
- hosts: all
tasks:
- include: /root/wordpress_ansible/keepalived/config.keepalived.yml
when: ansible_hostname is match 'web*'

handlers:
- name: Restart keepalived
service:
name: keepalived

jinja2部署负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream {{ wordpress_domain }} {
{% for num in range(7,10) %}
server 172.16.1.{{ num }};
{% endfor %}
}
server{
listen 80;
server_name {{ wordpress_domain }};

location{
proxy_pass http://{{ wordpress_domain }};
}
}