【运维知识进阶篇】Ansible Jinja2模板详解

简介: 【运维知识进阶篇】Ansible Jinja2模板详解

哈喽大家好,我是koten,本篇文章给大家介绍jinja2模板,这是python的全功能模板引擎。在Ansible中,通常会使用jinja2模板来修改被管理主机的配置文件(saltstack中也会用到)

Ansible中使用的jinja2模板其实就是使用template模块,该模块与copy模块一样,都有复制管理机的配置文件到客户机的作用,区别在于template模块可以获取到文件中的变量,而copy则是原封不动把文件内容复制过去。如:我们想把脚本中的变量名改成主机名,如果使用copy推送的就是{

{ ansible_fqdn }},如果使用template,则会变成对应的主机名。

需要注意的是,Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用,只能在传输的文件中使用。

Ansible Jinja2模板使用

1、基本语法

1、playbook文件使用template模块
2、模板文件里面变量使用{{名称}},比如{{ port }}或使用facts

2、Jinja2模板逻辑判断

#循环表达式
{% for i in EXPR %}
{% endfor %}
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
#注释
{# COMMENT #}

3、Jinja2示例

1、编辑playbook

[root@Ansible test]# cat jinja2.yml
- hosts: web_group
  tasks:
    - name: copy template file
      template:
        src: motd.j2
        dest: /etc/motd

2、准备motd.j2文件

[root@Ansible test]# cat motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is : {{ ansible_memfree_mb }} MB

3、执行playbook并查看效果

[root@Ansible test]# ansible-playbook jinja2.yml 
PLAY [web_group] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]
TASK [copy template file] ******************************************************
changed: [web01]
changed: [web02]
PLAY RECAP *********************************************************************
web01                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
web02                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@Ansible test]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to Web01
This system total mem is : 972 MB
This system free mem is : 441 MB
web02 | CHANGED | rc=0 >>
Welcome to Web02
This system total mem is : 972 MB
This system free mem is : 84 MB

Ansible Jinja2管理nginx

Ansible使用jinja2的for循环表达式渲染出nginx负载均衡的配置文件

1、编辑playbook

[root@Ansible test]# cat lb.yml
- hosts: lb_group
  vars:
    http_port: 80
    server_name: www.koten.vip
  tasks:
    - name: copy
      template:
        src: proxy_7.conf.j2
        dest: /etc/nginx/conf.d/proxy_7.conf
      notify: reload nginx
  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

2、准备配置文件

[root@Ansible test]# cat proxy_7.conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
  server 172.16.1.{{ n }}:{{ http_port }}
{% endfor %}
}
server{
  listen 80;
  server_name {{ server_name }};
  location / {
  root /code
  index index.html
  proxy_pass http://{{ server_name }}
  proxy_set_header Host $http_host  
  }
}

3、执行playbook并查看客户机上的效果

[root@Ansible test]# ansible-playbook lb.yml
PLAY [lb_group] ****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [lb00]
ok: [lb01]
ok: [lb02]
TASK [copy] ********************************************************************
changed: [lb01]
changed: [lb00]
changed: [lb02]
RUNNING HANDLER [reload nginx] *************************************************
changed: [lb00]
changed: [lb02]
changed: [lb01]
PLAY RECAP *********************************************************************
lb00                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb01                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb02                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

查看效果

[root@LB00 ~]# cat /etc/nginx/conf.d/proxy_7.conf
upstream www.koten.vip {
  server 172.16.1.0:80
  server 172.16.1.1:80
  server 172.16.1.2:80
  server 172.16.1.3:80
  server 172.16.1.4:80
  server 172.16.1.5:80
  server 172.16.1.6:80
  server 172.16.1.7:80
  server 172.16.1.8:80
  server 172.16.1.9:80
  server 172.16.1.10:80
  server 172.16.1.11:80
  server 172.16.1.12:80
  server 172.16.1.13:80
  server 172.16.1.14:80
  server 172.16.1.15:80
  server 172.16.1.16:80
  server 172.16.1.17:80
  server 172.16.1.18:80
  server 172.16.1.19:80
  server 172.16.1.20:80
}
server{
  listen 80;
  server_name www.koten.vip;
  location / {
  root /code
  index index.html
  proxy_pass http://www.koten.vip
  proxy_set_header Host $http_host  
  }
}

Ansible Jinja2管理keepalived

ansible使用jinja模板的if判断表达式渲染出keepalived高可用配置文件,并推送到lb主机上

1、编辑playbook

[root@Ansible test]# cat keepalived.yml
- hosts: lb_group
  tasks:
    - name: copy file
      template:
        src: keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived
      when: (ansible_hostname is match "LB01") or (ansible_hostname is match "LB02")
  handlers:
    - name: restart keepalived
      systemd:
        name: keepalived
        state: restarted
      when: (ansible_hostname is match "LB01") or (ansible_hostname is match "LB02")

2、编写keepalived配置文件

可以看着keepalive master配置文件和keepalive backup配置文件参考着编写

[root@Ansible test]# cat keepalived.conf.j2
global_defs {
    router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == "LB01" %}
    state MASTER
    priority 150
{% else %}
    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
    }
}

3、执行playbook并查看效果

[root@Ansible test]# ansible-playbook keepalived.yml
PLAY [lb_group] ****************************************************************************************
TASK [Gathering Facts] *********************************************************************************
ok: [lb02]
ok: [lb00]
ok: [lb01]
TASK [copy file] ***************************************************************************************
skipping: [lb00]
changed: [lb02]
changed: [lb01]
RUNNING HANDLER [restart keepalived] *******************************************************************
changed: [lb01]
changed: [lb02]
PLAY RECAP *********************************************************************************************
lb00                       : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
lb01                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb02                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@LB01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
    router_id LB01
}
vrrp_instance VI_1 {
    state 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
    }
}
[root@LB02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
    router_id LB02
}
vrrp_instance VI_1 {
    state BACKUP
    priority 100
    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
运维 Shell Linux
Ansible自动化运维工具之常用模块使用实战(5)
Ansible自动化运维工具之常用模块使用实战(5)
|
4月前
|
运维 搜索推荐 Shell
Ansible自动化运维工具之个性化定制SSH连接登录端口(3)
Ansible自动化运维工具之个性化定制SSH连接登录端口(3)
132 0
|
4月前
|
运维 Kubernetes 网络安全
Ansible自动化运维工具之主机管理与自定义配置文件(2)
Ansible自动化运维工具之主机管理与自定义配置文件(2)
|
4月前
|
存储 运维 Linux
Ansible自动化运维工具安装入门,看这一篇就够了(1)
Ansible自动化运维工具安装入门,看这一篇就够了(1)
|
4月前
|
运维 Cloud Native Go
Ansible自动化:简化你的运维任务
Ansible自动化:简化你的运维任务
53 0
|
4月前
|
运维 应用服务中间件 网络安全
Ansible自动化运维工具之解决SSH连接使用明文密码问题(4)
Ansible自动化运维工具之解决SSH连接使用明文密码问题(4)
|
4月前
|
运维 Linux
Ansible自动化运维工具之常用模块使用实战(6)
Ansible自动化运维工具之常用模块使用实战(6)
|
1月前
|
运维 监控 测试技术
ansible 自动化运维监控方案
本文介绍如何利用ansible实时或自动采集受控主机的信息
|
3月前
|
弹性计算 运维
5分钟构建了个阿里云OOS运维模板顾问GPTs
本文介绍了通过gpts构建阿里云OOS运维模板顾问的背景及效果
152 0
|
5月前
|
运维 固态存储 定位技术
Ansible_自动化运维实战(一)
Ansible_自动化运维实战(一)

相关产品

  • 云迁移中心