Jinja2 是最强大和最著名的基于 python 的模板引擎之一。 由于相同的编程语言,它最受 Ansible 用户的欢迎。 它在很多方面帮助了很多 IT 人员。 Jinja2 模板能够访问 ansible 中的变量。 在 Ansible 中,需要对每个服务器进行大量更改,这会消耗大量时间。 因此,使用 jinja2 模板,可以仅将变量更改为该模板,从而节省大量时间和简单的环境。
在 ansible 中,使用 jinja2 模板来访问变量。 因此,一次根据需要更改变量可以帮助 ansible playbook 节省大量时间。 Jinja2 模板带有内置过滤器,用户只能在配置许多文件时操作这些过滤器以实现流畅的剧本。
它还有许多其他功能。 下面列出了其中一些。
- 调试目的非常简单
- 模板继承得到很好的支持
- 它非常快速且易于编译
在本文中,我们将讨论 jinja2 模板的使用和配置过程。
Jinja2 模板访问的变量
Jinja2 模板可以访问 ansible 中的变量。 在 ansible 控制节点上,编写一个 jinja2 模板文件,该文件可以方便地访问同目录或 playbook 中定义的变量。
我们要写一个 example 它显示了 jinja2 模板通过访问变量来访问和操作值。 在这里,剧本是 jinja2_var_example.yml
现在,让我们执行剧本 jinja2_var_example.yml
在这里,您可以注意到输出中的值发生了变化。 由于 {{ }} 也是 jinja2 模板的语法,它可以访问变量并将值更改为实际值。
其他 example 显示访问变量的 jinja2 模板。 在这里,我们将创建一个文件夹,然后编写一个 jinja2 模板“nginx.conf.j2”,因为 j2 是 jinja2 模板的扩展名。
$ mkdir jinja2_variable
$ cd jinja2_variable/
$ vim nginx.conf.j2
然后我们将使用 jinja2 模板编写一个使用变量的文件。 这些变量可以在不同的文件或剧本上定义,当时可以根据需要进行操作。
您一定已经注意到上面屏幕截图中的变量 {{ http_port }} 和 {{ http_host }}。
现在,我们将编写包含 jinja2 模板文件中包含的变量的实际值的剧本。
playbook成功执行后,变量将被目标路径文件中的实际值替换。
您可以注意到以下屏幕截图中的值发生了变化。
这些示例显示 jinja2 模板正在访问变量并在最终输出中显示实际值。
jinja2模板中的条件
jinja2 模板可以使用诸如 for 循环之类的条件语句。 循环有助于迭代范围、列表等中的项目。 在这里,我们正在编写一个 example 显示 jinja2 模板中使用的 for 循环。
为了 example,我们将编写我们的模板文件“server_hosts.j2”,如下图所示。
$ cat server_hosts.j2
输出:
{% for host in groups['all'] %} {{ hostvars[host].ansible_facts.default_ipv4.address }} {{ hostvars[host].ansible_facts.fqdn }} {{ hostvars[host].ansible_facts.hostname }} {% endfor %}
它将遍历清单中的所有主机。 对于每个主机,将显示模板中使用的所有变量的值。
在控制节点上,我们将编写一个剧本“conditional.yml”,其中包含上述 jinja2 模板文件。
$ sudo vim conditional.yml
现在,我们正在运行剧本“conditional.yml”
$ ansible-playbook conditional.yml
现在,我们可以在主机节点上看到 /etc/hosts 文件是否正在更新的结果。
这是我们在 jinja2 模板文件中的变量遍历清单中所有主机的最终结果。 所以像 for 循环这样的条件语句也可以在 jinja2 模板文件中使用。
jinja2 模板中使用的过滤器
如果您希望输出不同或格式化,您可以使用过滤器。 您可以使用参数对变量进行管道传输,如下所示。
{{ variable | argument }}
在这里,我们将编写一个 jinja2 模板文件“jinja_filters.j2”来显示 jinja2 模板文件上使用的过滤器。
$ vim jinja_filters.j2
我们将编写一个包含 jinja2 模板文件的剧本“filters.yml”。
$ vim filters.yml
现在,我们正在运行剧本“filters.yml”
现在,我们可以在主机节点上看到目标文件是否使用大写的内容创建的结果。
在这里,您可以看到所有文本都是大写的,因为我们通过将变量项通过管道传递给大写参数来使用过滤器。
结论
您可以根据需要使用此类 jinja2 模板文件来操作变量和数据,以节省时间并在 ansible 上顺利运行 playbook。 您还可以使用过滤器来处理从高到低的数字等。 尝试探索 jinja2 模板以获取更多功能。 谢谢!