jenkins流水线之pxe安装系统及系统初始化

简介

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

规划

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

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

流程:

  1. 提前建好vsphere虚拟机
  2. 配置pxe配置文件
  3. 手动重启vsphere虚拟机并选择pxe安装系统
  4. 恢复pxe配置文件,防止正常系统重启进入pxe安装
  5. 等待10min安装完系统,调用init_os job进行系统初始化

准备

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

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

pipeline实现

一.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,而没有实现X是否合法,可以补充。
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前提是需要操作系统。因此我们使用手动重启。
感兴趣的朋友可以看下GitHub vmware/pyvmomi,使用sample中的例子进行vsphere的管理。

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参数,进行操作系统的初始化,主要为:
a.repo、selinux、ntp、内核参数
b.ssh安全设置
c.zabbix 客户端及其他
d.规范化目录
e.防火前初始化脚本

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; }
    
                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.构建输出

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章