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

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
25天前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
21天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
3天前
|
运维 网络安全 Python
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。
|
16天前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
24天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
48 4
|
22天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
34 2
|
23天前
|
运维 Devops 应用服务中间件
自动化运维的利器:Ansible实战指南
【10月更文挑战第36天】在快速迭代的数字时代,自动化运维成为提升效率、减少错误的关键。Ansible以其简洁性、易用性和强大的功能脱颖而出。本文将带你了解Ansible的核心组件,通过实际案例深入其应用,并探讨如何结合最佳实践优化你的自动化工作流程。无论你是新手还是有经验的运维人员,本指南都将为你提供宝贵的知识和技能。
|
24天前
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible进行批量配置管理
【10月更文挑战第36天】在现代的IT基础设施中,高效和可靠的系统管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化运维任务,包括安装、配置、部署应用程序以及管理系统更新。我们将探讨Ansible的核心概念,并通过实际代码示例展示其应用。通过阅读本文,读者将获得使用Ansible改善日常运维工作流程的实用知识。
|
28天前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。
|
1月前
|
缓存 运维 应用服务中间件
自动化运维的新篇章:使用Ansible进行配置管理
【10月更文挑战第23天】随着云计算和微服务架构的兴起,传统的手动运维方式已经无法满足现代IT基础设施的需求。自动化运维成为提升效率、减少错误的关键。本文将介绍如何使用Ansible,一个流行的开源自动化工具,来简化配置管理和部署流程。我们将从基础概念出发,逐步深入到实战应用,展示如何通过编写Playbook来实现服务器的自动化配置和管理。