自动化运维之CI/CD下——持续集成与持续交付

目录

一、分离jenkins的构建功能——分布式构建

二、jenkins流水线——pipeline

1、新建简单的流水线项目:

2、在基础流水线上的改进

3、 流水线部署镜像——手动触发

 4、流水线触发——触发器自动触发

5、jenkins流水线结合钉钉报警

6、将jenkins脚本固定到gitlab中——Jenkinsfile

三、jenkins结合ansible批量部署apache


一、分离jenkins的构建功能——分布式构建

jenkins服务器默认功能为:

1、持续集成与持续交付

2、构建

但是实际成产环境中,要避免资源占用集中在一个节点上。因此需要将构建任务交给jenkins的“小弟”,即新建一个虚拟机作为jenkins的agent端,分担jenkins的工作量。

新建agent节点,命名为server5。

安装java支持:

#在server5上安装jdk
yum install -y java-1.8.0-openjdk.x86_64

#安装git
yum install -y git

 

 

这里添加server5的ssh用户名密码认证

 

agent节点添加完成后,如下所示:

 这时如果不需要master做构建任务的话,可以按以下步骤,将“构建进程数”设置为0

 

 这时master就不会有任何的构建进程了,也就不会参与构建。

server5的节点添加完成后,就可以用来参与构建了,所以需要先安装docker。

测试:查看构建步骤是否在agent上

可以看到,已经通过agent构建成功 

注意:此项目构建时是通过git执行,从gitlab上拉取代码。因此在agent端必须安装git,否则将会构建失败。

截至目前,已经将构建任务分配到server5的agent上,减少了jenkins的负载。

二、jenkins流水线——pipeline

在jenkins中添加任务时,如果手动一个一个添加,在生产环境中效率很低还容易出错。因此需要通过流水线的方式,将多个任务串在一起自动执行。

1、新建简单的流水线项目:

 

 

 

构建后,这个基础的流水线项目已经完成 。

2、在基础流水线上的改进

pipeline {
    agent any

    stages {
        stage('building') {
            steps {
                echo 'building'
            }
        }
        stage('testing') {
            steps {
                echo 'testing'
            }
        }
        stage('deploying') {
            steps {
                echo 'deploying'
            }
        }
    }
}

 构建后,可以看到具体步骤,就像一条流水线一样:构建——测试——部署。

实际操作时,可以根据提示来创建流水线脚本。

 

这里就生成了流水线脚本,将这个脚本复制后,放入流水线脚本中

 构建后查看构建日志,表明已经从git中获取到构建文件。

在本地目录下也可以看到这个任务获取的文件

3、 流水线部署镜像——手动触发

 流水线脚本如下:分别为拉取git——>构建镜像并推送——>在server4中部署镜像

pipeline {
    agent any

    stages {
        stage('check out') {
            steps {
                git branch: 'main', credentialsId: '532f31f7-2a10-4ae8-92f5-a8a9ed0ba62f', url: 'git@172.25.254.2:root/project1.git'
            }
        }
        stage('build image and push') {
            steps {
                sh '''
                    cd $WORKSPACE
                    docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
                    docker login reg.westos.org -u admin -p westos
                    docker push reg.westos.org/library/demo:${BUILD_NUMBER}
                    docker tag reg.westos.org/library/demo:${BUILD_NUMBER} reg.westos.org/library/demo:latest
                    docker push reg.westos.org/library/demo:latest
                '''
            }
        }
        stage('docker deploy') {
            steps {
                sh '''
                    ssh -i /root/.ssh/id_rsa root@172.25.254.4 """
                        docker ps -a | grep myweb && docker rm -f myweb
                        docker rmi demo:latest
                        docker run -d --name myweb -p 80:80 demo:latest
                    """
                '''
            }
        }
    }
}

测试:

执行完毕后,已经在server4中构建好了镜像,浏览器访问<172.25.254.4>,检查已经构建成功。

 注意:

(1)构建时,server4中的</var/run/docker.sock>文件的权限必须为jenkins用户可执行,否则将会构架失败,建议设置为777。

(2)通过jenkins的agent端构建,即server5必须对server4做到免密。否则也会构建失败。

 4、流水线触发——触发器自动触发

在jenkins中添加触发器后,保存:

 

在gitlab中添加变动通知后,保存:

测试:

更改gitlab客户端的项目文件(server2中),并推送到gitlab。

5、jenkins流水线结合钉钉报警

钉钉机器人插件,官方文档:

在 pipeline 中使用 | 钉钉机器人插件在 Jenkins 中使用钉钉机器人发送消息https://jenkinsci.github.io/dingtalk-plugin/guide/pipeline.html

 第一步:创建钉钉群,并添加群机器人,拿到“Webhook”地址

 第二步:jenkins安装钉钉报警插件

 第三步:在jenkins的系统设置中添加钉钉,完成后保存

9——上一步拿到的钉钉群的链接

10——关键字,和钉钉群里设置的机器人的关键字保持一致

 添加完成后,会在钉钉群里收到机器人消息,提示绑定成功。

同时,保存后会自动在系统设置中生成机器人的ID

第四步:在devops项目脚本中添加钉钉,完成后保存退出

pipeline {
    agent any

    stages {
        stage('check out') {
            steps {
                git branch: 'main', credentialsId: '532f31f7-2a10-4ae8-92f5-a8a9ed0ba62f', url: 'git@172.25.254.2:root/project1.git'
            }
        }
        stage('build image and push') {
            steps {
                sh '''
                    cd $WORKSPACE
                    docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
                    docker login reg.westos.org -u admin -p westos
                    docker push reg.westos.org/library/demo:${BUILD_NUMBER}
                    docker tag reg.westos.org/library/demo:${BUILD_NUMBER} reg.westos.org/library/demo:latest
                    docker push reg.westos.org/library/demo:latest
                '''
            }
        }
        stage('docker deploy') {
            steps {
                sh '''
                    ssh -i /root/.ssh/id_rsa root@172.25.254.4 """
                        docker ps -a | grep myweb && docker rm -f myweb
                        docker rmi demo:latest
                        docker run -d --name myweb -p 80:80 demo:latest
                    """
                '''
            }
        }
    }
    post {
        success {                                                //上线成功通知
            dingtalk (
            robot: 'bb9fc898-4e76-47ca-9e32-4ee358d06e25',     //钉钉机器人ID,由上一步可得
            type: 'TEXT',
            at: ["15503671030"],                //要@谁
            atAll: false,
            title: 'jenkins',
            text: ["online success"],
            hideAvatar: false
            )
        }
        failure {                                                //上线失败通知
            dingtalk (
            robot: 'bb9fc898-4e76-47ca-9e32-4ee358d06e25',
            type: 'TEXT',
            at: ["15503671030"],
            atAll: false,
            title: 'jenkins',
            text: ["online failure"],
            hideAvatar: false
            )
        }
    }
}

第五步:测试,构建devops项目,在钉钉群里可以收到通知。

 

6、将jenkins脚本固定到gitlab中——Jenkinsfile

由于直接在jenkins中编辑脚本,不容易做版本控制及审计,因此一般将脚本以文件的格式存储在gitlab中,方便管理。

第一步:在gitlab中新建项目,并克隆到本地

 

第二步:git客户端编辑<Jenkinsfile>,内容上述devops项目的脚本。更改完成后提交并推送到gitlab

[root@server2 devops]# vim Jenkinsfile
[root@server2 devops]# git add Jenkinsfile
[root@server2 devops]# git commit -m "add Jenkinsfile"
[root@server2 devops]# git push -u origin main 

第三步:在jenkins上更改devops配置,完成后保存

注意:取消项目之前设置的触发器。

第四步:测试: 构建完成后,在钉钉上收到构建成功的通知

基本逻辑是:

开始构建——>从gitlab中获取Jenkinsfile——>执行Jenkinsfile中的流水线步骤。

三、jenkins结合ansible批量部署apache

实验环境:在上一步实验的基础上,server1作为harbor仓库;server2作为gitlab客户端;server3作为jenkins客户端;server4和server5作为客户主机。

注意:在jenkins的节点控制上删除之前设置的server5作为agent节点,让server3既做集成交付,也作构建。

第一步:在server3上安装ansible

以<ansible-2.8.5-1.el7.noarch.rpm>为例

第二步:在gitlab上新建一个<ansible>项目,用来存放playbook。并将项目克隆到gitlab客户端

 第三步:在serber2上编辑absible配置文件、对象清单和yaml文件。

分别针对两台主机列出两个清单,server4用来测试,server5用来模拟生产环境部署。

[root@server2 ansible]# cat ansible.cfg 
[defaults]
command_warnings=False
remote_user=devops                //指定远程主机的执行时的用户身份,不写默认为jenkins用户,但远程主机不存在jenkins用户,还是得创建

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

 对象清单:

 yml文件(playbook剧本)和j2模板:

[root@server2 ansible]# cat playbook.yml 
---
- hosts: all
  tasks:
  - name: install http
    yum:
      name: httpd
      state: present
  - name: create index.html
    template:
      src: index.html.j2
      dest: /var/www/html/index.html
  - name: start httpd
    service:
      name: httpd
      state: started
      enabled: yes

[root@server2 ansible]# cat index.html.j2 
{{ ansible_hostname }}

项目结构如下所示:

第四步:提交ansible项目到gitlab仓库上

第五步:在jenkins上新建<playbook>项目,完成后保存。

 

 12——git地址为gitlab中ansible项目的克隆地址

 第六步:参数化构建——仅让jenkins从gitlab上拉取项目

jenkins默认的文件存放目录为</var/lib/jenkins/workspace/>,参数化构建完成后,可以在工作目录中查看到目标gitlab项目文件,如下所示。

第七步:在server4和server5中创建devops用户并授权。

由于ansible是通过ssh远程连接用户的方式批量部署的,所以远程主机中需要存在执行命令的用户。本项目中指定远程的执行用户身份为<devops>。因此在server4/5中要新建这个用户并设置密码,并通过sudo的方式授权此用户免root密码执行所有命令。

 

第八步:添加server3中jenkins用户对远程主机devops用户的免密连接

 第九步:更改kenjins中构建完成后的执行脚本,保存后退出。

注意:参数变量的使用

cd $WORKSPACE                        //进入工作目录</var/lib/jenkins/workspace/playbook>
ansible-playbook -i inventory/${deploy} playbook.yml         //${deploy}为上边定义的参数变量

 第十步:测试

选择deploy参数中的test参数构建,查看ansible部署效果。

查看构建后的控制台输出,ansible已经在test清单中部署成功

在浏览器测试:访问<172.25.254.4>,可以看到其域名

 接着选择deploy参数中的prod参数构建,查看ansible部署效果。

基本逻辑为:

1、gitlab客户端编写好ansible项目文件,并上传到gitlab服务器中

2、jenkins从gitlab中拉取ansible的项目文件到自己的工作目录下

3、拉取完成后,执行shell脚本。脚本中定义了deploy的两个参数(test和prod)清单

4、jenkins客户端以自己主机中jenkins用户的身份,通过ansible免密连接远程主机的devops用户部署httpd服务。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值