参赛作品
大家好 半年以来,我们一直在运行一个脚本(更确切地说是一组脚本),该脚本生成有关虚拟机状态的报告(不仅如此)。 我决定分享创建经验和代码本身。 我指望批评以及该材料可能对某人有用的事实。
我们有很多虚拟机(在第三个vCenter上分布了大约1500个VM)。 新的被创建,而旧的被经常删除。 为了保留顺序,在vCenter中添加了几个自定义字段,以将VM划分为多个子系统,指示它们是否在测试中,以及由谁以及何时进行测试。 人为因素导致以下事实:一半以上的汽车留有空旷的场地,这使工作变得复杂。 每六个月一次,有人吓坏了,开始着手更新这些数据,但是结果在一个半星期内不再有意义。
我将立即澄清,每个人都知道应该有用于创建计算机的应用程序,用于创建计算机的过程等。 等 虽然严格遵守了所有这些过程,但是这些都是有序的。 不幸的是,事实并非如此,但这不是本文的主题:)
通常,决定自动执行填充字段正确性的验证。
我们决定每天写一封信,列出所有负责任的工程师及其上司不正确填充的机器,这是一个好的开始。
此时,一位同事已经实现了一个PowerShell脚本,该脚本每天按计划收集所有vCenter-s的所有计算机上的信息,并形成3个csv文档(每个都在其自己的vCenter中),这些文档放置在共享磁盘上。 决定以该脚本为基础,并使用我曾经有过使用R语言的检查功能对其进行补充。
在完成过程中,该解决方案过于庞大,无法通过邮件通知,包含主表和历史表的数据库(稍后会详细介绍)以及分析vSphere日志以查找vm的实际创建者及其创建时间。
为了进行开发,我们使用了IDE RStudio桌面和PowerShell ISE。
该脚本是从常规Windows虚拟机启动的。
一般逻辑的描述。
脚本的一般逻辑如下。
- 我们使用PowerShell脚本(通过R调用)在虚拟机上收集数据,结果被合并到一个csv中。 语言之间的反向交互类似地进行。 (可以以变量的形式将数据直接从R驱动到PowerShell,但这很困难,即使使用中间的csv,也可以更轻松地与某人调试和共享中间结果)。
- 使用R,我们为要检查其值的字段形成有效的参数。 -我们正在形成一个Word文档,其中将包含这些字段的值,以便插入到信息信函中,这将是对同事问题的答案:“不好,但是我应该如何填写?”
- 我们使用R从csv加载所有VM上的数据,形成一个数据框,删除不必要的字段,并形成一个信息xlsx文档,其中将包含有关我们上载到共享资源的所有VM的摘要信息。
- 对于所有VM的数据框,我们将应用所有检查以检查字段填充的正确性,并形成一个表,该表仅包含字段填充错误(仅这些字段)的VM。
- 虚拟机的结果列表将发送到另一个PowerShell脚本,该脚本将查看vCenter日志中有关虚拟机创建事件的信息,该脚本将允许您指定虚拟机的创建时间和预期的创建者。 当没有人认罪谁的车时就是这种情况。 该脚本无法快速运行,尤其是在有大量日志的情况下,因此我们仅查看最近两周的时间,并且还使用工作流,该工作流使您可以同时搜索多个VM上的信息。 在示例脚本中,有关于此机制的详细注释。 将结果添加到csv,然后再次加载到R中。
- 我们形成了格式精美的xlsx文档,其中错误填写的字段将以红色突出显示,过滤器将应用于某些列,并且还会显示其他包含所谓的创建者和VM创建时间的列。
- 我们形成一封电子邮件,在其中放置描述有效字段值的文档以及错误填写的表格。 在文本中,我们指示错误创建的VM的总数,指向共享资源的链接和动机映像。 如果没有错误填充的虚拟机,我们将发送一封带有更令人兴奋的动机图片的信。
- 考虑到历史表的已实现机制(一种非常有趣的机制-有关该机制的更多信息),我们将数据记录在SQL Server数据库中的所有VM上
剧本
PowerShell脚本提取虚拟机创建者的日志及其创建日期 xlsx库值得特别注意,这使得可以使字母的附件格式清晰(如手册中所述),而不仅仅是csv表。
输出是这样的:

设置Windows调度程序也有一个有趣的细微差别。 选择正确的权限和设置参数无法正常工作,因此一切都会按预期进行。 结果,找到了R库,R库本身创建了一个运行R脚本的任务,甚至没有忘记日志文件。 然后,您可以用笔更正任务。
一段带有两个示例的R代码,这些示例在Windows Scheduler中创建任务 library(taskscheduleR) myscript <- file.path(getwd(), "all_vm.R")
另外,关于数据库
设置脚本后,其他问题开始出现。 例如,我想查找删除虚拟机的日期,并且vCenter中的日志已经磨损。 由于脚本每天都会将文件放入文件夹中并且不会对其进行清理(记住时我们会用手清理它),因此您可以查看旧文件并查找该虚拟机不存在的第一个文件。 但这并不酷。
我想创建一个历史数据库。
MS SQL SERVER功能有助于实现-系统版本的时间表。 它通常被转换为临时(非临时)表。
您可以在Microsoft官方文档中详细阅读。
简而言之,我们创建了一个表,我们说它将具有版本控制功能,并且SQL Server在该表中创建2个其他datetime列(创建记录的日期和记录到期的日期)以及一个将写入更改的表。 结果,我们获得了相关的信息,并且通过简单的查询(在文档中给出了示例),我们可以查看特定虚拟机的生命周期或特定时间点所有VM的状态。
在性能方面,直到完成对临时表的写入事务之前,不会完成对主表的写入事务。 即 在具有大量写操作的表上,应谨慎实现此功能,但对我们而言,这是一件很酷的事情。
为了使该机制正常工作,有必要在R上添加一小段代码,该代码将新表与所有VM的数据与存储在数据库中的VM的数据进行比较,并仅向其中写入更改的行。 该代码不是很棘手,它使用了compareDF库,但我也将在下面给出。
合计
由于引入了脚本,订单被维持了几个月。 有时会出现填充错误的VM,但是脚本可以很好地提醒您,罕见的VM连续两天进入列表。
还为历史数据分析预留了资金。
显然,其中的大部分不是“一the而就”的,而是可以通过专用软件实现的,但是这项任务很有趣,而且可以说是可选的。
再一次,R被证明是一种出色的通用语言,它不仅是解决统计问题的完美选择,而且还充当了其他数据源之间的完美“铺垫”。