金鱼哥说Ansible:第六章 在被管理节点上创建文件和目录---jinja2模板
让Ansible使用jinja2模版部署自定义文件就这么简单
jinja2模板如果往深学习,也是另一个体系的东西,在Ansible中,我们只需要学习常用的调度已足够工作中所使用。
1. Jinja2 模板概述
官网地址(中文网站)
http://docs.jinkan.org/docs/jinja2/
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
2. Ansible Jinja2模板背景介绍
目前Nginx的配置文件在所有的服务器上都是相同的,但我希望能根据每一台服务器的性能去定制服务的启动进程。
同时定制每一台Nginx服务的响应头,以便于当某台服务出现问题时能快速定位到具体的服务器。
要做这样的定制势必会导致一个问题,Nginx 在每台物理服务器上的配置文件都不一样,这样的配置文件如何管理呢?
再使用copy 模块去做管理显然已经不合适。此时使用Ansible 提供的另一个模板(template) 功能,它可以帮助我们完美的解决问题。
3. Ansible 如何使用 jinja2 模板
Ansible 使用 jinja2 模板,也就是 template 模板。该模块和 copy 模块一样,都是将文件复制到目标机器,但是区别在于 template 模块可以获取要复制文件中的变量的值,而 copy 则是原封不动的把文件内容复制过去。
实际运用,比如:针对不同的主机定义不同的变量,template 会在将文件分发前读取变量到 jinja2 模板,之后再然后分发到不同的被管理主机上。
4. Jinja2 常用语法
Jinja2是基于Python书写的模板引擎。功能比较类似于PHP的smarty模板。
1)要想在配置文件中使用jinja2,playbook中的tasks 必须使用template模块
2)模板配置文件里面使用变量,比如 {{ PORT }} 或使用 {{ facts 变量 }}
5. 基本语法
jinja2 文件以 .j2 为后缀, 也可以不写后缀。
jinja2 中存在 三种定界符
-
注释: {# 注释内容 #}
-
变量引用: {{ var }}
-
逻辑表达: {% %}
注释
{# … #}:要把模板中一行或多行注释掉,默认的注释语法。
赋值
为变量赋值,优先级高于 playbook 中的优先级。
{% set username = 'zhang' %}
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
变量
{{ … }}:把表达式的结果打印到模板上。
你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [] )。如下示例:
{{ foo.bar }}
{{ foo['bar'] }}
示例:{{ a_variable }}、{{ foo.bar }}、{{ foo[‘bar’] }}
花括号不是变量的一部分,而是打印语句的重要一部分。
6. 条件判断
Jinja 中的 if 语句可比 Python 中的 if 语句。
在最简单的形式中,你可以测试一个变量是否未定义,为空或 false:
简单形式:
{% if 条件表达式 %}
……
{% endif %}
多分支形式:
{% if 条件表达式 %}
……
{% elif 条件表达式 %}
……
{% else %}
……
{% endif %}
例如:
{# 如果定义了 idc 变量, 则输出 #}
{% if idc is defined %}
{{ idc }}
{% elif %}
没有定义
{% endif %}
7. 循环语句
for 循环语句
{% for user in users %}
{{ user }} #user 变量将遍历 users
{% endfor %}
{% for myhost in groups['myhosts'] %} #列出 myhosts 组中所有主机
{{ myhosts }}
{% endfor %}
{# 列举出 dbservers 这个 group 中的所有主机 #}
{% for host in groups['dbservers'] %}
{{ host }}
{% endfor %}
8. 空白控制
默认配置中,模板引擎不会对空白做进一步修改,所以每个空白(空格、制表符、换行符 等等)都会原封不动返回。
此外,你也可以手动剥离模板中的空白。当你在块(比如一个 for 标签、一段注释或变量表达式)的开始或结束放置一个减号( - ),可以移除块前或块后的空白。如下:
{% for item in range(1,9) -%}
{{ item }}
{%- endfor %}
输出的所有元素前后不会有任何空白,输出会是:123456789
9. 过滤器
(这个东西嘛,在Ansible高级运用当中会经常使用和涉及。所以呢,在我们现阶段,只做了解已经足够。)
变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入。
例如 {{ name|striptags|title }} 会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。过滤器接受带圆括号的参数,如同函数调用。这个例子会 把一个列表用逗号连接起来: {{ list|join(’, ') }}
变量过滤器:把输出结果改写为指定格式
{{ output | to_json }} #以 json 格式输出
{{ output | to_yaml }} #以 yaml 格式输出
{{ output | from_json }} #对 json 格式字符串进行解析
{{ output | from_yaml }} #对 yaml 格式字符串进行解析
内置过滤器清单
http://docs.jinkan.org/docs/jinja2/templates.html#builtin-filters
ansible 自带过滤器
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html?highlight=filter
练习
创建目录并创建配置文件和主机清单
[student@servera ]$ mkdir template
[student@servera ]$ cd template
[student@servera template]$ cat ansible.cfg
[defaults]
inventory = hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[student@servera template]$ cat hosts
servera
按要求编写jinja2模版
[student@servera template]$ cat motd.j2
This is the system {{ ansible_hostname }}.
You cat ask {{ system_owner }} for access.
按要求编写剧本
[student@servera template]$ cat motd.yml
---
- name: config motd
hosts: servera
vars:
system_owner: "金鱼哥"
tasks:
- name: template
template:
src: motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
执行剧本
[student@servera template]$ ansible-playbook motd.yml
PLAY [config motd] **********************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [servera]
TASK [template] *************************************************************************
changed: [servera]
PLAY RECAP *88888************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@servera ~]# ssh root@servera
Last login: Mon Nov 8 14:30:47 2021 from 192.168.159.1
This is the system servera.
You cat ask 金鱼哥 for access.
总结
- 介绍Jinja2模板。
- Jinja2 常用语法和基本语法的展示。
- 相关控制:条件判断、循环语句、过滤器。
以上就是【金鱼哥】对 第六章 在被管理节点上创建文件和目录—jinja2模板 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)