7、模板templates

  1. 文本文件,嵌套有脚本(使用模板编程语言编写) 借助模板生成真正的文件
  2. Jinja2语言,使用字面量,有下面形式
  3. 字符串:使用单引号或双引号
  4. 数字:整数,浮点数
  5. 列表:[item1, item2, ...]
  6. 元组:(item1, item2, ...)
  7. 字典:{key1:value1, key2:value2, ...}
  8. 布尔型:true/false
  9. 算术运算:+, -, *, /, //, %, **
  10. 比较操作:==, !=, >, >=, <, <=
  11. 逻辑运算:andornot
  12. 流表达式:ForIfWhen

7.1、Jinja2相关

  1. 字面量
  2. 1> 表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python对象。如“Hello World
  3. 双引号或单引号中间的一切都是字符串。
  4. 2> 无论何时你需要在模板中使用一个字符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),如4242.23
  5. 3> 数值可以为整数和浮点数。如果有小数点,则为浮点数,否则为整数。在Python 里, 42 42.0 是不一样的
  1. 算术运算
  2. Jinja 允许你用计算值。这在模板中很少用到,但为了完整性允许其存在
  3. 支持下面的运算符
  4. +:把两个对象加到一起。
  5. 通常对象是素质,但是如果两者是字符串或列表,你可以用这 种方式来衔接它们。
  6. 无论如何这不是首选的连接字符串的方式!连接字符串见 ~ 运算符。 {{ 1 + 1 }} 等于 2
  7. -:用第一个数减去第二个数。 {{ 3 - 2 }} 等于 1
  8. /:对两个数做除法。返回值会是一个浮点数。 {{ 1 / 2 }} 等于 {{ 0.5 }}
  9. //:对两个数做除法,返回整数商。 {{ 20 // 7 }} 等于 2
  10. %:计算整数除法的余数。 {{ 11 % 7 }} 等于 4
  11. *:用右边的数乘左边的操作数。 {{ 2 * 2 }} 会返回 4
  12. 也可以用于重 复一个字符串多次。{{ ‘=’ * 80 }} 会打印 80 个等号的横条
  13. **:取左操作数的右操作数次幂。 {{ 2**3 }} 会返回 8
  1. 比较操作符
  2. == 比较两个对象是否相等
  3. != 比较两个对象是否不等
  4. > 如果左边大于右边,返回 true
  5. >= 如果左边大于等于右边,返回 true
  6. < 如果左边小于右边,返回 true
  7. <= 如果左边小于等于右边,返回 true
  8. 逻辑运算符
  9. 对于 if 语句,在 for 过滤或 if 表达式中,它可以用于联合多个表达式
  10. and
  11. 如果左操作数和右操作数同为真,返回 true
  12. or
  13. 如果左操作数和右操作数有一个为真,返回 true
  14. not
  15. 对一个表达式取反(见下)
  16. (expr)
  17. 表达式组
  18. ['list', 'of', 'objects']:
  19. 一对中括号括起来的东西是一个列表。列表用于存储和迭代序列化的数据。
  20. 例如 你可以容易地在 for循环中用列表和元组创建一个链接的列表
  21. <ul>
  22. {% for href, caption in [('index.html', 'Index'), ('about.html', 'About'), ('downloads.html',
  23. 'Downloads')] %}
  24. <li><a href="{{ href }}">{{ caption }}</a></li>
  25. {% endfor %}
  26. </ul>
  27. ('tuple', 'of', 'values'):
  28. 元组与列表类似,只是你不能修改元组。
  29. 如果元组中只有一个项,你需要以逗号结尾它。
  30. 元组通常用于表示两个或更多元素的项。更多细节见上面的例子
  31. {'dict': 'of', 'key': 'and', 'value': 'pairs'}:
  32. Python 中的字典是一种关联键和值的结构。
  33. 键必须是唯一的,并且键必须只有一个 值。
  34. 字典在模板中很少使用,罕用于诸如 xmlattr() 过滤器之类
  35. true / false:
  36. true 永远是 true ,而 false 始终是 false

7.2、template 的使用

  1. template功能:根据模块文件动态生成对应的配置文件
  2. > template文件必须存放于templates目录下,且命名为 .j2 结尾
  3. > yaml/yml 文件需和templates目录平级,目录结构如下:
  4. ./
  5. ├── temnginx.yml
  6. └── templates
  7. └── nginx.conf.j2

7.3、template示例

  1. 示例:利用template 同步nginx配置文件
  2. 准备templates/nginx.conf.j2文件
  3. vim temnginx.yml
  4. - hosts: websrvs
  5. remote_user: root
  6. tasks:
  7. - name: template config to remote hosts
  8. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  9. ansible-playbook temnginx.yml

7.3.1、Playbook中template变更替换

  1. 修改文件nginx.conf.j2 下面行为
  2. worker_processes {{ ansible_processor_vcpus }};
  3. cat temnginx2.yml
  4. - hosts: websrvs
  5. remote_user: root
  6. tasks:
  7. - name: template config to remote hosts
  8. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  9. ansible-playbook temnginx2.yml

7.3.2、Playbook中template算术运算

  1. 算法运算:
  2. 示例:
  3. vim nginx.conf.j2
  4. worker_processes {{ ansible_processor_vcpus**2 }};
  5. worker_processes {{ ansible_processor_vcpus+2 }};

7.4、template for if when循环

  1. {% for vhost in nginx_vhosts %}
  2. server { #重复执行server代码
  3. listen {{ vhost.listen | default('80 default_server') }};
  4. {% if vhost.server_name is defined %}
  5. server_name {{ vhost.server_name }};
  6. {% endif %}
  7. {% if vhost.root is defined %}
  8. root {{ vhost.root }};
  9. {% endif %}
  10. {% endfor %}

7.4.1、示例

  1. // temnginx.yml
  2. ---
  3. - hosts: testweb
  4. remote_user: root
  5. vars: # 调用变量
  6. nginx_vhosts:
  7. - listen: 8080 #列表 键值对
  8. //templates/nginx.conf.j2
  9. {% for vhost in nginx_vhosts %}
  10. server {
  11. listen {{ vhost.listen }}
  12. }
  13. {% endfor %}
  14. 生成的结果
  15. server {
  16. listen 8080
  17. }
  1. // temnginx.yml
  2. ---
  3. - hosts: mageduweb
  4. remote_user: root
  5. vars:
  6. nginx_vhosts:
  7. - web1
  8. - web2
  9. - web3
  10. tasks:
  11. - name: template config
  12. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  13. // templates/nginx.conf.j2
  14. {% for vhost in nginx_vhosts %}
  15. server {
  16. listen {{ vhost }}
  17. }
  18. {% endfor %}
  19. 生成的结果:
  20. server {
  21. listen web1
  22. }
  23. server {
  24. listen web2
  25. }
  26. server {
  27. listen web3
  28. }