template
目录
当需要批量处理被控机上配置文件中的内容时,template可以为对应配置文件创建模板,并把时常变化的内容修改为变量,根据各个被控机的具体情况来确定变量的具体值。
- Jinja2
说template之前,先说下Jinja2。
Jinja2是Python下一个被广泛应用的模版引擎
其基本语法:
- 控制结构(表达式):{% %}
- 变量取值:{{ }}
- 注释: {# #}
ansilbe中template是基于Jinja2来使用的,所以以上语法在template中都有效
template注释
*注释的语法为:{##}
其作用主要是对模板文件进行内容说明,在执行playbook时,注释内容不用传递到被控机上。只能在主控机上查看。
例:
{# yum #}
[{{ Name_1 }}]
name=[{{ name_1 }}]
baseurl=ftp://host.domain8.rhce.cc/dvd/{{ localtion_1 }}
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese
[root@localhost html]# cat /etc/yum.repos.d/test.repo 执行playbook后,发现文件中并没有注释
[EX294_BASE]
name=[EX294 base software]
baseurl=ftp://host.domain8.rhce.cc/dvd/BaseOS
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese
ansible_managed(配置文件内置变量)
ansible_managed为ansible配置文件中的变量,默认值为:ansible_managed = Ansible managed
此变量也是对文件进行说明,但与注释不一样的是,ansible_managed为变量,在被控机中可以查看。
我们可以自定义ansible_managed值。
......
# in some situations so the default is a static string:
#ansible_managed = Ansible managed
ansible_managed = '此文件由template生成,请不要随意修改' 自定义ansible_managed的值
[root@localhost html]# cat /etc/yum.repos.d/test.repo 对此文件进行说明
此文件由template生成,请不要随意修改
[EX294_BASE]
name=[EX294 base software]
baseurl=ftp://host.domain8.rhce.cc/dvd/BaseOS
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese
template表达式
表达式或控制块的语法为:{%%}
template——for循环
除了在playbook中进行loop循环外,我们也可以在模板文件中进行内容循环。
变量 {{ loop.index }} 可以代表循环的索引次数号
[root@localhost project2]# vim template/test.j2
{% for x in users %} 把变量x置于users变量中,让x来遍历users中的值
{{ loop.index,x }}
{% endfor %}
[root@localhost project2]# !vim
vim test.yml 执行playbook
---
- name: test
hosts: 192.168.190.133
vars_files:
files/vars 指定变量文件
tasks:
- name:
template:
src: template/test.j2
dest: /
[root@localhost html]# vim /test.j2 查看被控机文件
(1, 'zhangsan')
(2, 'lisi')
(3, 'wangwu')
template——if条件
满足条件下才打印下面的变量
vim template/test.j2
{% if ansible_facts.distribution == "RedHat" %} 如果被控机事实中的系统变量为RedHat,则打印变量result.
{{ result }}
{% endif %}
template—— 变量过滤器
变量过滤器的作用是使传递的数据进行修饰后者筛选,从而使结果展示的更加简洁与明了。过滤器通过竖线符号(|)与变量分开
常用变量过滤器
过滤器名 | 说明 |
---|---|
safe | 不转义,将此值标记为安全 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 把值中所有的 HTML 标签都删掉 |
tojson/to_nice_json | 值返回为json格式 |
toyaml/to_nice_yaml | 值返回为yaml格式 |
例:
{{ ansible_facts.default_ipv4 | to_nice_yaml }} 将事实中的地址信息转换为yaml格式
[root@localhost /]# vim test.txt 执行playbook后,到被控机器上查看
address: 192.168.190.133
alias: ens33
broadcast: 192.168.190.255
gateway: 192.168.190.2
interface: ens33
macaddress: 00:0c:29:93:80:cf
mtu: 1500
netmask: 255.255.255.0
network: 192.168.190.0
type: ether
过滤器可以连续使用
{{ ansible_facts.default_ipv4 | to_nice_yaml | title }} 将值转为yaml格式后把每个单词的首字母大写
[root@localhost /]# cat test.txt
Address: 192.168.190.133
Alias: Ens33
Broadcast: 192.168.190.255
Gateway: 192.168.190.2
Interface: Ens33
Macaddress: 00:0c:29:93:80:cf
Mtu: 1500
Netmask: 255.255.255.0
Network: 192.168.190.0
Type: Ether