ansible自动化运维(三)jinja2模板roles角色管理

相关文章
ansible自动化运维(一)简介及清单,模块-CSDN博客
ansible自动化运维(二)playbook模式详解-CSDN博客
ansible自动化运维(四)运维实战-CSDN博客

三.Ansible jinja2模板

Jinja2是Python的全功能模板引擎。在python的WEB开发中被广泛应用。

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等。

3.1在Ansible 中的使用

使用Ansible的jinja2模板也就是使用template 模块,该模块和copy 模块一样,都是将文件复制到远端主机上去,但是区别在于,template 模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。比如想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。通常jinja2模板文件的后缀为.j2

3.2jinja2模板语法

3.2.1基础语法

(1)playbook文件使用template模块

(2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts

(3){{}}也可以使用表达式,比如{{3+5}}{{3 in[1,2,3,4,5]-}}

说明:{{}}中的表达式其实就是python中的表达式,可以包括比较运算,算数运算,逻辑运算,成员运行。

该模板支持:

字符串:使用单引号或双引号;

  数字:整数,浮点数;

  列表:[item1, item2, ...]

  元组:(item1, item2, ...)

  字典:{key1:value1, key2:value2, ...}

  布尔型:true/false

  算术运算:

+, -, *, /, //, %, **

  比较操作:

==, !=, >, >=, <, <=

  逻辑运算:

and, or, not

模板通常都是通过引用变量来运用的

【实例】

  1. 创建模板文件:

 首先,需要一个包含jinja2模板的文件。这个文件通常包含要插入变量或表达式的位置。可以在文件中是使用 {{}} 来包裹变量或表达式。

例如,创建一个名为my_template.j2的模板文件:

[root@host1 jinja2]# cat my_template.j2

ServerName {{ hostname }}

Listen {{ port }}

Debug {{ debug_mode }}

2.在Playbook中使用模板:

在 Ansible Playbook中,可以使用template模块来加载模板文件并将变量传递给它。以下是一个示例Playbook:

 [root@server jinja2]# cat jinja.yml

---

- name: 使用Jinja2模板

  hosts: node1

  vars:

    hostname: example.com

    port: 8080

    debug_mode: True

  tasks:

    - name: 生成配置文件

      template:

        src: my_template.j2

        dest: /etc/ansible/yml/jinja2/myapp.conf

在这个示例中,我们使用了template模块,指定了模板文件的源(src)和目标(dest)。我们还传递了变量hostname、port和debug_mode,这些变量会在模板中替换 {{}} 中相应的位置。

3.运行Playbook:

运行上述Playbook,Ansible将使用模板文件生成 /etc/ansible/yml/jinja2/myapp.conf 配置文件,并将模板中的{{ }}替换为变量的值。

[root@server jinja2]# ansible-playbook jinja.yml

查看结果为

root@host1 jinja2]# cat /etc/ansible/yml/jinja2/myapp.conf

ServerName example.com

Listen 8080

Debug True

 模板文件中的 {{ }} 不仅可以包含变量,还可以包含表达式,如您所述的比较运算、算数运算、逻辑运算等。这使得您可以把在模板中执行各种操作以生成需要的配置或文本。

 3.2.2流程控制

条件判断

使用{% if %}和{% endif %}块来实现条件语句。以下是一个示例:

格式:

{% if EXPR %}

执行内容

{% else %}

执行内容

{% endif %}

实例:

{% if is_production %}

    # 生产环境配置

    DebugLevel: 0

{% else %}

    # 开发/测试环境配置

    DebugLevel: 2

{% endif %}

多条件判断

格式:

{% if EXPR %}

执行内容

{% elif EXPR %}

执行内容

{% else %}

执行内容

{% endif %}

实例:

{% if is_production %}

DebugLevel: 0

{% elif is_production %}

DebugLevel: 1

{% else %}

DebugLevel: 2

{% endif %}

在这个示例中,根据is_production变量的值,将生成不同的配置。

循环表达式

可以使用{% for %}和{% endfor %}块来实现循环。以下是一个示例:

格式:

{% for i in EXPR %}

执行内容

{% endfor %}

实例:

{% for item in list_items %}

    - {{ item }}

{% endfor %}

在这个示例中,list_items 是一个包含多个元素的列表,模板将循环遍历列表中的每个元素并生成相应的输出。

说明:默认不支持break和continue的,但是可以使用ansible的扩展选项,在配置/etc/ansible/ansible.cfg中的132行中:

jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n,jinja2.ext.loopcontrols

3.2.3 过滤器

Jinja2还支持过滤器,可以使用过滤器来对变量进行操作。例如,可以使用default过滤器来设置默认值:

{{ variable | default("default_value") }}

或者,您可以使用length过滤器来获取列表的长度:

The list has {{ list_items | length }} items.

3.2.4其他控制结构

Jinja2还支持其他控制结构,如{% include %}用于包含其他模板文件,以及{% macro %}和{% call %}用于定义和调用宏。

请注意,Jinja2语法和功能非常强大,支持许多高级用例,例如宏、继承、自定义过滤器等。要更深入地了解Jinja2模板的流程控制和功能,请查看Jinja2的官方文档。在Ansible中,可以将这些模板用于生成配置文件、编排任务等,以满足不同的需求和环境。

3.3template模板

template模块与copy模块的用法十分类似,只是更多用于jinja2模板的渲染,也就是模板文件中可以引用变量,实现对不同主机有定制化的配置。

copy与template的区别

  1. copy模块不替代参数,template模块替代参数
  2. template的参数几乎与copy的参数完全相同

常用参数

参数

解析

src

指定本地jinja2模板文件的位置

dest

指定目标远程主机路径

backup

指定是否备份,默认值no

mode

设置权限

user

设置用户

group

设置用户组

3.4jinja2使用案例

比如需要实现对被控端主机安装redis服务,默认的redis服务只监听本地的127.0.0.1端口,换句话说,其他主机是不可以访问该redis服务器的,如何来解决这个问题呢?此时就可以使用jinja2的模板,在其中引用变量,使用template模块进行渲染。

本案例使用了:jinja2模板、templates模块、copy模块、yum模块、shell模块、service模块、vars定义变量、register变量注册、ignore_errors忽略错误、tags标签、when判断、notify 和 handlers通知与触发(处理程序)

  1. 创建一个自定义的Redis配置模板文件,如redis_conf.j2,并在其中修改Redis绑定地址以侦听所有IP地址;

[root@host1 redis]# cat redis_conf.j2

bind {{ ansible_host }} 127.0.0.1

port {{ redis_port }}

protected-mode no

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile /var/run/redis_6379.pid

loglevel notice

在此示例中,我们使用了 bind {{ ansible_host }} 127.0.0.1 来告诉Redis服务只接受本地IP连接,并使用变量 redis_port 来指定Redis端口。

2.在Ansible Playbook中,使用template模块加载该模板并渲染它,然后将渲染后的配置文件复制到Redis配置文件目录。以下是一个示例Playbook:

[root@server redis]# cat redis.yml

---

- name: 配置Redis服务器

  hosts: node1

  become: yes

  gather_facts: yes

  tasks:

    - name: 安装并启动Redis服务

      service:

        name: redis

        state: started

        enabled: yes

      tags:

        - start_redis

        - redis_server

    - name: 重启Redis服务

      service:

        name: redis

        state: restarted

      tags:

        - restart_redis

    - name: 停止Redis服务

      service:

        name: redis

        state: stopped

      tags:

        - stop_redis

        - uninstall_redis

    - name: 卸载Redis服务

      yum:

        name: redis

        state: absent

      tags:

        - uninstall_redis

  handlers:

    - name: 重启Redis

      service:

        name: redis

        state: restarted

 

# 检查语法

[root@localhost redis]# ansible-playbook --syntax-check redis.yml

# 列出任务列表

[root@localhost redis]# ansible-playbook --list-tasks redis.yml

# 列出所有tags标签

[root@localhost redis]# ansible-playbook --list-tags redis.yml

 

asks 解析:(列出tasks任务的时候后面也会包含tags标签,每个任务用的标签都有哪些)

tasks:

  Upload yum repo  # 更新yum源

  Upload epel repo  # 更新yum扩展源

  Check redis install  # 检查是否安装过 redis

  Install redis server  # 安装 redis

  Upload redis.conf  # 更新 redis 配置文件

  Start Redis server  # 启动 redis

  Restart Redis server  # 重启 redis

  Stop Redis Server  # 停止 redis

  uninstall Redis Server # 卸载 redis

tags 解析:(列出tasks任务的时候后面也会包含tags标签,每个任务用的标签都有哪些)

TASK TAGS:

  upload_repo # 更新yum源,包含:Upload yum repo,Upload epel repo

  upload_yum # 更新yum源

  upload_epel # 更新yum扩展源

  redis_server # 一键安装redis,包含:Upload yum repo、Upload epel repo、Check redis install、Install redis server、Upload redis.conf、Start Redis server

  check_redis # 检查是否安装 redis

  upload_redis.conf # 更新 redis 配置文件

  install_redis # 安装 redis

  restart_redis # 重启 redis

  start_redis # 启动 redis

  stop_redis # 停止 redis

  uninstall_redis # 卸载 redis

  1. 执行yml脚本

#执行更新yum源

[root@server redis]# ansible-playbook redis.yml -t upload_repo

#检查是否安装过redis,会有报错说找不到,不会影响,里面有 ignore_errors忽略错误;

[root@server redis]# ansible-playbook redis.yml -t check_redis

# 执行安装 redis(不能单独执行redis,会报错,因为有一个when判断需要调用上面的查询是否有redis服务)

[root@server redis]# ansible-playbook redis.yml -t check_redis,install_redis

#执行更新redis配置文件

[root@server redis]# ansible-playbook redis.yml -t upload_redis.conf

#执行完毕可以查看redis状态及redis端口是否启动,正常是都启动的;

#执行停止redis

[root@server redis]# ansible-playbook redis.yml -t stop_redis

# 执行完毕可以查看redis状态及redis端口是否启动,如果没有那就是没问题,因为这是停止;

#执行卸载redis

[root@server redis]# ansible-playbook redis.yml -t uninstall_redis

# 执行完可以使用: rpm -q redis 查看或使用 check_redis标签检查

# 执行一键安装redis

[root@server redis]# ansible-playbook redis.yml -t redis_server

# 执行完毕可以查看redis状态及redis端口是否启动,正常是都启动的;

四.roles角色管理

在Ansible中,有一个roles的概念。roles并不是指定具体的东西,而是一种规范,将复杂的Playbook分割为多个文件的机制,简化复杂的Playbook编写,并且使Playbook的复用变得简单。

建议:每个roles最好只使用一个tasks这样方便调用,能够很好的做到解耦;

4.1Roles介绍与优势

一般情况下将roles写在 /etc/ansible/roles 中,也可以写在其他任意位置(写在其他位置要自己手动建立一个roles文件夹)

  1. 对于以上所有方式有个缺点 就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件,很难实现灵活的调用
  2. roles用于层次性,结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
  3. 要使用roles只需要在playbook中使用include指令即可。
  4. 简单来讲,roles就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的include它们地一种机制。
  5. 角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。

4.2Roles的目录结构

建一个角色目录,用于演示:

[root@server redis]# mkdir -pv /etc/ansible/roles/{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}

看Roles的目录结构:

[root@server redis]# tree  /etc/ansible/roles/

/etc/ansible/roles/

├── httpd

│   ├── default

│   ├── files

│   ├── handlers

│   ├── meta

│   ├── tasks

│   ├── templates

│   └── vars

├── mysql

│   ├── default

│   ├── files

│   ├── handlers

│   ├── meta

│   ├── tasks

│   ├── templates

│   └── vars

└── nginx

    ├── default

    ├── files

    ├── handlers

    ├── meta

    ├── tasks

    ├── templates

    └── vars

24 directories, 0 files

 

目录解析:

/etc/ansible/roles/:存放roles的文件路径


httpd:存放apached服务的yml文件


mysql:存放mysql服务的yml文件


nginx:存放nginx服务的yml文件


default:此目录至少应该有一个名为main.yml的文件,用于设定默认变量;


files:存储由copy或者script等模块调用的文件或者脚本;


handlers:此目录中至少应该有一个名为main.yml的文件,用于定义各个handler;其他文件需要由main.yml进行包含调用;


meta:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定以及依赖关系,其他文件需要由main.yml进行包含调用;


tasks:此目录中至少应该有一个名为main.yml的文件,用于定义各个task;其他文件需要由main.yml进行包含调用;


templates:存储由templates模块调用的模板文件;


vars:此目录至少应该有一个名为main,yml的文件,用于定义各个variable;其他的文件需要由main.yml进行包含调用;


4.3ansible-galaxy命令

ansible-galaxy命令用于管理roles,同时也可以在galaxy.ansible.com上下载别人写好的roles。

1,初始化roles的目录结构

[root@server redis]# ansible-galaxy init /etc/ansible/roles/webserver

- Role /etc/ansible/roles/webserver was created successfully

2.安装别人写好的roles

[root@server redis]# ansible-galaxy role install -p /etc/ansible/roles tenequm.mysql

- downloading role 'mysql', owned by tenequm

- downloading role from https://github.com/tenequm/ansible-mysql/archive/1.0.1.tar.gz

- extracting tenequm.mysql to /etc/ansible/roles/tenequm.mysql

- tenequm.mysql (1.0.1) was installed successfully

[root@server etc]# cd ansible/roles/

[root@server roles]# ls mysql

default  files  handlers  meta  tasks  templates  vars

3.列出已安装的roles

[root@server roles]# ansible-galaxy list

# /usr/share/ansible/roles

# /etc/ansible/roles

- webserver, (unknown version)

- tenequm.mysql, 1.0.1

[WARNING]: - the configured path /root/.ansible/roles does not exist.

4.查看指定roles的信息

[root@server ~]# ansible-galaxy info tenequm.mysql

Role: tenequm.mysql

        description: Simply installs MySQL 5.7 on Xenial.

        commit: b3a7139ba44a91e9568345565e861e326e9d401e

        commit_message: Added priveleges configs for users.

        created: 2023-05-08T20:18:24.338543Z

        download_count: 238

        github_branch: master

        github_repo: ansible-mysql

        github_user: tenequm

        id: 103

        imported: 2017-06-08T21:57:26.659770-04:00

        modified: 2023-10-10T00:48:33.420438Z

        path: (u'/root/.ansible/roles', u'/usr/share/ansible/roles', u'/etc/ansible/roles')

        upstream_id: 17029

        username: tenequm

5.删除一个roles

如果是使用的wget拉取的,那么删除他的哪个roles目录就可以;

[root@server ~]# ansible-galaxy remove /etc/ansible/roles/tenequm.mysql

- successfully removed /etc/ansible/roles/tenequm.mysql

都看到这了留个一键三连呗,谢谢你们啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 (35)分配类排序

前言 分配类排序是数据结构中的一种重要排序方法&#xff0c;其核心思想是利用分配和收集过程对元素进行排序&#xff0c;而无需比较元素之间的关键字。这种方法突破了基于关键字比较的排序算法的时间下界&#xff0c;可以达到线性时间复杂度O(n)。 一、分配类排序的基本概念 分…

微信小程序跳转其他小程序以及跳转网站

一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功&#xff01;&q…

利用卷积神经网络进行手写数字的识别

数据集介绍 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛使用的手写数字识别数据集&#xff0c;常用于机器学习和计算机视觉领域中的分类任务。它包含了从0到9的手写数字样本&#xff0c;常用于训练和测试各种图像…

Transformer入门(6)Transformer编码器的前馈网络、加法和归一化模块

文章目录 7.前馈网络8.加法和归一化组件9.组合所有编码器组件构成完整编码器 7.前馈网络 编码器块中的前馈网络子层如下图所示&#xff1a; 图1.32 – 编码器块 前馈网络由两个带有ReLU激活函数的全连接层组成。全连接层&#xff08;Fully Connected Layer&#xff09;有时也…

前端(async 和await)

1 async async 将 function 变为成为 async 函数 ●async 内部可以使用 await&#xff0c;也可以不使用&#xff0c;因此执行这个函数时&#xff0c;可以使用 then 和 catch 方法 ●async 函数的返回值是一个 Promise 对象 ●Promise 对象的结果由 async 函数执行的返回值决…

Java-25 深入浅出 Spring - 实现简易Ioc-01 Servlet介绍 基本代码编写

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

H.323音视频协议

概述 H.323是国际电信联盟&#xff08;ITU&#xff09;的一个标准协议栈&#xff0c;该协议栈是一个有机的整体&#xff0c;根据功能可以将其分为四类协议&#xff0c;也就是说该协议从系统的总体框架&#xff08;H.323&#xff09;、视频编解码&#xff08;H.263&#xff09;、…

WPF+MVVM案例实战与特效(四十)- 一个动态流水边框的实现

文章目录 1、运行效果2、案例实现1、PointAnimationUsingKeyFrames 关键帧动画2、矩形流水边框案例2、运行效果3、关键技术点3、案例拓展:其他形状实现1、圆形流水边框2、心形流水边3、完整页面代码4、运行效果5、总结1、运行效果 2、案例实现 1、PointAnimationUsingKeyFram…

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…

【Linux-ubuntu通过USB传输程序点亮LED灯】

Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二&#xff0c;程序编译三&#xff0c;USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号&#xff0c;用于决定时钟信号是否能够有效的传递或者被使用&#xff0c;就像一个…

Rust之抽空学习系列(三)—— 编程通用概念(中)

Rust之抽空学习系列&#xff08;三&#xff09;—— 编程通用概念&#xff08;中&#xff09; 1、变量&可变性 在Rust中&#xff0c;变量默认是不可变的 fn main() {let x 5;println!("x is {}", x); }使用let来声明一个变量&#xff0c;此时变量默认是不可变…

Mybatis---事务

目录 引入 一、事务存在的意义 1.事务是什么&#xff1f; 2.Mybatis关于事务的管理 程序员自己控制处理的提交和回滚 引入 一、事务存在的意义 1.事务是什么&#xff1f; 多个操作同时进行,那么同时成功&#xff0c;那么同时失败。这就是事务。 事务有四个特性&#xf…

<项目代码>YOLOv8 车牌识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLOv8 车牌识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90121387YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题…

跨平台开发技术的探索:从 JavaScript 到 Flutter

随着多平台支持和用户体验一致性在应用程序开发中变得越来越重要,开发者面临的挑战是如何在不同平台上保持代码的可维护性和高效性。本文将探讨如何利用现代技术栈,包括 Flutter、JavaScript、HTML5、WebAssembly、TypeScript 和 Svelte,在统一的平台上进行高效的跨平台开发…

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…

Referer头部在网站反爬虫技术中的运用

网站数据的安全性和完整性至关重要。爬虫技术&#xff0c;虽然在数据收集和分析中发挥着重要作用&#xff0c;但也给网站管理员带来了挑战。为了保护网站数据不被恶意爬取&#xff0c;反爬虫技术应运而生。本文将探讨HTTP头部中的Referer字段在反爬虫技术中的应用&#xff0c;并…

【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)

文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…

NVR小程序接入平台/设备EasyNVR深度解析H.265与H.264编码视频接入的区别

随着科技的飞速发展和社会的不断进步&#xff0c;视频压缩编码技术已经成为视频传输和存储中不可或缺的一部分。在众多编码标准中&#xff0c;H.265和H.264是最为重要的两种。今天我们来将深入分析H.265与H.264编码的区别。 一、H.265与H.264编码的区别 1、比特率与分辨率 H.…

华硕奥创软件在线安装和离线安装方法

华硕奥创软件在线安装和离线安装方法 1. 华硕奥创软件介绍2. 华硕奥创软件在线安装2.1 第一种2.2 第二种 3. 华硕奥创软件离线安装3.1 概述3.2 华硕奥创软件离线包下载方式 4. 卸载华硕奥创软件4.1 概述4.2 华硕奥创卸载软件下载与使用方式 结束语 1. 华硕奥创软件介绍 华硕奥…

minio 分布式文件管理

一、minio 是什么&#xff1f; MinIO构建分布式文件系统&#xff0c;MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数…