模板介绍
Ansible使用Jinja2模板来启用动态表达式和访问变量。
比如:
模板文件内容如下:
IP 地址: {{ ip }}
当定义 ip=192.168.122.10
这个变量时候,通过上面的模板文件可以产生出如下内容的新文件
IP 地址: 192.168.122.10
原来的模板文件不变。
在目标计算机上发送和执行任务之前,所有模板都在Ansible控制器上进行。
Jinja2 模板基本语法
Jinja模板只是一个文本文件,一般文件名使用 .j2
为后缀。模板包含变量和或表达式,在渲染模板时将其替换为值。
有几种分隔符。默认的Jinja分隔符配置如下:
{% ... %}
声明逻辑表达式{{ ... }}
用于将变量输出{# ... #}
用于模板的注释
JinJa2 逻辑控制
条件表达
{% if %}
...
{% elif %}
...
{% else %}
...
{% endif %}
Example
{# 如果定义了 idc 变量, 则输出 #}
{% if idc is defined %}
{{ idc }}
{% else %}
没有定义
{% endif %}
循环控制
{% for %}
...
...
{% endfor %}
Example
{% for i in li %}
{{ i }}
{% endfor %}
- hosts: node1
vars:
li: [1,2,3]
tasks:
- name: tet
template: src=for2.j2 dest=/tmp/for2.txt
ansible-playbook some.yml
输出内容:
[root@master ~]# ssh node1 cat /tmp/for2.txt
1
2
3
实战
首先在管理节点创建模板文件
{# 我是注释 #}
这里输出了自定义变量的内容: {{ ip }}
循环输出目前执行任务的主机 {{ inventory_hostname }} 属于下列组:
{% for g in group_names %}
组名: {{ g }}
{% endfor %}
{% if n > 10 %}
这个值是 {{ n }}
{% endif %}
YAML 文档内容如下:
- name: 测试变量
hosts: slb
gather_facts: no
vars:
ip: 192.168.122.26
n: 20
tasks:
- name: 模板文件测试
template:
src: test.j2
dest: /tmp/test.conf
输出的文件内容如下
[root@master ~]# cat /tmp/test.conf
这里输出了自定义变量的内容: 192.168.122.26
循环输出目前执行任务的主机 192.168.122.26 属于下列组:
组名: nginx
组名: slb
这个值是 20
生产
mysql_connection={{groups['dbserver'][0]}}
kafka_connection={{groups['dbserver'] | product(['9092']) | map('join', ':') | join(',') }}
redis_connection={{groups['dbserver'] | product(['7001', '7002']) | map('join', ':') | join(',') }}
zookeeper_connection={{groups['dbserver'] | product(['2181']) | map('join', ':') | join(',') }}