离了蓝鲸也能交付虚拟机
简介
之前通过jenkins+ansible实现了系统初始化的功能,另外内部还有一套cobbler实现操作系统无人值守安装。虽然给工作带来了方便,但是仍需运维人员进行人工干预,借助于jenkins的流水线,我们在此将两项工作进行结合自动化执行,实现虚拟机的交付。
规划
jenkins构建时,通过传入IP及选择不同的操作系统模板参数,使用相应的修改后模板,进行不同规范的操作系统安装。
注意:结合我们的生产环境规范,我们将操作系统模板分为两个,一个是ks_root(只有跟目录的系统),一个是ks_app(根+/App 目录的系统)
流程:
提前建好vsphere虚拟机;
cobbler配置所需模板;
手动重启vsphere虚拟机进入无人值守安装,大约10分钟;
恢复pxe配置文件,防止正常系统重启进入pxe安装
等待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)])
}
}
}
其中:
判断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的相关设置。使用"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参数,进行操作系统的初始化,主要为:
selinux、ntp、内核参数、crontab、基础工具安装等;
ssh安全设置;
zabbix 客户端及其他;
规范化目录;
防火前初始化脚本;
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)
vcenter自定义规范定制虚拟机-vsphere client
扫描二维码
获取更多精彩