自动化运维(二十三)Ansible 实战动态库存插件和回调插件

 Ansible 支持多种类型的插件,这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习动态库存插件和回调插件。

一、动态库存插件

Ansible 动态库存插件允许从各种外部数据源动态获取库存信息,包括主机、组别和变量。这些插件特别适用于云环境和大型基础设施,其中主机数量频繁变动或依赖特定服务(如 AWS、Azure、Google Cloud Platform)动态管理。

主要功能

  1. 动态同步:自动同步外部数据源(如云服务提供商或自定义数据库)的主机状态和配置。
  2. 减少维护:避免手动更新和维护库存文件,尤其是在主机经常变动的环境中。
  3. 自动化扩展:根据外部服务的标签、属性等动态组织和分类主机。

示例:使用 AWS EC2 动态库存插件

假设你的基础设施部署在 AWS EC2,你可以使用 Ansible 的 AWS EC2 动态库存插件自动发现和使用这些实例。

1. 安装所需的 Ansible 集合

首先,确保安装了包含 EC2 动态库存插件的 Ansible 集合:

ansible-galaxy collection install amazon.aws
2. 配置 AWS 凭据

确保你的 AWS 访问凭据配置正确。通常,这可以通过设置环境变量或配置文件 ~/.aws/credentials 来完成:

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
3. 创建动态库存配置文件

创建一个名为 aws_ec2.yml 的文件,配置动态库存插件:

plugin: amazon.aws.ec2regions:- us-east-1  # 指定区域keyed_groups:- prefix: regionkey: placement.region- prefix: typekey: instance_type- key: tagsprefix: tag

这个配置文件定义了插件类型(amazon.aws.ec2),所要扫描的区域(例如 us-east-1),以及如何根据实例的区域、类型和标签创建分组。

4. 使用动态库存

现在,你可以在 Ansible playbook 中使用这个动态库存配置。创建一个简单的 playbook list-instances.yml

- hosts: tag_Name_MyInstance  # 假设你的实例有一个标签 Name: MyInstancegather_facts: falsetasks:- name: Print instance informationdebug:msg: "Instance {{ inventory_hostname }} is in the group {{ group_names }}"
5. 执行 Playbook

使用以下命令执行 playbook,指定动态库存文件:

注意事项

  • 动态库存插件通常需要特定的权限来访问外部数据源,确保你的安全策略允许这些操作。
  • 在使用动态库存时,可能需要对应的 SDK 或 API 客户端库,确保这些库已正确安装。
  • 动态库存配置可能根据你的具体需求而有所不同,如需要特定的过滤条件或组织方式。

动态库存插件是 Ansible 自动化的强大工具,特别是在云计算和大规模分布式环境中,它提供了一种高效的方式来管理和操作动态变化的主机资源。

二、回调插件(Callback Plugins)

Ansible 回调插件允许开发者在 Ansible 的执行过程中的特定点进行介入,执行自定义的动作。这些插件可以捕捉到任务的开始、结束、失败等事件,并对这些事件做出响应,如记录日志、发送通知、或统计信息等。

主要用途

  1. 日志记录:自定义任务执行的日志记录方式和格式。
  2. 通知发送:在任务执行结束或失败时发送通知到 Slack、邮件等。
  3. 数据收集:收集执行数据用于性能监测或审计。
  4. 界面更新:更新监控或仪表板界面。

示例:自定义日志记录回调插件

假设我们需要创建一个简单的回调插件,该插件在每个任务执行后记录信息到一个本地文件。

1. 创建回调插件文件

在 Ansible 配置目录或项目目录中创建一个名为 callback_plugins/ 的目录,然后在此目录下创建一个名为 my_logger.py 的文件:

from datetime import datetime
import os
from ansible.plugins.callback import CallbackBaseclass CallbackModule(CallbackBase):"""An example callback plugin that logs task results to a file."""CALLBACK_VERSION = 2.0CALLBACK_TYPE = 'notification'CALLBACK_NAME = 'my_logger'def __init__(self):super(CallbackModule, self).__init__()self.logfile = open('ansible_task_log.txt', 'a')def log(self, host, category, task, result):now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')log_entry = f"{now} | {host} | {category} | {task} | {result}\n"self.logfile.write(log_entry)self.logfile.flush()def v2_runner_on_ok(self, result):task_name = result.task_namehost = result._host.get_name()self.log(host, 'OK', task_name, 'Success')def v2_runner_on_failed(self, result, ignore_errors=False):task_name = result.task_namehost = result._host.get_name()self.log(host, 'FAILED', task_name, 'Failed')def v2_playbook_on_stats(self, stats):self.logfile.close()
2. 配置 Ansible 使用自定义回调插件

在 ansible.cfg 文件中启用自定义回调插件:

[defaults]
stdout_callback = my_logger
callback_whitelist = my_logger

这里我们设置 stdout_callback 为我们的插件,这是因为通常只能有一个 stdout 类型的插件被激活。如果你只希望添加额外的功能并保持标准输出,可以不设置 stdout_callback,只需添加 callback_whitelist

3. 执行 Playbook

执行任何 playbook 时,所有任务的执行结果都将被记录到 ansible_task_log.txt 文件中。

注意事项

  • 确保文件路径、权限等设置正确,以便插件能够成功写入日志。
  • 回调插件可以影响 Ansible 的性能,特别是在高频写入操作时,要注意性能调试和优化。
  • 测试回调插件以确保它在各种情况下都能正常工作,特别是在错误处理和异常情况下。

通过使用回调插件,你可以非常灵活地扩展 Ansible 的功能,满足特定的日志记录、通知和数据收集需求,从而让自动化操作更加透明和易于管理。

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

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

相关文章

AndroidAutomotive模块介绍(一)整体介绍

前言 Android Automotive 是一个基本 Android 平台,可运行 IVI 系统中预安装的 Android 应用以及可选的第二方和第三方 Android 应用。 本系列文档将会系统的介绍 Android Automotive 的功能、架构、逻辑等。模块逻辑将从 应用api接口、系统服务、底层服务&#x…

软件设计师:11-结构化开发与UML

结构化开发(3-4分) 一、模块化 二、耦合(背) 三、内聚(背) 四、设计原则(背) 五、系统文档 六、数据流图 数据流的起点或终点必须有一个是加工 判断依据: 1、…

Vivado Design Suite中route_design命令脚本示例

本文详细介绍了四个route_design命令的示例脚本,这些脚本需要添加到工程的约束文件.xdc中,结果保存在工程文件中的runs\impl_1中的runme.log文件。 一、示例脚本1 route_design write_checkpoint -force $outputDir/post_route report_timing_summary …

img使用 :src 动态绑定图片地址,图片不成功

使用vue cli 创建的vue2项目&#xff0c;项目中想实现轮播效果。 出现的问题&#xff1a; 使用 :src 动态绑定图片地址&#xff0c;图片没有出现 <el-carousel :interval"3000" arrow"always"><el-carousel-item v-for"(item,index) in sw…

【MATLAB源码-第46期】基于matlab的OFDM系统多径数目对比,有无CP(循环前缀)对比,有无信道均衡对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种频域上的多载波调制技术&#xff0c;经常用于高速数据通信中。以下是关于多径数目、有无CP&#xff08;循环前缀&#xff09;以及有无信道均衡在OFDM系统中对误码率的影响&am…

6-125 二叉树的后序遍历(Python语言描述)

本题要求输出二叉树的后序遍历,输出格式见样例。 函数接口定义: #后序遍历 def postOrder(T)其中二叉树类的定义如下: #二叉树的存储-二叉链表 class BinaryTree:#1.构造方法def __init__(self,newValue):self.key = newValue #树根self.left = None #左子树初…

小程序如何通过把动态数据值传入到css文件中控制样式

场景&#xff1a;动态改变一个模块的高度 一、常用解决方法&#xff1a;行内样式绑值&#xff0c;或者动态class来传递 <viewclass"box":style"height: ${boxHeight}px">我是一个动态高度的box,我的高度是{{boxHeight}}px </view>二、高度传…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 &#xff08;1&#xff09;网络协议&#xff1a;计算机网络和分布系统中…

循序渐进丨MogDB 数据库带级联从库的集群切换后如何保持原有架构?

生产数据库运行过程中可能会涉及到升级或者打补丁&#xff0c;导致各节点的角色有计划的发生改变。如果集群内角色发生改变&#xff0c;是否还能保持原有架构继续对外提供服务呢&#xff1f;我们来做一下测试。 采用22模式模拟同城两机房部署4节点 MogDB 数据库集群&#xff0c…

K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)

介绍 容器中的文件在磁盘上是临时存放的&#xff0c;当容器崩溃或停止时容器上面的数据未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间&#xff0c;kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时…

gitlab、jenkins安装及使用文档二

安装 jenkins IP地址操作系统服务版本192.168.75.137Rocky9.2jenkins 2.450-1.1 jdk 11.0.22 git 2.39.3192.168.75.138Rocky9.2gitlab-ce 16.10.0 结合上文 jenkins安装 前期准备&#xff1a; yum install -y epel-release yum -y install net-tools vim lrzsz wget…

WSL访问adb usb device

1.Windows上用PowerShell运行&#xff1a; winget install --interactive --exact dorssel.usbipd-win 2.在WSLUbuntu上终端运行&#xff1a; sudo apt install linux-tools-generic hwdata sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-too…

Gitea是一个开源、轻量级的自托管Git解决方案

Gitea介绍 Gitea是一个由Go语言编写的、轻量级的、自托管的Git解决方案&#xff0c;类似于GitHub、GitLab等平台。它是用Go语言编写的开源软件&#xff0c;提供了Git版本控制系统的基本功能&#xff0c;包括代码托管、问题跟踪、代码审查、Wiki等。Gitea的设计目标是简单易用、…

Swift中的枚举

在Swift中&#xff0c;枚举&#xff08;Enumeration&#xff09;是一种定义一组相关值的方式。枚举可以包含零个或多个成员&#xff0c;每个成员可以有关联的值。枚举可以用于定义一组相关的选项、状态或错误类型。 以下是Swift中定义枚举的示例&#xff1a; //定义一个简单的…

酷开科技OTT大屏营销:开启新时代的营销革命

随着互联网技术的不断发展和普及&#xff0c;大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下&#xff0c;酷开科技凭借其强大的技术实力和敏锐的市场洞察力&#xff0c;成功地将大屏转化为一种新的营销渠道&#xff0c;为品牌和企业带来了前所未有的商业机会。 酷开科技…

爬虫jsoup解析工具之解析标题

package day01;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.junit.Test; import java.net.URL; public class JsoupFirstTest {Testpublic void main() throws Exception {/** <!--jsoup解析工具所需依赖--><dependency><groupId>…

【数据结构与算法篇】双链表实现

【数据结构与算法篇】双链表实现&#xff08;近300行实现代码&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. List.h 头文件的声明 2. List.c 源文…

上海计算机学会 2023年9月月赛 乙组T3 工程建设(拓扑排序)

第三题&#xff1a;T3工程建设 标签&#xff1a;拓扑排序题意&#xff1a;有 n n n个建设任务&#xff0c;第 i i i个建设任务完成时间为 t i t_i ti​。给定 m m m个前置任务要求&#xff0c;第 j j j条规则&#xff0c;若要开工 b j b_j bj​号任务&#xff0c;必须先完成 a…

etcd相关知识整理归纳 —— 筑梦之路

什么是etcd? Etcd 是 CoreOS 团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法&#xff0c;Etcd基于 Go 语言实现。 名字由来&#xff0c;它源于两个方面&#xff0c;unix的“/etc”文件…

安卓手机APP开发媒体内容部分__ExoPlayer支持的格式

安卓手机APP开发媒体内容部分__ExoPlayer支持的格式 目录 概述 可适配的流 DASH 光滑流 HLS 先进的容器的格式 RTSP 支持的采样格式 支持的网络类型 采样的格式 FFmpeg 代码库