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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【运维知识进阶篇】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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
11天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible实战应用
【9月更文挑战第24天】在现代IT基础设施的快速迭代与扩展中,自动化运维成为提升效率、保障稳定性的关键。本文将深入探讨Ansible这一流行的自动化工具,通过实际案例分析其如何简化日常运维任务,优化工作流程,并提高系统的可靠性和安全性。我们将从Ansible的基础概念入手,逐步深入到高级应用技巧,旨在为读者提供一套完整的Ansible应用解决方案。
|
17天前
|
运维 Ubuntu 应用服务中间件
自动化运维之路:Ansible实战指南
【9月更文挑战第18天】在追求效率和稳定性的今天,自动化运维已成为IT领域的热门话题。本文将引导你通过实际案例学习如何使用Ansible进行自动化配置管理、任务执行和流程编排,从而提升你的工作效率并减少人为错误。我们将从基础概念出发,逐步深入到高级应用,让你能够轻松掌握这一强大的自动化工具。
|
2天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
94 64
|
1天前
|
运维 负载均衡 应用服务中间件
自动化运维:使用Ansible进行服务器配置管理
【9月更文挑战第34天】在现代IT运维工作中,自动化已成为提升效率、减少错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化和加速服务器的配置管理工作。我们将通过实际案例展示如何利用Ansible的Playbooks来自动化常见任务,并讨论其对提高运维团队工作效率的影响。
|
6天前
|
运维 持续交付 开发工具
自动化运维工具:Ansible入门教程
【8月更文挑战第60天】在现代IT运维管理中,自动化工具的使用已成为提高生产效率、减少人为错误和确保环境一致性的重要手段。本文将介绍Ansible——一款流行的开源自动化运维工具,通过其简单易学的语法和强大的功能,帮助读者快速入门并实现自动化部署和管理。我们将从Ansible的基本概念讲起,逐步深入到实际的代码示例,展示如何利用Ansible简化日常的运维任务。无论你是新手还是有经验的系统管理员,这篇文章都将为你提供实用的知识和技巧,让你轻松驾驭Ansible,开启自动化运维之旅。
|
6天前
|
存储 运维 Ubuntu
自动化运维:使用Ansible管理服务器
【8月更文挑战第61天】本文将介绍如何使用Ansible工具进行服务器的自动化管理。我们将从基础概念开始,逐步深入到实际的应用案例,最后通过代码示例展示如何实现自动化部署和配置管理。无论你是初学者还是有经验的运维工程师,这篇文章都会为你提供有价值的参考。
|
7天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【9月更文挑战第28天】在追求高效、稳定的IT运维时代,自动化工具Ansible凭借其简洁性、易用性和强大的功能脱颖而出。本文旨在通过实际案例引导读者理解Ansible的核心概念和操作流程,并分享如何通过Ansible简化日常运维任务,提升工作效率。从基础安装到高级应用,我们将一步步揭开Ansible的神秘面纱,让初学者也能轻松掌握自动化运维的要诀。
|
15天前
|
运维 Ubuntu 应用服务中间件
自动化运维:使用Ansible进行服务器配置管理
【9月更文挑战第20天】在当今快速发展的信息技术时代,自动化运维已成为提升工作效率、减少人为错误的关键技术手段。本文将引导读者了解如何使用Ansible这一强大的自动化工具来简化和加速服务器的配置管理工作。通过实际代码示例,我们将一起探索Ansible的核心概念、基本操作以及如何构建可重复使用的Playbooks,旨在为读者提供一种清晰、高效的服务器管理方法。无论你是运维新手还是希望提高现有工作流程的效率,这篇文章都将为你提供宝贵的指导和启发。
|
8天前
|
运维 Linux 网络安全
自动化运维的利器:Ansible、Puppet和Chef详解
自动化运维的利器:Ansible、Puppet和Chef详解
30 5
|
8天前
|
运维 Ubuntu 应用服务中间件
自动化运维:使用Ansible进行配置管理和任务自动化
【9月更文挑战第27天】在现代IT基础设施中,自动化运维是提高效率、减少人为错误和确保系统一致性的关键。本文将介绍如何使用Ansible,一个流行的开源IT自动化工具,来简化日常的运维任务。我们将探索Ansible的核心概念,包括它的架构、如何安装和使用它,以及一些实际的使用案例。无论你是新手还是有经验的运维专家,这篇文章都会提供有价值的见解和技巧,以帮助你更好地利用Ansible实现自动化。

热门文章

最新文章

下一篇
无影云桌面