使用ansible的template模块 渲染jinja2模板中的内容,结果以文件形式生成在远程主机指定目录,如下;
---
- hosts: web
gather_facts: no
vars:
hello: ansible
tasks:
- template: src=f.j2 dest=/opt2/j2.conf
- template :模块名
- src : 本机jinja2文件
- dest :渲染j2内容生成文件的路径 (远端主机)
例子:现在先在本机创建个jinjia2的文件f.j2 (自己写内容,注意语法{% xxxx %})
内容:定义一个数组,遍历打印出来
[root@server-www xunhuan]# cat f.j2
{% set list=['l', 'o', 'v', 'e'] %}
{% for i in list %}
{{i}}
{%endfor%}
执行 ansible-playbook jinja2.yml
结果:
执行成功,我们再去远程主机的opt2目录下去看,已经生成了j2.conf这个文件,并且吧f.j2的结果渲染出来了。
- 可以if判断
[root@server-www xunhuan]# cat f.j2
{% set list=['l', 'o', 'v', 'e'] %}
{% for i in list %}
{% if i == 'l' %}
-> love-l
# {% elif i == 'e' %}
# -> love -e
{% endif %}
{%endfor%}
- 打印变量 + 遍历字典 (for key,value in dict.iteritems() 遍历字典和python是一样的分别赋值key与value)
{{hello}} --在yml文件中的vars指定的变量。
#遍历字典
{% set dict={'zhangsan':25,'lisi':26,'wangwu':27} %}
{% for key,value in dict.iteritems() %}
{{key}} -> {{value}}
{%endfor%}
执行一下ansible-playbook jinjia2.yml
动态管理nginx配置文件。
如我们要新增站点,或者频繁变成配置文件中的内容,可利用jinja2模板渲染nginx配置文件、
创建yml文件 (http_port2 是负载均衡real_server代理端口变量)
[root@server-www xunhuan]# cat manger_nginx.yml
---
- hosts: web
gather_facts: no
vars:
h: ansible
http_port: 80
http_port2: 8011
server_name: www.123.com
tasks:
- name: copy nginx file
template: src=add.j2 dest=/etc/nginx/conf.d/add.conf
notify: reload nginx
- name: touch test page
shell: echo "hello {{h}}" >/var/www/index.html
handlers:
- name: reload nginx
service: name=nginx state=reloaded
上面yml文件引用了add.j2 这个jinja2类型文件,并渲染内容到目标机器的/etc/nginx/conf.d下
vim add.j2
{% set list=[111, 112] %}
upstream ansible_lunxun {
{%for i in list%}
server 192.168.1.{{i}}:{{http_port2}};
{%endfor%}
}
server {
listen {{http_port}};
server_name {{server_name}};
root /var/www;
location / {
proxy_pass http://ansible_lunxun;
}
}
运行:
渲染一个负载均衡的配置文件,运行剧本后,目标机器的/etc/nginx/conf.d下已经生成了add.conf
192.168.111 和 112 的负载均衡文件add .conf 和 站点配置文件8011.conf
访问域名:
总结:
通过剧本运行yml的内容,在yml中我们又引用.j2 格式的jinja2文件。在这个文件中,我们写出想要渲染到远端机器的内容。可以用for ,if 列表list , 字典dict,就像py脚本一样。最终把执行内容渲染出来在远端机器生成文件。
j2的语法:
for循环 {% for i in %} {{i}} {%endfor%}
if判断 {% if xxx %} {{i}} {%endif%}
列表list {{% set list=['1', '2', '3'] %}}
字典dict {{% set dict={'zhangsan':25,'lisi':26,'wangwu':27} %}}
遍历字典:
{% for key,value in dict.iteritems() %}
{{key}} -> {{value}}
{%endfor%}
引用变量:{{vars_name}}