6.自动化运维工具-Ansible Jinja2模板
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但是区 别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的 backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果 使用template,则会变成对应的主机名。
2.Ansible Jinja2模板使用
1.Jinja模板基本语法
{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts
2.Jinja2模板逻辑表达式
#循环表达式
{% for i in EXPR %}
……
{% endfor %}
#条件判断
{% if EXPR %}
……
{% elif EXPR %}
……
{% else %}
……
{% endif %}
#注释
{# COMMENT #}
3.ansible_jinja2模板使用示例
1.jinja模板基本用法
##编辑playbook
[root@mb01 ~]# cat mode.yml
---
- name: mode
hosts: 172.16.1.7
tasks:
- name: mode
template:
src: /root/mode
dest: /etc/motd
##编辑模板
[root@mb01 ~]# cat mode
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB
2.Jinja循环
#模板定义阶段
[root@mb01 ~]# cat mode
{% for host in range(7,8) %}
server 172.16.1.{{ host }}:80
{% endfor %}
#模板调用阶段
[root@mb01 ~]# cat mode.yml
---
- name: mode
hosts: 172.16.1.7
tasks:
- name: mode
template:
src: /root/mode
dest: /opt/motd
#被控端结果
[root@web01 ~]# cat /opt/motd
server 172.16.1.7:80
server 172.16.1.8:80
#循环时要有[ ]中间用逗号分割,注意要加引号,不加引号会解析为值
[root@mb01 ~]# cat mode
{% for host in ['group','sweb','saal'] %}
{ server 172.16.1.{{ host }}:80 }
{% endfor %}
#加引号的结果
[root@web01 ~]# cat /opt/motd
{ server 172.16.1.group:80 }
{ server 172.16.1.sweb:80 }
{ server 172.16.1.saal:80 }
#不加引号
[root@mb01 ~]# vim mode
{% for host in [group,'sweb','saal'] %}
{ server 172.16.1.{{ host }}:80 }
{% endfor %}
#结果
[root@web01 ~]# cat /opt/motd
{ server 172.16.1.123:80 }
{ server 172.16.1.sweb:80 }
{ server 172.16.1.saal:80 }
3.jinja判断
#配置文件编辑阶段
[root@mb01 ~]# cat keepalived.conf
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == "web01" %}
istate MASTER
priority 150
{% else %}#####################此处可以用elif继续判断elif ansible_fqdn == "web02"
state BACKUP
priority 100
{% endif %}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
调用阶段
[root@mb01 ~]# cat mode.yml
---
- name: mode
hosts: webs
tasks:
- name: mode
template:
src: /root/keepalived.conf
dest: /opt/motd
#web01查看结果
[root@web01 ~]# cat /opt/motd
global_defs {
router_id web01
}
vrrp_instance VI_1 {
istate MASTER
priority 150
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
未经允许不得转载:孙某某的运维之路 » 6.自动化运维工具-Ansible Jinja2模板
评论已关闭