Bootstrap

Ansible之template模板

模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja2语法

Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:

特性:

沙箱中执行
强大的 HTML 自动转义系统保护系统免受 XSS
模板继承
及时编译最优的 python 代码
可选提前编译模板的时间
易于调试。异常的行数直接指向模板中的对应行。
可配置的语法

官方网站:

http://jinja.pocoo.org/
https://jinja.palletsprojects.com/en/2.11.x/

官方中文文档

http://docs.jinkan.org/docs/jinja2/
https://www.w3cschool.cn/yshfid/

jinja2 语言支持多种数据类型和操作:

字面量,如: 字符串:使用单引号或双引号,数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and,or,not
流表达式:For,If,When
字面量:

表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python 对象。如"Hello World" 双引号或单引号中间的一切都是字符串。无论何时你需要在模板中使用一个字符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),如42,42.23数值可以为整数和浮点数。如果有小数点,则为浮点数,否则为整数。在 Python 里, 42 和 42.0 是不
一样的

算术运算:

Jinja 允许用计算值。支持下面的运算符

+:把两个对象加到一起。通常对象是素质,但是如果两者是字符串或列表,你可以用这 种方式来衔接 它们。无论如何这不是首选的连接字符串的方式!连接字符串见 ~ 运算符。 {
  { 1 + 1 }} 等于 2

-:用第一个数减去第二个数。 {
  { 3 - 2 }} 等于 1

/:对两个数做除法。返回值会是一个浮点数。 {
  { 1 / 2 }} 等于 0.5

//:对两个数做除法,返回整数商。 {
  { 20 // 7 }} 等于 2

%:计算整数除法的余数。 {
  { 11 % 7 }} 等于 4

*:用右边的数乘左边的操作数。 {
  { 2 * 2 }} 会返回 4 。也可以用于重 复一个字符串多次。 {
  { '=' * 80 }}
会打印 80 个等号的横条\

**:取左操作数的右操作数次幂。 {
  { 2**3 }} 会返回 8

比较操作符

== 比较两个对象是否相等

!= 比较两个对象是否不等

> 如果左边大于右边,返回 true

>= 如果左边大于等于右边,返回 true

< 如果左边小于右边,返回 true

<= 如果左边小于等于右边,返回 true

逻辑运算符

对于 if 语句,在 for 过滤或 if 表达式中,它可以用于联合多个表达式

and 如果左操作数和右操作数同为真,返回 true

or 如果左操作数和右操作数有一个为真,返回 true

not 对一个表达式取反

(expr)表达式组

true / false true 永远是 true ,而 false 始终是 false

template

template功能:可以根据和参考模块文件,动态生成相类似的配置文件

template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下示例:

./
├── temnginx.yml
└── templates
└── nginx.conf.j2

范例:利用template 同步nginx配置文件

# 准备templates/nginx.conf.j2文件
---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

执行

[root@centos8 ~]# ansible-playbook tempngix.yml

template变更替换 范例:

# 修改文件nginx.conf.j2

---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: install nginx
      yum: name=nginx
    - name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    - name: start service
      service: name=nginx state=started enabled=yes

执行

[root@centos8 ~]# ansible-playbook temnginx2.yml
template算术运算

范例:

vim nginx.conf.j2
worker_processes {
  { ansible_processor_vcpus**2 }};
worker_processes {
  { ansible_processor_vcpus+2 }};

范例:

---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: install nginx
      yum: name=nginx
    - name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart Nginx
    - name: start service
      service: name=nginx state=started enabled=yes

  handlers:
    - name: restart Nginx
      service: name=nginx state=restarted

执行:目标主机只执行某一台

[root@centos8 ~]# ansible-playbook temp2nginx.yml  --limit 172.31.0.38

template中使用流程控制 for 和 if

template中也可以使用流程控制 for 循环和 if 条件判断

;