使用jinja2模板部署自定义文件
jinja2简介
- 变量和逻辑表达式置于标记或分隔符之间
- 例如,jinja2模板将{% EXPR %}用于表达式或逻辑(如循环),而{{ EXPR }}则用于向最终用户输出表达式或变量的结果
- 后一标记在呈现时将被替换为一个或多个值,对最终用户可见
- 使用{# COMMENT #}语法括起不应出现在最终文件中的注释
一下举例演示copy和template
//在playbook下创建目录files,在files下有创建host.j2文件,编辑hosts.j2
[root@192 files]# vim hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{# 这是一个注释,看不到#}
{{ ansible_facts['default_ipv4']['address'] }}
//编辑playboook,用copy模块测试
[root@192 playbook]# vim test.yml
---
- hosts: 192.168.218.128
tasks:
- name: test
copy:
src: files/hosts.j2
dest: /etc/hosts
//检查
[root@192 playbook]# ansible-playbook test.yml
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{# 这是一个注释,看不到#}
{{ ansible_facts['default_ipv4']['address'] }}
//copy模块把你写入的东西完全搬运到对面的相应的文件
//使用templete模块,hosts.j2里面的内容一致
//编辑playboook,用template模块测试
[root@192 playbook]# vim test.yml
---
- hosts: 192.168.218.128
tasks:
- name: test
template:
src: files/hosts.j2
dest: /etc/hosts
//执行检查
[root@192 playbook]# ansible-playbook test.yml
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.218.128
//template匹配到获取的事实并显示,注释的部分不显示
管理模板文件
- 为避免系统管理员修改Ansible部署的文件,最好在模板顶部包含注释,以指示不应手动编辑该文件
距离演示加注释:
//编辑hosts.j2文件
[root@192 files]# vim hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# {{ ansible_managed }}
//检查查看
[root@192 playbook]# ansible-playbook test.yml
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# Ansible managed //效果
控制结构
用户可以在模板文件中使用jinja2控制结构,以减少重复输入,为play中的每个主机动态输入条目,或者有条件地将文本插入到文件中。
使用循环
- jinja2使用for语句来提供循环功能
以下举例,user变量替换为users变量中包含的所有值,一行一个值。
//在vars下创建user.yml并编辑
[root@192 vars]# vim user.yml
name:
- tom
- jerry
- lisi
- wangwu
//在files下创建test.j2,编辑
[root@192 files]# vim test.j2
{% for user in name %}
{{ user }}
{% endfor %}
//编辑playbook
[root@192 playbook]# vim test.yml
---
- hosts: 192.168.218.128
gather_facts: no
vars_files:
vars/user.yml
tasks:
- name: test
template:
src: files/test.j2
dest: /tmp/abc
//检查结果
[root@localhost tmp]# cat abc
tom
jerry
lisi
wangwu
//一行一行显示
//可以在变量下加你想要的东西并显示,现在测试一下
[root@192 files]# vim test.j2
{% for user in name %}
{{ user }}
我想加东西
{% endfor %}
//执行检查
[root@192 playbook]# ansible-playbook test.yml
[root@localhost tmp]# cat abc
tom
我想加东西
jerry
我想加东西
lisi
我想加东西
wangwu
我想加东西
//可以在循环里加判断,以下测试演示不显示tom
[root@192 files]# vim test.j2
{% for user in name if not user == "tom" %}
{{ user }}
我想加东西
{% endfor %}
//执行检查
[root@192 playbook]# ansible-playbook test.yml
[root@localhost tmp]# cat abc
jerry
我想加东西
lisi
我想加东西
wangwu
我想加东西 //没有显示关于tom的部分
//如果是想单独显示那一部分就使用if,不想显示就使用if not
- 不需要用{{}}引用变量的场景:
- debug模块里面的var参数
- playbook中用when判断条件时
- 模块文件中定义的时候{%%}
变量过滤器
- jinja2提供了过滤器,更改模板表达式的输出格式(例如,输出到果JSON)
- 有适用于YAML和JSON等语言的过滤器
- to_json过滤器使用JSON格式化表达式输出,to_yaml过滤器则使用YAML格式化表达式输出
{{ output | to_json }}
{{ output | to_yaml }}
但是上述方法输出的时候不够美观,也有其他的过滤器,如to_nice_json和to_nice_yaml过滤器,这种方法输出的相对美观一些,它们将表达式输出格式化为JSON或YAML等人类可读格式
{{ output | to_nice_json }}
{{ output | to_nice_yaml }}
//编辑test.j2
[root@192 files]# vim test.j2
{% if " " %} //" "双引号之间有空格
{{ name }} //变量
{% endif %}
//查看变量的内容
[root@192 vars]# vim user.yml
name:
- tom
- jerry
- lisi
- wangwu
//执行并输出
[root@192 playbook]# ansible-playbook test.yml
[root@localhost tmp]# cat abc
['tom', 'jerry', 'lisi', 'wangwu']
//使用过滤器
[root@192 files]# vim test.j2
{% if " " %}
{{ name | to_nice_json }}
{% endif %}
//执行查看
[root@192 playbook]# ansible-playbook test.yml
[root@localhost tmp]# cat abc
[
"tom",
"jerry",
"lisi",
"wangwu"
]
//to_noce_json就看起来更美观一些
|