跳过正文
  1. Posts/

这也能用Jenkins?快速实现一个定期批量登录远程虚拟机并支持添加新的主机名称的Job

·910 字·2 分钟· ·
沈显鹏
作者
沈显鹏
目录

背景
#

实现定期批量登录远程虚拟机然后进行一些指定的操作,还支持用户添加新的 hostname。

需求分解
#

通过一个简单的 shell 脚本可实现定期进行 ssh 登录操作,但如何实现的更优雅一些就需要花点时间了,比如:

  1. 定期自动执行
  2. 输出比较直观的登录测试结果
  3. 支持用户添加新的虚拟机 hostname 到检查列表中
  4. 执行完成后,通知用户等等

希望在不引入其他 Web 页面的情况下通过现有的工具 Jenkins 使用 Shell 脚本如何实现呢?

  1. 写一个脚本去循环一个 list 里所有的 hostname,经考虑这个 list 最好是一个 file,这样方便后续处理。
  2. 这样当用户通过执行 Jenkins job 传入新的 hostname 时,使用新的 hostname 到 file 里进行 grep,查看是否已存在。
  3. 如果 grep 到,不添加;如果没有 grep 到,将这个 hostname 添加到 file 里。
  4. 将修改后的 file 添加到 git 仓库里,这样下次 Jenkins 的定时任务就会执行最近添加的 hostname 了。

实现重点
#

  1. 使用 expect。在使用 ssh 连接远程虚拟机的时候需要实现与远程连接时实现交互,例如:可以期待屏幕上的输出,然后进而进行相应的输入。在使用 expect 之前需要先安装,以 Redhat 的安装命令为例: sudo yum install expect 来进行安装。

    更多有关 expect 使用的可以参看这个连接:http://xstarcd.github.io/wiki/shell/expect.html

  2. 使用了 Shell 数组。使用 Shell 读取文件数据,进行登录操作,将操作失败的记录到一个数组里,然后打印出来。

  3. 在通过 Jenkins 提交新的 hostname 到 Git 仓库时,origin 的 URL 需要是 https://${USERNAME}:${PASSWORD}@git.company.com/scm/vmm.gitgit@company.com:scm/vmm.git(需要提前在执行机器上生成了 id_rsa.pub)

代码已经上传 GitHub 请参看 https://github.com/shenxianpeng/vmm.git

最终效果
#

开始执行,提供输入新的 hostname
#

Bulid with parameters

执行完成,将执行结果归档以便查看
#

VM 检查结果

打开归档结果如下
#

#####################################################
######### VM login check via SSH results ############
#####################################################
#                                                   #
# Compelted (success) 14/16 (total) login vm check. #
#                                                   #
# Below 2 host(s) login faied, need to check.       #
#                                                   #
      abc.company.com
      xyz.company.com
#                                                   #
#####################################################

最后
#

现在技术的更新非常快,尤其作为 DevOps 工程师,各种工具层出不穷,想要每一样工具都掌握几乎是不可能的。

只会工具不了解其背后的原理,等到新工具出现替换掉旧的工具,其实这些年是没有进步的。

只有认真的把在工作中遇到的每个问题背后来龙去脉去搞懂,才能地基打的稳,这样不论工具怎么变,学习起来都会很快。

掌握操作系统,Shell,以及一门擅长的编程语言之后再去学习那些工具,要不永远都是漂浮在空中。

相关文章

如何设置 NFS 共享以及在不同的平台 Windows/Linux/Unix 进行挂载
·678 字·2 分钟
本文介绍了如何设置 NFS 共享以及在不同平台(Windows/Linux/Unix)上进行挂载的步骤和命令。
在 Jenkins pipeline 中执行 sudo 的时候不需要输入密码
·331 字·1 分钟
本文介绍了如何在 Jenkins Pipeline 中执行 sudo 命令而无需输入密码,提供了具体的实现方法和示例代码。
Jenkins Linux Agent 配置
·353 字·1 分钟
本文提供了 Jenkins Linux Agent 的逐步配置指南,包括 Java 运行时的准备、节点创建以及常见问题的排查方法。
Jenkins Windows Agent 配置
·608 字·2 分钟
本文提供 Jenkins Windows Agent 的详细配置步骤,包括 Java 运行时准备、节点创建以及常见问题的排查方法。
如何将 Bitbucket 仓库同步到 GitHub
·1218 字·3 分钟
介绍如何通过 Jenkins 将 Bitbucket 仓库的 master 分支同步到 GitHub。
如何确保在提交 Jenkins Pipeline 前没有语法错误
·962 字·2 分钟
本文介绍了两种方法来确保在提交 Jenkins Pipeline 前没有语法错误:使用 REST API 进行语法校验和使用 VSCode 插件进行语法检查。