金鱼哥说Ansible:第六章 在被管理节点上创建文件和目录---jinja2模板

举报
金鱼哥 发表于 2022/04/15 08:48:03 2022/04/15
【摘要】 Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。

让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模板 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

111

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。