告别手动编辑:如何用Python快速创建Ansible hosts文件?
在自动化运维领域,Ansible
是一款非常强大的工具,它可以帮助我们管理和配置大量的服务器。为了让Ansible
能够有效地管理这些服务器,我们需要一个hosts
清单文件,该文件定义了Ansible
要管理的目标主机。在实际应用中,我们可能会有一个包含大量服务器设备台账信息的文件,例如ip.txt
,我们希望将这些IP地址转换为Ansible
hosts
清单的格式。本文将介绍如何使用Python脚本来实现这一目标。
场景描述
假设我们有一个ip.txt
文件,其中包含了一系列需要管理的服务器IP
地址。这些IP
地址可能是分散的,也可能是连续的。我们希望将这些IP地址转换为Ansible hosts
清单的格式,以便Ansible
能够识别和管理这些服务器。具体来说,我们希望实现以下功能:
-
读取
ip.txt
文件中的IP地址。 -
对IP地址进行排序。
-
将连续的IP地址范围合并为一个范围表示,例如
192.168.1.[100:105]
。 -
生成
Ansible hosts
清单文件,其中包含每个主机的IP地址或IP地址范围,以及相应的连接信息,如用户名、密码和端口号。
实现步骤
读取IP地址
首先,我们需要编写一个Python
脚本来读取ip.txt
文件中的IP
地址。我们可以使用Python
的内置函数open()
来打开文件,并使用readlines()
方法读取文件的每一行。以下是读取IP地址的代码示例:
def read_data_from_csv(file_path):data = []with open(file_path, 'r') as file:reader = csv.DictReader(file)for row in reader:data.append(row)return data
对IP地址进行排序
读取IP
地址后,我们需要对它们进行排序。Python
的内置函数sorted()
可以很方便地对列表进行排序。以下是对IP地址进行排序的代码示例:
def sort_ips_in_group(grouped_data):for subnet, rows in grouped_data.items():grouped_data[subnet] = sorted(rows, key=lambda x: ip_to_int(x['IP']))return grouped_datadef ip_to_int(ip):parts = list(map(int, ip.split('.')))return (parts[0] << 24) + (parts[1] << 16) + (parts[2] << 8) + parts[3]
合并连续的IP地址范围
为了将连续的IP
地址范围合并为一个范围表示,我们可以遍历排序后的IP
地址列表,并检查每个IP地址是否与前一个IP
地址连续。如果连续,则将它们合并为一个范围。以下是合并连续IP
地址范围的代码示例:
def merge_ip_ranges(sorted_ips):merged_ranges = []current_range_start = Nonecurrent_range_end = Nonefor ip in sorted_ips:if current_range_start is None:current_range_start = ipcurrent_range_end = ipelif int(ip.split('.')[-1]) == int(current_range_end.split('.')[-1]) + 1:current_range_end = ipelse:if current_range_start == current_range_end:merged_ranges.append(f"{current_range_start}")else:merged_ranges.append(f"{current_range_start.split('.')[0]}.{current_range_start.split('.')[1]}.{current_range_start.split('.')[2]}.[{current_range_start.split('.')[-1]}:{current_range_end.split('.')[-1]}]")current_range_start = ipcurrent_range_end = ip# 处理最后一个范围if current_range_start is not None:if current_range_start == current_range_end:merged_ranges.append(f"{current_range_start}")else:merged_ranges.append(f"{current_range_start.split('.')[0]}.{current_range_start.split('.')[1]}.{current_range_start.split('.')[2]}.[{current_range_start.split('.')[-1]}:{current_range_end.split('.')[-1]}]")return merged_ranges
生成Ansible hosts清单
为了简化IP
地址管理,我们可以将连续的IP地址范围合并成一个更大的范围。具体来说,我们可以通过遍历已经排序的IP
地址列表,并逐一检查每个IP
地址是否与前一个地址连续。如果发现它们是连续的,我们就把它们合并在一起。这样做的好处是,不仅便于后续的管理和使用,还能让我们以每个IP
段作为组名进行组织。最后,我们将这些合并后的IP地址范围转换成Ansible hosts
清单的格式。Ansible hosts
清单文件一般包括主机组、主机名或IP地址以及相关的连接信息等。下面是一个生成Ansible hosts
清单的代码示例:
def generate_ansible_hosts(grouped_data):ansible_hosts = []added_ips = set() # 使用集合来存储已经添加的IP地址def add_ip_range(start, end):start_str = ip_to_str(start)end_str = ip_to_str(end)start_parts = start_str.split('.')end_parts = end_str.split('.')if start_parts[:3] == end_parts[:3]:if start == end:# 如果 start 和 end 相同,直接添加单个 IP 地址ansible_hosts.append(start_str)else:# 合并相同的前三个部分ansible_hosts.append(f"{start_parts[0]}.{start_parts[1]}.{start_parts[2]}.[{start_parts[3]}:{end_parts[3]}]")else:ansible_hosts.append(f"{start_str}")for subnet, rows in grouped_data.items():if not rows:continue # 跳过空的子网ansible_hosts.append(f"[{subnet}]")current_range_start = Nonecurrent_range_end = Nonefor row in rows:try:ip = row['IP']ip_int = ip_to_int(ip)if ip_int not in added_ips: # 检查IP地址是否已经添加过if current_range_start is None:current_range_start = ip_intcurrent_range_end = ip_intelif ip_int == current_range_end + 1:current_range_end = ip_intelse:add_ip_range(current_range_start, current_range_end)current_range_start = ip_intcurrent_range_end = ip_intadded_ips.add(ip_int) # 将IP地址添加到集合中elif current_range_start is None or not (current_range_start <= ip_int <= current_range_end):ansible_hosts.append(ip)except KeyError as e:print(f"Missing key in row data: {e}")continueif current_range_start is not None:add_ip_range(current_range_start, current_range_end)ansible_hosts.append(f"[{subnet}:vars]")try:ansible_hosts.append(f"ansible_ssh_user={rows[0]['Username']}")ansible_hosts.append(f"ansible_ssh_pass={rows[0]['Password']}")ansible_hosts.append(f"ansible_ssh_port={rows[0]['Port']}")except (KeyError, IndexError) as e:print(f"Error accessing vars for subnet {subnet}: {e}")continueansible_hosts.append("")return ansible_hosts
脚本使用演示
首先,通过一个脚本生成一下测试IP
数据,脚本如下:
import randomdef generate_random_ip(subnet):"""生成一个随机的IP地址"""parts = subnet.split('.')if len(parts) < 4:parts.extend(['0'] * (4 - len(parts)))parts[3] = str(random.randint(1, 254))return '.'.join(parts)def generate_test_data(file_path, num_records):"""生成测试数据并写入CSV文件"""with open(file_path, 'w') as file:file.write("IP,Port,Username,Password\n")for _ in range(num_records):subnet = random.choice(['192.168.31', '192.168.32', '192.168.33', '192.168.34'])ip = generate_random_ip(subnet)port = 10022if subnet == "192.168.31":username = "root"password = "pass@123"elif subnet == "192.168.33":username = "root"password = "P@ssw0rd"else:username = "admin"password = "password"file.write(f"{ip},{port},{username},{password}\n")# 示例文件路径
file_path = 'test_data.csv'
num_records = 800# 生成测试数据并写入文件
generate_test_data(file_path, num_records)
执行上述脚本后,会在当前目录生成一个IP
数据,这些IP
数据,有连续的和不连续的。如下图所示:
然后,通过执行generate_ansible_hosts.py
即可生成如下图的结果:
总结
通过以上步骤,我们成功地使用Python
脚本将ip.txt
文件转换为Ansible hosts
清单。这个脚本可以帮助我们自动化生成Ansible hosts
清单,提高运维效率。在实际应用中,我们可以根据需要对脚本进行进一步的扩展和优化,例如支持更多的连接信息、处理不同格式的IP
地址等。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言讨论。
推荐阅读
- 一分钟学会Ansible cron模块,高效管理你的定时任务
- 打造更安全的Linux系统:玩转PAM配置文件
- Ansible实战:如何正确选择command和shell模块?
- 运维效率倍增!Ansible Copy 模块必知必会操作
- 如何在Ansible中轻松实现复杂SSH跳转?这个参数搞定
- Ansible Setup模块实战,如何使用Setup模块收集主机信息
相关文章:

告别手动编辑:如何用Python快速创建Ansible hosts文件?
在自动化运维领域,Ansible是一款非常强大的工具,它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器,我们需要一个hosts清单文件,该文件定义了Ansible要管理的目标主机。在实际应用中,我们…...

ESP32云开发二( http + led + lcd)
文章目录 前言先上效果图platformio.iniwokwi.tomldiagram.json源代码编译编译成功上传云端完结撒花⭐⭐⭐⭐⭐ 前言 阅读此篇前建议先看 此片熟悉下wokwi https://blog.csdn.net/qq_20330595/article/details/144289986 先上效果图 Column 1Column 2 platformio.ini wokwi…...

Java 基于微信小程序的原创音乐小程序设计与实现(附源码,部署,文档)
大家好,我是stormjun,今天为大家带来的是Java实战项目-基于微信小程序的原创音乐小程序设计与实现。该系统采用 Java 语言 开发,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。 博…...

JavaWeb开发(十五)实战-生鲜后台管理系统(二)注册、登录、记住密码
1. 生鲜后台管理系统-注册功能 1.1. 注册功能 (1)创建注册RegisterServlet,接收form表单中的参数。 (2)service创建一个userService处理业务逻辑。 (3)RegisterServlet将参数传递给ser…...
在stm32中C语言编写的程序中,一个整形数据是怎么存储的,高位在前还是低位在前
目录 举个例子 如何验证 小结 在 STM32(基于 ARM Cortex-M 架构)的系统中,默认是小端(Little Endian) 存储方式。也就是说,对于一个整型(例如 32 位 int),它的最低有效…...

Redis系列之底层数据结构字典Dict
Redis系列之底层数据结构字典Dict Dict数据结构 Dict是Redis数据结构中使用最为频繁的复合型数据结构,本质上是一个哈希表 查看redis6.0版本的源码,链接:https://github.com/redis/redis/blob/6.0/src/dict.h 哈希表的结构定义࿱…...
CSS 溢出问题及解决方案:实用案例与技巧
在网页开发中,CSS 的布局和样式起着至关重要的作用,但经常会遇到一个棘手的问题——溢出问题。溢出是指元素内的内容超出了其设定的容器大小,这不仅会影响页面的美观,还可能干扰用户体验。本文将详细探讨 CSS 溢出问题的案例&…...
FastExcel 新一代的潮流 (EasyExcel)
目录 简介 FastExcel的特点 FastExcel使用方法详解 创建实体类和监听器 实现写入和读取功能 Excel转换为PDF 小结 FastExcel与EasyExcel的区别 结论 简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有…...

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】
文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先,下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见🤝。如果读者想和我交…...

cuda从零开始手搓PB神经网络
cuda实现PB神经网络 基于上一篇的矩阵点乘,实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下: #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…...

mac 安装mongodb
本文分享2种mac本地安装mongodb的方法,一种是通过homebrew安装,一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…...

K8S-Pod资源清单的编写,资源的增删改查,镜像的下载策略
1. Pod资源清单的编写 1.1 Pod运行单个容器的资源清单 ##创建工作目录 mkdir -p /root/manifests/pods && cd /root/manifests/pods vim 01-nginx.yaml ##指定api版本 apiVersion: v1 ##指定资源类型 kind: Pod ##指定元数据 metadata:##指定名称name: myweb ##用户…...

【Maui】视图界面与数据模型绑定
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&…...

JavaScript笔记基础篇02——运算符、语句、数组
黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 运算符 赋值运算符 编辑编辑 一元运算符…...

心法利器[127] | 24年算法思考-特征工程和经典深度学习
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…...
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.…...
PyTorch基本功能与实现代码
PyTorch是一个开源的深度学习框架,提供了丰富的函数和工具,以下为其主要功能的归纳: 核心数据结构: • 张量(Tensor):类似于Numpy的ndarray,是PyTorch中基本的数据结构,…...

SparkSQL数据模型综合实践
文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序,查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…...
3 查找重复的电子邮箱(having与where区别,distinct去重使用)
3 查找重复的电子邮箱(having与where区别,distinct去重使用) 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ---------------------- id 是该…...

uniapp——App 监听下载文件状态,打开文件(三)
5 实现下载文件并打开 这里演示,导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0? 相关Api: downloader DEMO 提示: 请求方式支持:GET、POST;POST 方式需要…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...