Jinjia2模板
前面说到playbook组成的时候,有介绍到template模块,而template模块对模板文件进行渲染时,使用的就是jinja2模板引擎,jinja2本身就是基于python的模板引擎,所以下面先来了解一下jinjia2模板的一些用法
基础语法
{{ }} 用来装载表达式,比如变量、运算表达式、比较表达式等。
(% %)用来装载控制语句,比如 if 控制结构,for循环控制结构。
(# #)用来装载注释,模板文件被渲染后,注释不会包含在最终生成的文件中。
该模板支持的一些数据类型和表达式
字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[list1, list2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:
+, -, *, /, //, %, **
比较操作:
==, !=, >, >=, <, <=
逻辑运算:
and, or, not
条件判断
Jinjia2模板本身就是基于python的,所以它if语句也支持多条件判断,嵌套等
与python一样,具有if(如果),elif(在如果),else(否则),只不过结尾变成了endif表示条件的结束
常见的缩进方式为4格,也可以使用 2 个空格或制表符,但要保持一致。
单条件:
{% if 表达式 %}
执行的内容
{% endif %}
双条件:
{% if 表达式 %}
执行内容
{% else %}
执行内容
{% endif %}
多条件:
{% if 表达式 %}
执行内容
{% elif 表达式 %}
执行内容
{% else %}
执行内容
{% endif %}
嵌套:
{% if 表达式 %}
执行的内容
{% if 表达式 %}
执行内容
{% else %}
执行内容
{% endif %}
{% endif %}
循环
循环同样也具有条件判断的类似操作,这里就不过多举例了。
可以使用{% for %}和{% endfor %}块来实现一个基本的循环。
{% for i in 表达式 %}
执行内容
{% endfor %}
需要注意的是ansible默认不支持break(跳出循环)和continue(继续)的。
其他控制结构
你会发现jinjia2模板没有函数,但是,jinjia2模板有类似函数的用法,叫做宏,主要用于在模板渲染过程中生成动态的内容。一般有两种用法定义{% macro %}和调用{% call %},jinjia2还支持其他的控制结构如{% include %}用于包含其他模板文件。
定义宏:
{% macro one(text = '这是一段默认文本') %}
{{ text }}
{% endmacro %}
这里one是宏的名称,text为参数,{{text}}则是宏输出的内容
过滤器
Jinja2也支持过滤器,可以使用过滤器来对变量进行操作。
Lookup过滤器
在 Ansible 中,lookup过滤器是一种强大的工具,用于从外部数据源检索数据。
语法格式:{{ lookup(‘插件名称’, ‘插件参数’)}}
常用插件:
file: 用于读取配置文件、脚本、密钥文件等各种文件类型的内容。
env: 用于获取环境变量的值
password: 用于从密码存储(如ansible-vault)中获取密码
#获取/etc/testfile文件内容
{{ lookup('file','/etc/testfile') }}
#获取PATH环境的变量值
{{ lookup('env','PATH') }}
Default过滤器
default过滤器用于在变量未定义或者为假(例如空字符串、False、None、空列表等)的情况下提供一个默认值。
Set是用来设置变量的,想当于声明一个变量
如果variable变量未定义,那么就会把”定义的变量”这个值赋予给它
set default_value=”定义的变量”
database_host:{{ variable | default("default_value") }}
template模块
template模块与copy模块的用法十分类似,只是更多用于jinja2模板的渲染,也就是模板文件中可以引用变量,实现对不同主机有定制化的配置。
参数 | 解析 |
src | 指定本地jinja2模板文件的位置 |
dest | 指定目标远程主机路径 |
backup | 指定是否备份,默认值no |
mode | 设置权限 |
user | 设置用户 |
group | 设置用户组 |
Jinjia2模板示例
jinjia2模板好用的地方在于它支持多种文件可以是html,xml,conf等等,这就极大的方便用template模块使用jinjia2模板对一些服务的配置文件进行修改
安装redis服务:
把需要修改的配置信息写入模板中
[root@web01 ansible]# cat redis.conf.j2
bind {{ ansible_host }} 127.0.0.1 # 引用了facts组件内置变量
port {{ redis_port }} #这是play文件里定义的变量
protected-mode no
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
编写play文件
[root@web01 ansible]# cat redis.yml
---
- name: 部署redsi服务
hosts: web01
vars:
redis_port: 6379 #指定redis的端口
tasks:
- name: install redis
yum:
name: redis
state: present
- name: start redis
service:
name: redis
state: started
notify: restart
- name: upload redis.conf
template:
src: /etc/ansible/redis.conf.j2
dest: /etc/redis.conf
handlers:
- name: restart
service:
name: redis
state: restarted
执行命令
[root@web01 ansible]# ansible-playbook redis.yml
查询配置文件是否修改
[root@web01 ansible]# grep [^a-Z$] /etc/redis.conf
bind 192.168.143.161 127.0.0.1
port 6379
protected-mode no
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
可以看到此时配置文件和我们模板中写的配置文件内容一致