查看原文
其他

离了蓝鲸也能交付虚拟机

木讷大叔爱运维 木讷大叔爱运维 2022-07-13



简介

之前通过jenkins+ansible实现了系统初始化的功能,另外内部还有一套cobbler实现操作系统无人值守安装。虽然给工作带来了方便,但是仍需运维人员进行人工干预,借助于jenkins的流水线,我们在此将两项工作进行结合自动化执行,实现虚拟机的交付。

规划

jenkins构建时,通过传入IP及选择不同的操作系统模板参数,使用相应的修改后模板,进行不同规范的操作系统安装。

注意:结合我们的生产环境规范,我们将操作系统模板分为两个,一个是ks_root(只有跟目录的系统),一个是ks_app(根+/App 目录的系统)

流程:

  1. 提前建好vsphere虚拟机;

  2. cobbler配置所需模板;

  3. 手动重启vsphere虚拟机进入无人值守安装,大约10分钟;

  4. 恢复pxe配置文件,防止正常系统重启进入pxe安装

  5. 等待10min安装完系统,调用init_os job进行系统初始化

准备


job
备注
init_os
jenkins的一个job,结合ansible实现的系统初始化功能
cobbler环境
一套tftp+dhcp+pxe实现的操作系统自动安装环境

以上两项任务在此不做过多说明。

pipeline设置参数


此操作将定义全局的环境变量:
HOST_IP 分配的ip地址;
KS_TEMPLATE 使用的pxe模板文件,ks_app和ks_root;

编写pipeline

以下使用声明式pipeline,将分阶段分析:

1.分析IP阶段

stage('分析IP') { steps { sh label: '', script: ''' #!/bin/bash echo "\033[34m判断IP合法性 \033[0m" [ `echo ${HOST_IP} | awk -F . '{print NF}'` -ne 4 ] && { echo -e "\033[31m${HOST_IP}不合法,请查看IP \033[0m"; exit 1; } count=`ping -c 4 ${HOST_IP} |grep "100% packet loss" | wc -l` [ $count -ne 0 ]&& echo "\033[32m${HOST_IP}未分配,请正常使用 \033[0m" || { echo "\033[31m${HOST_IP}已分配,请更换其他IP \033[0m"; exit 1; }''' } post { success { echo "\033[34m配置pxe \033[0m" sshPublisher(publishers: [sshPublisherDesc(configName: 'prod-3.137', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: ''' echo "\033[34m更改IP地址 \033[0m" cd /var/www/html/ks/nodes/ sed -i "s/IP=/IP=${HOST_IP}/g" ${KS_TEMPLATE} [ $? -eq 0 ] && echo "\033[32m更改IP地址成功 \033[0m" || { echo "\033[31m更改IP地址失败 \033[0m" ; exit 1; }
echo "\033[34m修改tftp配置文件 \033[0m" cd /tftpboot/pxelinux.cfg sed -i "s/nodes/nodes\\/${KS_TEMPLATE}/g" default [ $? -eq 0 ] && echo "\033[32m修改tftp配置文件成功 \033[0m" || { echo "\033[31m修改tftp配置文件失败 \033[0m" ; exit 1; }''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
} } }

其中:

  1. 判断ip是否合法并且在生产环境中是否未分配
    使用了"sh: Shell Script"在此判断了ip是否为X.X.X.X,而没有实现ip是否合法,可以补充。
    a.如果ip不合法,流水线将终止;
    b.如果ip合法,但ip已经分配,则流水线将终止;
    c.如果ip合法,且ip未分配,则通过"post: Post Stage or Build Conditions"实现若a、b成功,则执行post中的pxe的模板文件修改的操作:主要为将ip,写入到模板配置文件;并设置tftp的相关设置。

  2. 使用"sshPublisher : send build artifacts over ssh",远程登录pxe服务器修改pxe配置文件
    主要调用构建时选择的HOST_IP、KS_TEMPLATE

2.pxe系统安装阶段

stage("pxe系统安装") { steps { echo "\033[34mpxe系统安装 \033[0m" sleep 600 } }

进入此阶段前,我们需要提前建好vsphere虚拟机或服务器;
进入此阶段后,我们需要手动重启服务器并选择pxe进入操作系统安装;
整个系统安装我们预估在6分钟左右,在此我设置"sleep 600" (10分钟)等待操作系统完全安装完毕并重启。

我们也可以使用"input: Input"来提示pipeline的互动继续及放弃操作。

注意:
由于我们使用的vsphere,本计划使用python+pyvmomi上线虚拟机的自动重启,但是此操作需要虚拟机提前安装vmwaretools,而安装vmwaretools前提是需要操作系统。因此我们使用手动重启。
感兴趣的朋友可以看下vmware自定义规范定制虚拟机-python来了解下。

3.恢复pxe阶段

stage("恢复pxe") { steps { sshPublisher(publishers: [sshPublisherDesc(configName: 'prod-3.137', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: ''' echo "\033[34m删除IP地址配置 \033[0m" cd /var/www/html/ks/nodes/ sed -i "s/IP=${HOST_IP}/IP=/g" ${KS_TEMPLATE} [ $? -eq 0 ] && echo "\033[32m删除IP地址成功 \033[0m" || { echo "\033[31m删除IP地址失败 \033[0m" ; exit 1; }
echo "\033[34m恢复tftp配置文件 \033[0m" cd /tftpboot/pxelinux.cfg sed -i "s/\\/${KS_TEMPLATE}//g" default [ $? -eq 0 ] && echo "\033[32m恢复tftp配置文件成功 \033[0m" || { echo "\033[31m恢复tftp配置文件失败 \033[0m" ; exit 1; }''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } }

操作系统安装完成后,我们需要恢复pxe模板设置,防止生产环境中有系统重启情况导致系统重装。
使用"sshPublisher : send build artifacts over ssh",远程登录pxe服务器修改pxe配置文件使用"sshPublisher : send build artifacts over ssh",远程登录pxe服务器修改pxe配置文件。

4.系统初始化阶段

stage("系统初始化") { steps { echo "\033[34m正在进行系统初始化 \033[0m" build job: 'init_os', parameters: [string(name: 'host_ip', value: "${HOST_IP}")] } }

此阶段,pipeline将调用init_os job,并传输HOST_IP参数,进行操作系统的初始化,主要为:

  1. selinux、ntp、内核参数、crontab、基础工具安装等;

  2. ssh安全设置;

  3. zabbix 客户端及其他;

  4. 规范化目录;

  5. 防火前初始化脚本;

5.整个piple的完整代码

pipeline { agent any options { ansiColor('xterm') timestamps() } stages { stage('分析IP') { steps { sh label: '', script: ''' #!/bin/bash echo "\033[34m判断IP合法性 \033[0m" [ `echo ${HOST_IP} | awk -F . '{print NF}'` -ne 4 ] && { echo -e "\033[31m${HOST_IP}不合法,请查看IP \033[0m"; exit 1; } count=`ping -c 4 ${HOST_IP} |grep "100% packet loss" | wc -l` [ $count -ne 0 ]&& echo "\033[32m${HOST_IP}未分配,请正常使用 \033[0m" || { echo "\033[31m${HOST_IP}已分配,请更换其他IP \033[0m"; exit 1; }''' } post { success { echo "\033[34m配置pxe \033[0m" sshPublisher(publishers: [sshPublisherDesc(configName: 'prod-3.137', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: ''' echo "\033[34m更改IP地址 \033[0m" cd /var/www/html/ks/nodes/ sed -i "s/IP=/IP=${HOST_IP}/g" ${KS_TEMPLATE} [ $? -eq 0 ] && echo "\033[32m更改IP地址成功 \033[0m" || { echo "\033[31m更改IP地址失败 \033[0m" ; exit 1; }
echo "\033[34m修改tftp配置文件 \033[0m" cd /tftpboot/pxelinux.cfg sed -i "s/nodes/nodes\\/${KS_TEMPLATE}/g" default [ $? -eq 0 ] && echo "\033[32m修改tftp配置文件成功 \033[0m" || { echo "\033[31m修改tftp配置文件失败 \033[0m" ; exit 1; }''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
} } } stage("pxe系统安装") { steps { echo "\033[34mpxe系统安装 \033[0m" sleep 600 } } stage("恢复pxe") { steps { sshPublisher(publishers: [sshPublisherDesc(configName: 'prod-3.137', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: ''' echo "\033[34m删除IP地址配置 \033[0m" cd /var/www/html/ks/nodes/ sed -i "s/IP=${HOST_IP}/IP=/g" ${KS_TEMPLATE} [ $? -eq 0 ] && echo "\033[32m删除IP地址成功 \033[0m" || { echo "\033[31m删除IP地址失败 \033[0m" ; exit 1; }x echo "\033[34m恢复tftp配置文件 \033[0m" cd /tftpboot/pxelinux.cfg sed -i "s/\\/${KS_TEMPLATE}//g" default [ $? -eq 0 ] && echo "\033[32m恢复tftp配置文件成功 \033[0m" || { echo "\033[31m恢复tftp配置文件失败 \033[0m" ; exit 1; }''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } stage("系统初始化") { steps { echo "\033[34m正在进行系统初始化 \033[0m" build job: 'init_os', parameters: [string(name: 'host_ip', value: "${HOST_IP}")] } } }}

6.构建输出

总结

通过以上流水线工作,我们将虚拟机上架的流程实现了,而且时间缩短为10分钟左右,大大提高了我们的工作效率,但是自动化的前提是我们有一套完整的规范。


其实以上这套流程,也可以通过蓝鲸标准运维打通vsphere、jumpserver、cmdb、zabbix,将上线时间缩短至分钟级别。毕竟效率的提高,也是我们通过DevOps的很重要的一部分。




腾讯蓝鲸实现vsphere虚拟机交付

蓝鲸实现vsphere虚拟机交付 -虚拟机管理(VSPHERE)

蓝鲸实现虚拟机交付-跳板机管理(JUMP)

蓝鲸实现虚拟机交付-配置平台(CMDB)

vmware自定义规范定制虚拟机-python

vcenter自定义规范定制虚拟机-vsphere client







扫描二维码

获取更多精彩



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存