模板是一个文本文件,可以做为生成文件的模版。模板文件中还可嵌套jinja2语法。
jinja2语言
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
特性
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试,异常的行数直接指向模板中的对应行
- 可配置的语法
jinja2 语言支持多种数据类型和操作
字面量,如: 字符串:使用单引号或双引号,数字:整数、浮点数
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and,or,not
流表达式:For,If,When
template
template可以根据和参考模块文件,动态生成相类似的配置文件。
template文件必须存放在templates目录下,并且以 .j2 结尾。
yaml/yml 文件需和templates目录平级,目录结构如下示例
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
范例
利用template 同步nginx配置文件
首先,在templates目录下创建nginx.conf.j2文件
user nginx;
worker_processes {{ ansible_processor_vcpus }};
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
}
http {
charset utf-8;
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;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
创建nginx.yml同步nginx配置文件
---
#nginx.yml
- hosts: webservers
tasks:
- name: Create nginx config file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: Restart service
handlers:
- name: Restart service
service: name=nginx state=restarted
执行命令后,远程主机配置文件的worker_processes的值动态地变成了CPU的核数(这里是4核)
worker_processes 4;
template还支持算数运算,例如上述模板文件可以写成
worker_processes {{ ansible_processor_vcpus+2 }};
流程控制for和if
template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能。
for循环
格式
{% for i in EXPR %}
...
{% endfor %}
示例
{% for i in range(1,10) %}
server_name web{{i}};
{% endfor %}
范例
模板文件nginx2.conf.j2
{% for port in ports %}
listen {{ port }}
{% endfor %}
playbook文件nginx2.yml
---
#nginx1.yml
- hosts: webservers
vars:
ports:
- 80
- 81
- 82
tasks:
- name: template config
template: src=nginx2.conf.j2 dest=/tmp/nginx2.conf
命令结果
[root@frog448 ~]#cat /tmp/nginx2.conf
listen 80
listen 81
listen 82
if 条件判断
在模版文件中还可以使用 if条件判断,决定是否生成相关的配置信息
范例
模板文件nginx3.conf.j2
{% for vhost in vhosts %}
server {
listen {{ vhost.port }};
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }};
{% endif %}
root {{ vhost.root }};
}
{% endfor %}
playbook文件nginx3.yml
---
- hosts: webservers
vars:
vhosts:
- port: 80
root: /var/www/html1/
- port: 81
server_name: frog2.com
root: /var/www/html2/
- port: 82
server_name: frog3.com
root: /var/www/html3/
tasks:
- name: Create nginx config file
template: src=nginx3.conf.j2 dest=/tmp/nginx3.conf
命令执行结果
[root@frog448 ~]#cat /tmp/nginx3.conf
server {
listen 80;
root /var/www/html1/;
}
server {
listen 81;
server_name frog2.com;
root /var/www/html2/;
}
server {
listen 82;
server_name frog3.com;
root /var/www/html3/;
}