Asible——template

template

当需要批量处理被控机上配置文件中的内容时,template可以为对应配置文件创建模板,并把时常变化的内容修改为变量,根据各个被控机的具体情况来确定变量的具体值。

  • Jinja2

说template之前,先说下Jinja2。

Jinja2是Python下一个被广泛应用的模版引擎

其基本语法:

  1. 控制结构(表达式):{% %}
  2. 变量取值:{{ }}
  3. 注释: {# #}

ansilbe中template是基于Jinja2来使用的,所以以上语法在template中都有效

template注释

*注释的语法为:{##}
其作用主要是对模板文件进行内容说明,在执行playbook时,注释内容不用传递到被控机上。只能在主控机上查看。

例:

{# yum #}

[{{ Name_1 }}]
name=[{{ name_1 }}]
baseurl=ftp://host.domain8.rhce.cc/dvd/{{ localtion_1 }}
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese



[root@localhost html]# cat /etc/yum.repos.d/test.repo   执行playbook后,发现文件中并没有注释

[EX294_BASE]
name=[EX294 base software]
baseurl=ftp://host.domain8.rhce.cc/dvd/BaseOS
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese

ansible_managed(配置文件内置变量)

ansible_managed为ansible配置文件中的变量,默认值为:ansible_managed = Ansible managed

此变量也是对文件进行说明,但与注释不一样的是,ansible_managed为变量,在被控机中可以查看。

我们可以自定义ansible_managed值。

......
# in some situations so the default is a static string:
#ansible_managed = Ansible managed
ansible_managed = '此文件由template生成,请不要随意修改'   自定义ansible_managed的值




[root@localhost html]# cat /etc/yum.repos.d/test.repo    对此文件进行说明
此文件由template生成,请不要随意修改

[EX294_BASE]
name=[EX294 base software]
baseurl=ftp://host.domain8.rhce.cc/dvd/BaseOS
enable=1
gkgcheck=1
gkgkey=ftp://host.domain8.rhce.cc/dvd/RPM-GPG-KEY-redhat-relese

template表达式

表达式或控制块的语法为:{%%}

template——for循环

除了在playbook中进行loop循环外,我们也可以在模板文件中进行内容循环。

变量 {{ loop.index }} 可以代表循环的索引次数号

[root@localhost project2]# vim template/test.j2
{% for x in users %}                把变量x置于users变量中,让x来遍历users中的值
  {{ loop.index,x }}
{% endfor %}


[root@localhost project2]# !vim
vim test.yml                              执行playbook
---
- name: test
  hosts: 192.168.190.133
  vars_files:
    files/vars                            指定变量文件
  tasks:
    - name:
      template:
        src: template/test.j2
        dest: /

[root@localhost html]# vim /test.j2        查看被控机文件
  (1, 'zhangsan')
  (2, 'lisi')
  (3, 'wangwu')

template——if条件

满足条件下才打印下面的变量

vim template/test.j2 
{% if ansible_facts.distribution == "RedHat" %}   如果被控机事实中的系统变量为RedHat,则打印变量result.
  {{ result }}
{% endif %}

template—— 变量过滤器

变量过滤器的作用是使传递的数据进行修饰后者筛选,从而使结果展示的更加简洁与明了。过滤器通过竖线符号(|)与变量分开

常用变量过滤器

过滤器名 说明
safe 不转义,将此值标记为安全
capitalize 把值的首字母转换成大写,其他字母转换成小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 把值中所有的 HTML 标签都删掉
tojson/to_nice_json 值返回为json格式
toyaml/to_nice_yaml 值返回为yaml格式

例:

{{ ansible_facts.default_ipv4 | to_nice_yaml }}  将事实中的地址信息转换为yaml格式


[root@localhost /]# vim test.txt   执行playbook后,到被控机器上查看
address: 192.168.190.133
alias: ens33
broadcast: 192.168.190.255
gateway: 192.168.190.2
interface: ens33
macaddress: 00:0c:29:93:80:cf
mtu: 1500
netmask: 255.255.255.0
network: 192.168.190.0
type: ether

过滤器可以连续使用

{{ ansible_facts.default_ipv4 | to_nice_yaml | title }}   将值转为yaml格式后把每个单词的首字母大写


[root@localhost /]# cat test.txt 
Address: 192.168.190.133
Alias: Ens33
Broadcast: 192.168.190.255
Gateway: 192.168.190.2
Interface: Ens33
Macaddress: 00:0c:29:93:80:cf
Mtu: 1500
Netmask: 255.255.255.0
Network: 192.168.190.0
Type: Ether
原文地址:https://www.cnblogs.com/sawyer95/p/13647279.html