告别手动编辑:如何用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要管理的目标主机。在实际应用中,我们…...
神经网络|(二)sigmoid神经元函数
【1】引言 在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 在此基础上,我们认识到神经元本身在做二元分类,是一种非…...
DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码:信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …...
Redis 集群模式入门
Redis 集群模式入门 一、简介 Redis 有三种集群模式:主从模式、Sentinel 哨兵模式、cluster 分片模式 主从复制(Master-Slave Replication): 在这种模式下,数据可以从一个 Redis 实例(主节点 Master)复…...
计算机网络 (55)流失存储音频/视频
一、定义与特点 定义:流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件,客户端可以通过互联网边下载边播放这些文件,也称为音频/视频点播。 特点: 边下载边播放:用户无需等待整个文件下载完成即可开始播放…...
vue + element-ui 组件样式缺失导致没有效果
失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:...
在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
注:机翻,未校。 Enable SMB Direct in Windows 11 在 Windows 11 中启用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 为 SMB 3.x 文件共享协议提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…...
250123-对象的比较(equals()和==)
1. Object类中的equals()方法 见20250103-Object类,使用构造函数创建的两个对象,见下例,即使输入参数是相同的,比较结果仍是不同,因为对象的堆内存地址不同,在任何情况下使用关键字new都会开辟出一个新的内…...
UE求职Demo开发日志#6 测试用强化页面UI搭建
1 反向实现思路设计 先看最终效果: 先做了一个大致的分区,右侧的上半部分用来显示数据,下半部分用来强化和显示需要的材料,至于这个背景设定上强化应该叫什么,。。。。,还没定,反正应该不叫强…...
华为支付接入规范
为了确保用户获得良好的支付体验,Payment Kit制定了相关接入设计规范,请开发者遵照执行,具体要求(非强制性)如下: 一、支付方式呈现 涉及支付公司名称,请统一使用:花瓣支付ÿ…...
论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24
论文地址:Matrix Information Theory for Self-Supervised Learning 代码地址:https://github.com/yifanzhang-pro/matrix-ssl bib引用: article{zhang2023matrix,title{Matrix Information Theory for Self-Supervised Learning},author{Zh…...
左叶子之和(力扣404)
这道题需要将左右子树的左叶子结点之和不断返回给该左右子树的父节点,这是典型的后序遍历。如果大家对于二叉树的遍历不熟悉的话,可以先去看一下我的关于二叉树遍历的博客。否则直接看这道题是很容易懵逼的。熟悉了二叉树的遍历之后,大家可以…...
微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动
接口数据如上图 省市区多级联动,都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口,区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …...
iconfont等图标托管网站上传svg显示未轮廓化解决办法
打开即时设计 即时设计 - 可实时协作的专业 UI 设计工具 导入图标后拖入画板里面,右键选择轮廓化 将图标导出...
Mysql索引(学习自用)
目录 一、索引概述 优缺点 二、索引结构 1、索引数据结构 2、索引支持结构 3、B树 4、B树 5、hash索引 6、为啥采用B树索引 三、索引分类 四、索引语法 五、索引性能分析 5.1查看执行频率 5.2慢查询日志 5.3profiling 5.4explain 六、索引使用规则 6.1验证索…...
封装svg图片展示及操作组件——svgComponent——js技能提升
template部分 <template><div class"canvas-wrapper" ref"canvasWrapper"><svg:viewBox"computedViewBox"ref"svgCanvas"xmlns"http://www.w3.org/2000/svg"xmlns:xlink"http://www.w3.org/1999/xlink…...
数据从前端传到后端入库过程分析
数据从前端传到后端入库过程分析 概述 积累了一些项目经验,成长为一个老程序员了,自认为对各种业务和技术都能得心应手的应对了,殊不知很多时候我们借助了搜索引擎的能力,当然现在大家都是通过AI来武装自己。 今天要分析的话题是…...
【Pytest】结构介绍
1.目录结构介绍 project_root/ │ ├── tests/ # 测试用例存放目录 │ ├── __init__.py │ ├── test_module1.py │ ├── module1.py # 被测试的模块 ├── conftest.py # pytest配置文件,可定义fixture和钩子函数 ├── py…...
每日十题八股-2025年1月23日
1.快排为什么时间复杂度最差是O(n^2) 2.快排这么强,那冒泡排序还有必要吗? 3.如果要对一个很大的数据集,进行排序,而没办法一次性在内存排序,这时候怎么办? 4.面试官:你的…...
mysql相关知识(详细)
一、什么是数据库? 概念:数据库(Database,简称DB),长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据"仓库"。作用:存放管理数据分类:关系型数据库、NoSQL数…...
C++ 静态变量static的使用方法
static概述: static关键字有三种使用方式,其中前两种只指在C语言中使用,第三种在C中使用。 静态局部变量(C) 静态全局变量/函数(C) 静态数据成员/成员函数(C) 静态局部变量 静态局部变量&…...
对grid布局有哪些了解【css】
CSS Grid 布局是现代网页设计中非常强大的布局方式之一,它能够使你以更加灵活且直观的方式来设计网页的布局,特别适用于复杂的多行多列的布局。它允许你在网页上创建非常精确的网格,帮助你把内容放置在多个行和列中。 1. Grid 布局的基本概念…...
IOS 安全机制拦截 window.open
摘要 在ios环境,在某些情况下执行window.open不生效 一、window.open window.open(url, target, windowFeatures) 1. url:「可选参数」,表示你要加载的资源URL或路径,如果不传,则打开一个url地址为about:blank的空…...
低空经济(9)低空飞行器零部件供应商国内外厂家
低空飞行器零部件供应商国内外厂家 1.概述2.国内供应商2.1 动力系统2.2 航电系统2.3 机身结构部件2.4 传动系统2.5 液压系统与气动系统 3.国外供应商3.1 动力系统3.2 航电系统3.3 机身结构部件3.4 传动系统3.5 液压与气动系统 tips:资料来自网络,仅供参考…...
3b1b线性代数基础
零、写在前面 3b1b之前没认真看,闲了整理整理。 一、向量 学习物理的时候,向量是空间中的箭头。由其方向和长度决定。 学习数据结构的时候,向量是有序的数字列表。向量的每一维度有着不同含义。 线性代数中,我们通常认为**向量…...
困境如雾路难寻,心若清明步自轻---2024年创作回顾
文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份,我已写下一篇《近一年多个人总结》,当时还没开始写博客。四月份写博后,就顺手将那篇总…...
SAP 中的三种内表
文章目录 1 : Introduction2 : Summary3: Reerence document4 : Example 1 : Introduction In the abap development we deal with data and the carrier is internal table . it is transfered in the whole programe. In the interview we offten meet it . What is the dif…...
从0到1学习机器学习实践--1 安装Anaconda
机器学习首先安装conda环境,这个是比较靠谱手把手执行的安装教程 最新最全(亲测)的conda安装教程和虚拟环境安装环境配置...
整合管理输入、工具与技术 、输出
过程输入工具与技术输出制定项目章程1.项目立项文件2.协议3.事业环境因素4.组织过程资产1.专家判断2.数据收集头脑风暴、焦点小组、访谈3.人际关系与团队技能冲突管理、引导、会议管理4.会议1.项目章程2.假设日志制订项目管理计划1.项目章程2.其他过程输出3.事业环境因素4.组织…...
sed — 流编辑器:从入门到精通
内容速览 简介 sed(Stream Editor)是一个功能强大的文本处理工具,广泛应用于文本文件的自动化编辑和批量处理。它通过逐行读取文件内容并在内存中的临时缓冲区(即“模式空间”)中处理文本,实现高效的文本…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的Web…...
【Linux】文件操作、系统IO相关操作、inode和输入输出重定向
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…...
Prometheus+grafana实践:Doris数据库的监控
文章来源:乐维社区 Doris数据库背景 Doris(Apache Doris)是一个现代化的MPP(Massive Parallel Processing,大规模并行处理)数据库,主要用于在线分析处理(OLAP)场景。 D…...
c语言(转义字符)
前言: 内容: 然后记一下转义字符 \? 在书写连续多个问号时使用,防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠,防止他被解析为一个转义序列符 \n 换行 \r …...
TOGAF之架构标准规范-信息系统架构 | 数据架构
TOGAF是工业级的企业架构标准规范,信息系统架构阶段是由数据架构阶段以及应用架构阶段构成,本文主要描述信息系统架构阶段中的数据架构阶段。 如上所示,信息系统架构(Information Systems Architectures)在TOGAF标准规…...
快速排序:一种高效的排序算法
前言 排序是最基本和最常用的操作之一。无论是数据处理、搜索优化,还是各种应用程序的内部逻辑,排序算法的选择都直接影响到程序的性能。快速排序(Quick Sort)作为一种典型的分治算法,以其平均时间复杂度 O(n log n) 和优越的实际表现,成为了现代编程中最常用的排序算法…...
PHP:从入门到进阶的编程之旅
在Web开发的广阔天地中,PHP(Hypertext Preprocessor,超文本预处理器)无疑是一颗璀璨的明星。自1995年问世以来,PHP凭借其开源、跨平台、易于学习和使用的特性,迅速成为Web开发领域中最受欢迎的语言之一。本…...
Windows的docker中安装gitlab
一.Windows的docker中安装gitlab 1.通过阿里云拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lab99/gitlab-ce-zh 2.在本地创建备份数据的目录 mkdir -p D:home/software/gitlab/etc mkdir -p D:home/software/gitlab/logs mkdir -p D:home/software/gitlab/dat…...
计算机网络 (58)无线局域网WLAN
前言 无线局域网WLAN(Wireless Local Area Network)是一种利用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义: WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…...
LeetCode: 45.跳跃游戏II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode: 45.跳跃游戏II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示…...
Blazo-Blazor Web App项目结构
让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...
汇编语法及相关指令
1.汇编指令的基本格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand> opcode:指令的功能码,用来表示当前指令的作用 cond:条件码,需要在指令执行之前先判断条件受否满足&…...
数据结构——堆(介绍,堆的基本操作、堆排序)
我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴࿰…...
linux+docker+nacos+mysql部署
一、下载 docker pull mysql:5.7 docker pull nacos/nacos-server:v2.2.2 docker images 二、mysql部署 1、创建目录存储数据信息 mkdir ~/mysql cd ~/mysql 2、运行 MySQL 容器 docker run -id \ -p 3306:3306 \ --name mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/…...
10个非常基础的 Javascript 问题
Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN,JavaScript(通常缩写为JS)是一种轻量级的,解释性的,面向对象的语言,具有一流的功能,并且最著名的是Web页面…...
SCP收容物221~225
注 :此文接SCP收容物211~215,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-221 scp-222 scp-223 scp-224 scp-225 s…...
基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测
完整源码项目包获取→点击文章末尾名片! 番石榴病害数据集 背景描述 番石榴 (Psidium guajava) 是南亚的主要作物,尤其是在孟加拉国。它富含维生素 C 和纤维,支持区域经济和营养。不幸的是,番石榴生产受到降…...
网络(三) 协议
目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…...
【mptcp】ubuntu18.04和MT7981搭建mptcp测试环境操作说明
目录 安装ubuntu18.04,可以使用虚拟机安装... 2 点击安装VMware Tool 2 更新ubuntu18.04源... 4 安装ifconfig指令工具包... 5 安装vim工具包... 5...
递归的本质
字节面试题叠罗汉,很遗憾没想出来,看了答案挺巧妙的,但是居然是个案例题。。。 复习一下递归的本质 正面解决问题 利用子问题来解决 可以通过规约推导的,基本可以用递归解决! 在写这道算法题时,我想规…...