6.自动化运维工具-Ansible Jinja2模板

2022-03-12 分类:ansible 阅读(291) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长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
}
}

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1