jenkins使用ansible去同时发布多个机器

时间:2024-01-23 15:28:56

一 在jenkins节点安装ansible

1.1 安装ansible

yum install ansible -y

1.2 设置配置文件

cat /etc/ansible/hosts
[java]
172.22.178.214

二 拷贝公钥到各个目标服务器


#拷贝root用户公钥-在jenkins服务器上执行
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.22.178.214
 ansible java -m shell -a 'pwd'
172.22.178.214 | CHANGED | rc=0 >>
/root

三 配置jenkins使用ansible

3.1 配置jenkins

配置分支 要选择 git参数,如果没有,则需要安装插件 Git Parameter image.png

配置git 仓库 image.png

配置maven-找到全局工具配置 image.png

image.png

此脚本需要传输两个参数,主机名(ansible配置文件里的)和项目名 image.png

3.2 配置shell脚本在jenkins服务器上

这个脚本是配置在jenkins服务器上的,这个脚本需要传入两个参数,host和项目名。其中重启服务的脚本是在目标机器上

#!/bin/bash

jar_file=`ls ${WORKSPACE}/${Branch}/target/*.jar`

DATE=`date +"%Y-%m-%d-%H-%M"`
HOST=$1 #hwtest,pre_shandong,pre_zuigaoyuan
project=$2
commond="cat /etc/profile | grep 'export JAVA_HOME' |cut -d '=' -f 2"

cmd=`ansible $HOST -m shell -a "$commond" -b`
JAVA_PATH=`echo $cmd |awk '{print $7}'`

path=/www/wwwroot/$project





#建立backup目录
ansible $HOST -m shell -a "mkdir -p $path/backup" -b
#备份之前的jar包
ansible $HOST -m shell -a "cd $path;mv *.jar $path/backup/" -b

## 拷贝jar包
ansible $HOST -m copy -a "src=$jar_file dest=$path" -b
   
# 杀掉进程
# ansible $HOST -m shell -a "ps -ef | grep $project | grep -v grep |awk '{print \$2}'|xargs -i kill -9 {}" -b

## 重启服务
ansible $HOST -m shell -a  "sh $path/maidian.sh restart"

## 查看服务

ansible $HOST -m shell -a "ps -ef | grep $project | grep -v grep"

3.3 重启脚本-在目标服务器上

需要提前做的配置, 1 创建好日志目录 如 /mnt/erp 2 创建好项目目录 如 /www/wwwroot/erp 3 准备好启动脚本 如 /www/wwwroot/erp/erp.sh

#!/bin/bash
JAVA_HOME=/usr/bin/java
DATE=$(date +%Y-%m-%d-%H-%M-%S)

APP_NAME=/www/wwwroot/renkang-circle/circle-1.0-SNAPSHOT.jar
APP_PATH=/www/wwwroot/renkang-circle/


is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}
echo "##################启动###################"
#启动方法
start(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is already running. pid=${pid}"
  else
    nohup ${JAVA_HOME} -jar ${APP_NAME}  --spring.profiles.active=pro >> /mnt/vs-02/circle_${DATE}.log 2>&1 &
    #nohup ${JAVA_HOME} -jar ${APP_NAME} --server.port=19557 --spring.profiles.active=self >> /mnt/xinceshi/circle_${DATE}.log 2>&1 &
    echo $! > ${APP_PATH}circle.pid
    echo "starting....."
    sleep 2
    echo Program PID=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  fi
}
echo "##################启动完成###################"
#停止方法
stop(){
  is_exist
  if [ $? -eq 0 ]; then
    sudo kill -9 $pid && echo "is stopped"
  else
    echo "${APP_NAME} is not running"
  fi
}
status(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}

#重启
restart(){
  stop
  sleep 2
  start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    status)
        status
    ;;
    restart)
        restart
    ;;
    reload|restart|force-reload)
        stop
        start
    ;;
    **)
        echo "Usage: $0 {start|stop|reload|status}" 1>&2
    ;;
esac

四 构建

选择对应的分支即可 image.png