Jenkins+Pipeline+Ansible 自动化部署(3)

这篇文章是在 Jenkins+Pipeline基础上开发的  Jenkins构建发布Pipeline流水线项目

1.安装ansible

 简单网上很多文章,就不介绍了

2.配置ansible

2.1.配置hosts文件

[web]
127.0.0.1 ansible_connection=local
192.168.40.142

[web1]
192.168.40.142 ansible_ssh_user='root' ansible_sudo_pass='密码' ansible_ssh_pass='密码' ansible_su_pass='密码'

web简单配置,这个配置的前提的ssh已经同步到远程服务器了,即 生成秘钥  ssh-keygen

2.2.编写 variables.yml 文件

---
- hosts: "{{host | default('web')}}" ##all
  remote_user: root

  tasks:
    - name: "copy webdir"
      synchronize: src={{workspace}}/ dest=/www/item/{{item}} rsync_opts=--delete  rsync_opts="--exclude={{exclude}}"
{{host | default('web')}}  指定hosts中的服务器,默认是web
{{workspace}}  是需要同步的目录
{{item}} 远程项目名称(主要是为了和pipeline脚本保存一致)
{{exclude}} 忽略的同步的文件/文件夹

3.通过ansible来多节点发布

3.1 pipeline脚本式代码:

node {
      //全局变量(外部可以使用,比如shell中使用)
      env.ENVI = "test"   //定义环境
      env.WECHAT_TOKEN = "key"
      env.ERRI = "false"
      env.WORKSPACE = "/www/jenkins/workspace/${JOB_NAME}"    //项目目录,根据jenkins来设置 ${JOB_NAME} 项目名称

      //局部变量(在shel中不能使用)
      def GIT_URL = "git地址"

     try{
          stage('拉取代码') {     //拉取代码
             echo '拉取代码开始'
             checkout([
                 $class: 'GitSCM', branches: [[name: '${TAGNAME}']],
                 extensions: [[$class: 'CleanCheckout', deleteUntrackedNestedRepositories: true]],
                 userRemoteConfigs: [[credentialsId: '4e89640d-3576-4043-a4e2-47d', url: "${GIT_URL}"]]
             ])
             echo "拉取的TAG:${TAGNAME}"
             echo '拉取代码结束'
          }
          stage('编译打包') {        // 编译打包
             echo '编译打包开始'
             echo '编译打包结束'
          }
          stage('部署上线') {
             echo '部署上线开始'            
// variables.yml 文件 sh 'ansible-playbook -e "host=wb workspace=${WORKSPACE} item=${JOB_NAME} exclude=.git*" /etc/ansible/variables.yml' echo '部署上线结束' } env.RESULT = currentBuild.currentResult }catch(err){ echo "编译失败,错误原因如下:${err} " env.ERRI = "true" env.RESULT = "FAILURE:\n ${err}" }finally{ } //获取构建用时 env.DURATION_STRING = currentBuild.durationString //企微通知 sh 'sh /var/lib/jenkins/pipeline/wechat_send.sh "${WECHAT_TOKEN}" \ "${ENVI}" \ "${JOB_NAME}" \ "${TAGNAME}" \ "${BUILD_DISPLAY_NAME}" \ "${DURATION_STRING}" \ "${RESULT}" \ "${BUILD_USER}"' //判断是否失败,如果是强制显示失败图标 if(env.ERRI == "true"){ script { error "${ERRI}" } } }

3.2 构建/发布

 

 

问题:

1.发布到一半,发布系统出现问题,导致项目服务器代码不同步怎么处理?

解决方案:每次发到项目服务器时命名不同的文件夹,比如 项目名称_时间。。。  然后在代码全部上传完之后,再把项目真正的目录 软链(ln -s 源文件 目标文件) 到刚刚上传的目录(项目名称_时间。。。)

 

posted @ 2022-05-07 15:26  晴箜万里  阅读(470)  评论(0编辑  收藏  举报