Ansible Jinja2 模板使用、语法与使用案例

主机规划

添加用户账号

说明:

1、 运维人员使用的登录账号;

2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;

3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

  1. # 使用一个专门的用户,避免直接使用root用户
  2. # 添加用户、指定家目录并指定用户密码
  3. # sudo提权
  4. # 让其它普通用户可以进入该目录查看信息
  5. useradd -u -d /app yun && echo '' | /usr/bin/passwd --stdin yun
  6. echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
  7. chmod /app/

Ansible 配置清单Inventory

之后文章都是如下主机配置清单

  1. [yun@ansi-manager ansible_info]$ pwd
  2. /app/ansible_info
  3. [yun@ansi-manager ansible_info]$ cat hosts_key
  4. # 方式1、主机 + 端口 + 密钥
  5. [manageservers]
  6. 172.16.1.180:
  7.  
  8. [proxyservers]
  9. 172.16.1.18[:]:
  10.  
  11. # 方式2:别名 + 主机 + 端口 + 密码
  12. [webservers]
  13. web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=
  14. web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=
  15. web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=

Jinja2 模板概述

官网地址

  1. http://docs.jinkan.org/docs/jinja2/

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

Ansible 如何使用 jinja2 模板

Ansible 使用 jinja2 模板,也就是 template 模板。该模块和 copy 模块一样,都是将文件复制到目标机器,但是区别在于 template 模块可以获取要复制文件中的变量的值,而 copy 则是原封不动的把文件内容复制过去。

实际运用,比如:针对不同的主机定义不同的变量,template 会在将文件分发前读取变量到 jinja2 模板,之后再然后分发到不同的被管理主机上。

Jinja2 常用语法

赋值

为变量赋值,优先级高于 playbook 中的优先级。

  1. {% set username = 'zhang' %}
  2. {% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}

注释

  1. {# ... #}:要把模板中一行或多行注释掉,默认的注释语法。

变量

  1. {{ ... }}:把表达式的结果打印到模板上。

你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [] )。如下示例:

  1. {{ foo.bar }}
  2. {{ foo['bar'] }}
  1. 示例:{{ a_variable }}、{{ foo.bar }}、{{ foo['bar'] }}

花括号不是变量的一部分,而是打印语句的重要一部分。

条件判断

Jinja 中的 if 语句可比 Python 中的 if 语句。

在最简单的形式中,你可以测试一个变量是否未定义,为空或 false:

简单形式:

  1. {% if 条件表达式 %}
  2. ……
  3. {% endif %}

多分支形式:

  1. {% if 条件表达式 %}
  2. ……
  3. {% elif 条件表达式 %}
  4. ……
  5. {% else %}
  6. ……
  7. {% endif %}

循环语句

for 循环语句

  1. {% for user in users %}
  2. {{ user.username }}
  3. {% endfor %}

空白控制

默认配置中,模板引擎不会对空白做进一步修改,所以每个空白(空格、制表符、换行符 等等)都会原封不动返回。

此外,你也可以手动剥离模板中的空白。当你在块(比如一个 for 标签、一段注释或变量表达式)的开始或结束放置一个减号( - ),可以移除块前或块后的空白。如下:

  1. {% for item in range(,) -%}
  2. {{ item }}
  3. {%- endfor %}

输出的所有元素前后不会有任何空白,输出会是 123456789 。

转义

有时想要或甚至必要让 Jinja 忽略部分,而不会把它作为变量或块来处理。那么有如下两种方式:

单行转义:简单方式

需求:把 “{ {“ 作为原始字符串使用,而不是一个变量的开始部分。

  1. {{ '{{' }}

多行转义:

需求:将如下一块代码不进行任何处理,直接打印输出。

  1. {% raw %}
  2. <ul>
  3. {% for item in seq %}
  4. <li>{{ item }}</li>
  5. {% endfor %}
  6. </ul>
  7. {% endraw %}

HTML 手动转义

如果你有一个可能包含 >、<、& 或 " 字符的变量,那么你需要转义它;否则会被 HTML 使用。

转义通过用管道传递到过滤器 |e 来实现,如:

  1. {{ user.username|e }}

宏定义

宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代手动重复的工作。

如果宏在不同的模板中定义,你需要首先使用 import 。

示例:

  1. ## 宏变量顺序和具体内容变量顺序一致「推荐写法」
  2. {% macro input(name, value='', type='text', size=) -%}
  3. <input name="{{ name }}" value="{{ value|e }}" type="{{ type }}" size="{{ size }}">
  4. {%- endmacro %}
  5. ## 宏变量顺序和具体内容变量的顺序可以交错「不推荐写法」
  6. {% macro input(name, value='', type='text', size=) -%}
  7. <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}">
  8. {%- endmacro %}

宏变量解释:

name:默认为空,引用时必填

value:默认为空字符串

type:默认为 text

size:默认为 20

在命名空间中,宏之后可以像函数一样调用:

  1. <p>{{ input('username') }}</p> ## 结果为:<p><input name="username" value="" type="text" size=""></p>
  2. <p>{{ input('password', type='password') }}</p> ## 结果为:<p><input name="password" value="" type="password" size=""></p>

import 导入

导入宏,并在不同的模板中使用。

  1. # 示例:导入 nginx 变量
  2. {% from 'nginx_var.info' import nginx_package_path, nginx_version %}

过滤器

变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入。

  1. 例如 {{ name|striptags|title }}、{{ list|join(', ') }}

内置过滤器清单

  1. http://docs.jinkan.org/docs/jinja2/templates.html#builtin-filters

ansible 自带过滤器

  1. https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html?highlight=filter

Tests 测验

除了过滤器,所谓的「Tests」也是可用的。要测验一个变量或表达式,你要在变量后加上一个 is 和 Tests 的名称。当然 Tests 也可以接受参数。

内置测验清单

  1. http://docs.jinkan.org/docs/jinja2/templates.html#builtin-tests

ansible 自带测验

  1. https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html

算术

Jinja 允许用计算值。这在模板中很少用到,但是为了完整性允许其存在。

支持如下运算符:

  1. +:把两个对象加到一起。如:{{ + }} 等于 。但是如果两者是字符串或列表,你可以用这种方式来衔接它们【连接字符串推荐使用 ~ 运算符】。
  2.  
  3. -:用第一个数减去第二个数。如:{{ - }} 等于
  4.  
  5. /:对两个数做除法。返回值会是一个浮点数。如:{{ / }} 等于 {{ 0.5 }}
  6.  
  7. //:对两个数做除法,返回整数商。如:{{ 20 // 7 }} 等于 2 。
  8.  
  9. %:计算整数除法的余数。如:{{ % }} 等于
  10.  
  11. *:用右边的数乘左边的操作数。如:{{ * }} 会返回 。也可以用于重复一个字符串多次。如:{{ '=' * }} 会打印 个等号的横条。
  12.  
  13. **:取左操作数的右操作数次幂。如:{{ ** }} 会返回

比较

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

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

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

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

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

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

逻辑

对于逻辑判断,在 for 过滤或 if 表达式中,它可以用于联合多个表达式:

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

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

not:对一个表达式取反(见下)。

(expr):表达式组。

提示:is 和 in 运算符同样支持使用中缀记法:foo is not bar 和 foo not in bar。所有的其它表达式需要前缀记法:not (foo and bar) 。

其它运算符

  1. in:运行序列/映射包含检查。如果左操作数 包含于 右操作数,返回 true 。比如 {{ in [,,] }} 会返回 true
  2.  
  3. is:运行一个 测验。参见上述
  4.  
  5. |:应用一个 过滤器。参见上述
  6.  
  7. ~:把所有的操作数转换为字符串,并且连接它们。 {{ "Hello " ~ name ~ "!" }} 会返回(假设 name 值为 'John' Hello John!。

全局函数

range([start], stop[, step]):返回一个包含整等差级数的列表。

Ansible Jinja2 使用案例-常见功能

本例包含:注释、赋值、变量、条件判断、循环、空白控制、转义。

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. drwxrwxr-x yun yun Sep : file
  6. -rw-rw-r-- yun yun Sep : test_jinja2_01.yml
  7. [yun@ansi-manager jinja]$ ll file/
  8. total
  9. -rw-rw-r-- yun yun Sep : test_jinja2_01.conf.j2

配置文件

  1. [yun@ansi-manager jinja]$ cat file/test_jinja2_01.conf.j2 # 涉及的文件
  2. ##### 注释、赋值、变量 示例
  3. # 为变量赋值,优先级高于 playbook 中的变量赋值
  4. {# 注释 支持单行或多行 不会在受控机显示任何注释信息 #}
  5. {# 简单赋值 #}
  6. {% set username = 'zhangsan' %}
  7. {# 赋值一个数组 #}
  8. {% set info = ('name', 'age', 'address') %} {# 或者 {% set info = ['name', 'age', 'address'] %} #}
  9. {# 赋值一个二维数组 #}
  10. {% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
  11. {# 或者如下写法
  12. {% set navigation = (('index.html', 'Index'), ('about.html', 'About')) %}
  13. #}
  14.  
  15. username = {{ username }}
  16.  
  17. info[] = {{ info[] }}
  18. info = {{ info }}
  19.  
  20. navigation[][] = {{ navigation[][] }}
  21. navigation = {{ navigation }}
  22.  
  23. # 变量 打印 DNS 信息 信息来自于 Ansible Facts
  24. host_DNS1 = {{ ansible_dns['nameservers'][] }}
  25. host_DNS2 = {{ ansible_dns.nameservers[] }}
  26.  
  27. ##### 条件判断、循环、空白控制、转义 示例
  28. # 条件判断
  29. {# {% if username == 'zhangsan' %} #}
  30. {% if username == 'zhangsan1' %}
  31. username1
  32. {# {% elif username == 'zhangsan' %} #}
  33. {% elif username == 'zhangsan2' %}
  34. username2
  35. {% else %}
  36. username_other
  37. {% endif %}
  38.  
  39. # 循环
  40. {% for host_dns in ansible_dns['nameservers'] %}
  41. {{ host_dns }}
  42. {% endfor %}
  43.  
  44. # 去掉前后空白
  45. {% for host_dns in ansible_dns['nameservers'] -%}
  46. {{ host_dns }}
  47. {%- endfor %}
  48.  
  49. # 单行转义
  50. {{ '{{' }}
  51.  
  52. # 多行转义
  53. ## 块中的所有代码不做任何处理,直接原样输出
  54. {% raw %}
  55. <ul>
  56. {% for item in range(,) %}
  57. <li>{{ item }}</li>
  58. {% endfor %}
  59. </ul>
  60. {% endraw %}

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_01.yml # playbook 文件
  2. ---
  3. # ansible jinja2 测试案例1
  4. - hosts: proxyservers
  5. vars:
  6. - username: coco
  7.  
  8. tasks:
  9. - name: "test jinja2 01"
  10. template:
  11. src: ./file/test_jinja2_01.conf.j2
  12. dest: /tmp/test_jinja2_01.conf

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_01.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_01.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_01.yml # 执行

Ansible Jinja2 使用案例-宏与导入

本例包含:宏、from 导入

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. drwxrwxr-x yun yun Sep : file
  6. -rw-rw-r-- yun yun Sep : test_jinja2_02.yml
  7. [yun@ansi-manager jinja]$ ll file/
  8. total
  9. -rw-rw-r-- yun yun Sep : test_jinja2_02.conf.j2
  10. -rw-rw-r-- yun yun Sep : test_jinja2_macro.info

宏文件和配置文件

  1. [yun@ansi-manager jinja]$ cat file/test_jinja2_macro.info
  2. {# 配置文件中使用宏 #}
  3.  
  4. {% macro nginx_package_path(nginx_path="/tmp/package/nginx") -%}
  5. {{ nginx_path }}
  6. {%- endmacro %}
  7.  
  8. {% macro nginx_version(version='1.14.2') -%}
  9. {{ version }}
  10. {%- endmacro %}
  11.  
  12. [yun@ansi-manager jinja]$ cat file/test_jinja2_02.conf.j2
  13. {# from 导入 nginx 变量 #}
  14. {% from 'test_jinja2_macro.info' import nginx_package_path, nginx_version %}
  15.  
  16. {# 没有指定,那么就是宏定义的默认值 #}
  17. nginx_package_path = {{ nginx_package_path() }}
  18.  
  19. {# 有给定值,那么会覆盖默认值 #}
  20. nginx_version = {{ nginx_version("1.12.4") }}

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_02.yml
  2. ---
  3. # ansible jinja2 测试案例2
  4. - hosts: proxyservers
  5.  
  6. tasks:
  7. - name: "test jinja2 02"
  8. template:
  9. src: ./file/test_jinja2_02.conf.j2
  10. dest: /tmp/test_jinja2_02.conf

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_02.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_02.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_02.yml # 执行

Ansible Jinja2 使用案例-算术、比较、逻辑

本例包含:算术、比较、逻辑与其它运算符

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. drwxrwxr-x yun yun Sep : file
  6. -rw-rw-r-- yun yun Sep : test_jinja2_03.yml
  7. [yun@ansi-manager jinja]$ ll file/
  8. total
  9. -rw-rw-r-- yun yun Sep : test_jinja2_03.conf.j2

配置文件

  1. [yun@ansi-manager jinja]$ cat file/test_jinja2_03.conf.j2
  2. ### 算术
  3. 加法运算: 3.2 + 5.3 = {{ 3.2 + 5.3 }}
  4. 减法运算: 5.3 - 3.2 = {{ 5.3 - 3.2 }}
  5. 除法运算: 5.3 / 3.2 = {{ 5.3 / 3.2 }}
  6. 取商运算: 5.3 // 3.2 = {{ 5.3 // 3.2 }}
  7. 取余运算: 5.3 % 3.2 = {{ 5.3 % 3.2 }}
  8. 乘法运算: 3.2 * = {{ 3.2 * }}
  9. 次幂运算: 3.2 ** = {{ 3.2 ** }}
  10.  
  11. 重复一个字符多次:'$' * = {{ '$' * }}
  12.  
  13. ### 比较
  14. 比较是否相等: 'zhang' == "zhang" 为:{{ 'zhang' == "zhang" }}
  15. 比较是否相等: 'zhang' == "zhang1" 为:{{ 'zhang' == "zhang1" }}
  16. 比较是否不等: 'zhang' != "zhang1" 为:{{ 'zhang' != "zhang1" }}
  17. 比较是否不等: 'zhang' != "zhang" 为:{{ 'zhang' != "zhang" }}
  18. 左边大于右边: 5.3 > 3.2 为:{{ 5.3 > 3.2 }}
  19. 左边大于右边: 3.2 > 5.3 为:{{ 3.2 > 5.3 }}
  20. 左边大于等于右边: 5.3 >= 5.3 为:{{ 5.3 >= 5.3 }}
  21. 左边大于等于右边: 3.2 >= 5.3 为:{{ 3.2 >= 5.3 }}
  22. 左边小于右边: 5.3 < 3.2 为:{{ 5.3 < 3.2 }}
  23. 左边小于右边: 3.2 < 5.3 为:{{ 3.2 < 5.3 }}
  24. 左边小于等于右边: 5.3 <= 3.2 为:{{ 5.3 <= 3.2 }}
  25. 左边小于等于右边: 5.3 <= 5.3 为:{{ 5.3 <= 5.3 }}
  26.  
  27. ### 逻辑
  28. {% set name1 = 'zhang' %}
  29. {% set name2 = "zhang" %}
  30. {% set name3 = "li" %}
  31.  
  32. ##### and 测验
  33. {% if name1 == 'zhang' and name2 == 'zhang' %}
  34. 结果:True.
  35. {% else %}
  36. 结果:False.
  37. {% endif %}
  38.  
  39. {% if name1 == 'zhang' and name3 == 'zhang' %}
  40. 结果:True.
  41. {% else %}
  42. 结果:False.
  43. {% endif %}
  44.  
  45. ##### or 测验
  46. {% if name1 == 'zhang' or name2 == 'zhang' %}
  47. 结果:True.
  48. {% else %}
  49. 结果:False.
  50. {% endif %}
  51.  
  52. {% if name1 == 'zhang' or name3 == 'zhang' %}
  53. 结果:True.
  54. {% else %}
  55. 结果:False.
  56. {% endif %}
  57.  
  58. ##### (expr) 测验
  59. {% if name3 == 'zhang' or ( name1 == 'zhang' and name2 == 'zhang' ) %}
  60. 结果:True.
  61. {% else %}
  62. 结果:False.
  63. {% endif %}
  64.  
  65. ##### not 测验
  66. {% if name3 == 'zhang' or not (name1 == 'zhang' and name2 == 'zhang') %}
  67. 结果:True.
  68. {% else %}
  69. 结果:False.
  70. {% endif %}

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_03.yml
  2. ---
  3.  
  4. # ansible jinja2 测试案例3
  5. - hosts: proxyservers
  6.  
  7. tasks:
  8. - name: "test jinja2 03"
  9. template:
  10. src: ./file/test_jinja2_03.conf.j2
  11. dest: /tmp/test_jinja2_03.conf

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_03.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_03.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_03.yml # 执行

Ansible Jinja2 使用案例-其它运算

本例包含:其它运算符

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. drwxrwxr-x yun yun Sep : file
  6. -rw-rw-r-- yun yun Sep : test_jinja2_04.yml
  7. [yun@ansi-manager jinja]$ ll file/
  8. total
  9. -rw-rw-r-- yun yun Sep : test_jinja2_04.conf.j2

配置文件

  1. [yun@ansi-manager jinja]$ cat file/test_jinja2_04.conf.j2
  2. # 其他运算符
  3.  
  4. ## in
  5. 左操作数包含于右操作数: {{ in [,,] }}
  6. 左操作数包含于右操作数: {{ in [,,] }}
  7.  
  8. ## is
  9. {% set pawd = '123abc' %}
  10. Test: {{ pawd is defined }}
  11.  
  12. ## ~
  13. {% set name = 'zhang' %}
  14. 字符串连接: "Hello" ~ name ~ '!' ~ = {{ "Hello" ~ name ~ '!' ~ }}

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_04.yml
  2. ---
  3.  
  4. # ansible jinja2 测试案例4
  5. - hosts: proxyservers
  6.  
  7. tasks:
  8. - name: "test jinja2 04"
  9. template:
  10. src: ./file/test_jinja2_04.conf.j2
  11. dest: /tmp/test_jinja2_04.conf

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_04.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_04.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_04.yml # 执行

Ansible Jinja2 使用案例-过滤器和测验

本例包含:filters、tests 和 range。

内置过滤清单

  1. http://docs.jinkan.org/docs/jinja2/templates.html#builtin-tests

内置测验清单

  1. http://docs.jinkan.org/docs/jinja2/templates.html#tests

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. drwxrwxr-x yun yun Sep : file
  6. -rw-rw-r-- yun yun Sep : test_jinja2_05.yml
  7. [yun@ansi-manager jinja]$ ll file/
  8. total
  9. -rw-rw-r-- yun yun Sep : test_jinja2_05.conf.j2

配置文件

  1. [yun@ansi-manager jinja]$ cat file/test_jinja2_05.conf.j2
  2. {# 变量定义 #}
  3. {% set filter01 = -24.5 %}
  4. {% set filter02 = 'abcDEGg' %}
  5. {% set filter03 = " abCDef G hkIL " %}
  6. {% set filter04 = ['physics', 'chemistry', , ] %}
  7.  
  8. # 过滤器 使用
  9. ## 取绝对值
  10. {{ filter01|abs() }} 或者 {{ filter01|abs }}
  11. ## 首字符大写,其他小写
  12. {{ filter02|capitalize() }} 或者 {{ filter02|capitalize }}
  13. ## 去掉两端空格
  14. |{{ filter03|trim() }}| 或者 |{{ filter03|trim }}|
  15. ## 返回序列的第一个
  16. {{ filter04|first() }} 或者 {{ filter04|first }}
  17. ## 将序列变为字符串,可以指定每个元素间加入什么字符,默认空
  18. 默认情况: {{ filter04|join() }} 或者 {{ filter04|join }}
  19. 加入字符: {{ filter04|join('|') }}
  20.  
  21. # Tests 测验 使用
  22. ## 变量是否定义
  23. 未定义: {{ filter00 is defined }}
  24. 已定义: {{ filter01 is defined }}
  25. ## 变量是否是数字
  26. {{ filter01 is number }} === {{ filter02 is number }}
  27. ## 变量是否是小写
  28. {{ filter02 is lower }}
  29. ## 变量是否是字符串
  30. {{ filter02 is string }}
  31.  
  32. ## 变量在 if 中的判断是否已定义
  33. {# ***** 变量已经被定义,直接判断表达式是 TrueFalse ***** #}
  34. {# {% if filter01 %} #}{# 如果变量没有定义,那么执行会报错 #}
  35. {# 由于 filter00 之前未定义,因此这里定义为 false,不然执行会报错【生产中会在 playbook中定义】
  36. {% set filter00 = false %}
  37. {% if filter00 %}
  38. #}
  39. {# ***** 通过判断变量是否被定义,得到到TrueFalse ***** #}
  40. {# {% if filter01 is defined %} #}
  41. {% if filter00 is defined %}
  42. variable is defined
  43. {% else %}
  44. variable is undefined
  45. {% endif %}
  46.  
  47. # range 使用
  48. {% for i in range(,) %}
  49. server 172.16..{{ i }}:
  50. {% endfor %}

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_05.yml
  2. ---
  3. # ansible jinja2 测试案例5
  4. - hosts: proxyservers
  5.  
  6. tasks:
  7. - name: "test jinja2 05"
  8. template:
  9. src: ./file/test_jinja2_05.conf.j2
  10. dest: /tmp/test_jinja2_05.conf

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_05.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_05.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_05.yml # 执行

Ansible Jinja2 使用案例-在playbook中使用

本例在 ansible 的 playbook 中使用 jinja2.

目录结构

  1. [yun@ansi-manager jinja]$ pwd
  2. /app/ansible_info/jinja
  3. [yun@ansi-manager jinja]$ ll
  4. total
  5. -rw-rw-r-- yun yun Jan : test_jinja2_06.yml

playbook 文件

  1. [yun@ansi-manager jinja]$ cat test_jinja2_06.yml
  2. ---
  3. # 在 playbook 中使用 jinja2 模板
  4. - hosts: proxyservers
  5.  
  6. tasks:
  7. - name: "test_jinja2_06.info create"
  8. file:
  9. path: "/tmp/test_jinja2_06.info"
  10. owner: yun
  11. group: yun
  12. state: touch
  13.  
  14. # 这里用了 jinja2 的过滤器,计算,in 判断,赋值,条件判断,循环
  15. - name: "test jinja2 06"
  16. blockinfile:
  17. path: "/tmp/test_jinja2_06.info"
  18. marker: "### {mark} ANSIBLE MANAGED BLOCK jinja2 test ###"
  19. block: |
  20. name: "{{ ansible_eth0['ipv4']['address']|replace('.', '-') }}"
  21. host: "{{ ansible_eth0['ipv4']['address'] }}"
  22. count: "3.2 + 5.3 = {{ 3.2 + 5.3 }};5.3 - 3.2 = {{ 5.3 - 3.2 }};5.3 / 3.2 = {{ 5.3 / 3.2 }};5.3 % 3.2 = {{ 5.3 % 3.2 }};3.2 ** 3 = {{ 3.2 ** 3 }}"
  23. other_count: "{{ 1 in [1,2,3] }}"
  24. ifelse:
  25. {% set name1 = 'zhang' %}
  26. {% if name1 == 'zhang' %}
  27. 结果:True.
  28. {% else %}
  29. 结果:False.
  30. {% endif %}
  31. loop:
  32. {% for i in range(,) %}
  33. server 172.16..{{ i }}:
  34. {% endfor %}

文件执行

  1. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_06.yml # 语法检测
  2. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_06.yml # 预执行,测试执行
  3. [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_06.yml # 执行

受控机结果查看

  1. [yun@ansi-haproxy01 ~]$ cat /tmp/test_jinja2_06.info
  2. ### BEGIN ANSIBLE MANAGED BLOCK jinja2 test ###
  3. name: "172-16-1-181"
  4. host: "172.16.1.181"
  5. count: "3.2 + 5.3 = 8.5;5.3 - 3.2 = 2.1;5.3 / 3.2 = 1.65625;5.3 % 3.2 = 2.1;3.2 ** 3 = 32.768"
  6. other_count: "True"
  7. ifelse:
  8. 结果:False.
  9. loop:
  10. server 172.16.1.1:
  11. server 172.16.1.2:
  12. server 172.16.1.3:
  13. server 172.16.1.4:
  14. server 172.16.1.5:
  15. server 172.16.1.6:
  16. server 172.16.1.7:
  17. server 172.16.1.8:
  18. server 172.16.1.9:
  19. server 172.16.1.10:
  20. server 172.16.1.11:
  21. server 172.16.1.12:
  22. server 172.16.1.13:
  23. server 172.16.1.14:
  24. server 172.16.1.15:
  25. server 172.16.1.16:
  26. server 172.16.1.17:
  27. server 172.16.1.18:
  28. server 172.16.1.19:
  29. ### END ANSIBLE MANAGED BLOCK jinja2 test ###

以上!


———END———
如果觉得不错就关注下呗 (-^O^-) !

Ansible Jinja2 模板使用的更多相关文章

  1. ansible jinja2模板概述

    目录 ansible jinja2模板概述 ansible jinja2模板使用 基本语法 jinja2模板逻辑判断 ansible jinja2管理nginx ansible jinja2管理kee ...

  2. 5.Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的 jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? te ...

  3. Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...

  4. Ansible --05 ansible jinja2

    ansible jinja2 什么是jinjia2模板 jinjia2是Python的全功能模块引擎 Jinjia2与Ansible的关系 Ansible通常会使用jinjia2模板来修改被管理主机的 ...

  5. Ansible_使用jinja2模板部署自定义文件

    一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...

  6. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment

    Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本.   Environment 类功能: Environment 是 Jinja2 中的一个 ...

  7. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  8. python操作三大主流数据库(5)python操作mysql⑤使用Jinja2模板提取优化页面展示

    python操作mysql⑤使用Jinja2模板提取优化页面展示 在templates目录下的index.html.cat.html等页面有一些共同的元素,代码比较冗余可以使用模板提取公共代码,在各网 ...

  9. Flask框架(2)-JinJa2模板

    为了把业务逻辑和表现逻辑分开,Flask把表现逻辑移到JinJa2模板,模板是一个包含响应文本的文件.它用占位变量表示动态部分,其具体要从请求上下文才知道. 把真实值替换掉占位变量成为渲染,JinJa ...

随机推荐

  1. Java是未来的第一编程语言吗?

    目录 一.前言 二.Java帝国的今天 2.1 依然霸占TIOBE热门编程语言的榜首 2.2 曾经想扼杀Java的微软宣布加入OpenJDK 2.3 Oracle发布开源全栈虚拟机GraalVM 三. ...

  2. Promise入门详解

    异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...

  3. Light of future-冲刺Day 5

    目录 1.SCRUM部分: 每个成员进度 SCRUM 会议的照片 签入记录 代码运行截图 用户浏览界面 订单详情界面 管理员浏览界面 新增后台界面 2.PM 报告: 时间表 燃尽图 任务总量变化曲线 ...

  4. web日志分析的重要性

    虽然不可能对庞大的日志文件进行逐条的阅读,但是在这些日志文件中,确实会包含一些非常重要的信息.例如,在什么时间.有哪些ip地址访问了网站中的什么资源,等等. 通过对日志文件的分析,可以获得如下信息. ...

  5. NumPy学习2:基本运算

    数组相减: a = array([20, 30, 40, 50])print ab = arange(4)print bc = a-bprint c 结果: [20 30 40 50][0 1 2 3 ...

  6. 四、华为VRP平台介绍和常用配置

    一.华为VRP平台 华为现用的平台是VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台. 包含华为产品中的路由.交换.安全.无线等等 二.华为设备管 ...

  7. coding++:Spring 中的 AOP 原理

    为什么使用 AOP 如下场景: 现在有一个情景: 我们要把大象放进冰箱,步骤为:打开冰箱->放入大象->关闭冰箱 如果再把大象拿出来,步骤为:打开冰箱->拿出大象->关闭冰箱 ...

  8. 008-进制-C语言笔记

    008-进制-C语言笔记 学习目标 1.[掌握]include预处理指令 2.[掌握]多文件开发 3.[了解]认识进制 4.[掌握]进制之间的互相转换 5.[掌握]原码,反码,补码 6.[掌握]位运算 ...

  9. 【Tool】Windows系统安装Maven依赖管理工具

    安装Maven依赖管理工具 官网下载地址:http://maven.apache.org/download.cgi 系统环境要求: [JDK]Maven3.3版本+需要JDK1.7版本以上支持 [内存 ...

  10. java nio消息半包、粘包解决方案

    问题背景 NIO是面向缓冲区进行通信的,不是面向流的.我们都知道,既然是缓冲区,那它一定存在一个固定大小.这样一来通常会遇到两个问题: 消息粘包:当缓冲区足够大,由于网络不稳定种种原因,可能会有多条消 ...