基于Gitlab+Jenkins+Ansible控制JavaTomcat多版本环境部署

版权声明:本文为原创文章,转载请标明出处。 https://blog.csdn.net/zwjzqqb/article/details/84555646

简单说明:


本博文实现CentOS6模板机克隆和JavaTomcat多版本运行环境部署的Jenkins构建实施

依据《基于Gitlab+Jenkins的测试环境自动构建和生产多环境手动发布方案》部署构建环境,部署完成Nginx环境搭建
将需要同步的安装包存放在jenkins的nginx服务对应目录/usr/local/nginx/html之下
浏览器登陆gitlab,创建devops项目,设置分支保护,只允许merge请求来合并master分支,并且只允许master角色确认merge请求
依据《CentOS7 python3.6 ansible2.5 源码安装》在jenkins主机的deploy用户下部署ansible
依据《CentOS6重置网卡克隆后的自适应脚本》对CentOS6模板机进行改造,将可用vlan的IP设置为192.168.1.250/192.168.77.250

Jenkins 主机操作:


yum -y install sshpass
su - deploy

cd ~
git clone [email protected]:root/devops.git
git config --global user.name "deploy"
git config --global user.email "deploy@jeninks"
cd devops
mkdir -pv centos6_java_tomcat_init
mkdir -pv centos6_java_tomcat_init/{inventory,roles}

cat >centos6_java_tomcat_init/inventory/proenv.source<<EOF
CloneIPValue
[Server]
CloneIPValue
[Server:vars]
Host_name=Host_nameValue
Host_IP=Host_IPValue
Ethernet=EthernetValue
ZabbixServer=ZabbixServerValue
NginxServer=192.168.77.130
ZabbixAgentRpm=zabbix-agent-3.0.23-1.el6.x86_64.rpm
jre16=jre-6u45-linux-x64.bin
jre17=server-jre-7u80-linux-x64.tar.gz
jre18=server-jre-8u172-linux-x64.tar.gz
tomcat6=apache-tomcat-6.0.53.tar.gz
tomcat7=apache-tomcat-7.0.86.tar.gz
tomcat8=apache-tomcat-8.0.51.tar.gz
EOF

mkdir -pv centos6_java_tomcat_init/roles/os/{files,tasks,templates}
cat >centos6_java_tomcat_init/roles/os/templates/os.sh.j2<<EOF
#!/bin/bash
source ~/.bash_profile
hostname {{ Host_name }}
echo "\$(grep -E '127|::1' /etc/hosts)">/etc/hosts
echo "{{ Host_IP }} {{ Host_name }}">>/etc/hosts
sed -i "s/^HOSTNAME.*$/HOSTNAME={{ Host_name }}/g" /etc/sysconfig/network
sed -i 's/\(IPADDR=\).*/\1{{ Host_IP }}/g' /etc/sysconfig/network-scripts/ifcfg-{{ Ethernet }}
yum -y localinstall /tmp/{{ ZabbixAgentRpm }}
sed -i 's/^Server=127.0.0.1/Server={{ ZabbixServer }}/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/^ServerActive=127.0.0.1/ServerActive={{ ZabbixServer }}:10051/g' /etc/zabbix/zabbix_agentd.conf
sed -i "s/^\(Hostname=\).*/\1{{ Host_name }}/g" /etc/zabbix/zabbix_agentd.conf
chkconfig zabbix-agent on
/etc/init.d/zabbix-agent stop
EOF

cat >centos6_java_tomcat_init/roles/os/tasks/main.yml<<EOF
- name: rsync os.sh
  template: src=roles/os/templates/os.sh.j2 dest=/tmp/os.sh
- name: wget zabbix agent rpm
  get_url: "url=http://{{ NginxServer }}/zabbix/{{ ZabbixAgentRpm }} dest=/tmp group=root owner=root mode=644"
- name: setup hosts
  shell: "bash /tmp/os.sh"
- name: update os
  shell: "yum -y update warn=False"
- name: reboot linux
  shell: "reboot"
EOF

cat >centos6_java_tomcat_init/deployOs.yml<<EOF
- hosts: "Server"
  gather_facts: true
  remote_user: root
  roles:
    - os
EOF

mkdir -pv centos6_java_tomcat_init/roles/java/{files,templates,tasks}
cat >centos6_java_tomcat_init/roles/java/templates/java.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
# chattr -i -R /usr/local/java &>/dev/null
rm -rf /usr/local/java
mkdir -p /usr/local/java
cd /usr/local/java
bash /tmp/{{ jre16 }}
find . -name "jre1.6*" -exec ln -s {} java_1.6 \;
tar -xf /tmp/{{ jre17 }}
find . -name "jdk1.7*" -exec ln -s {} java_1.7 \;
tar -xf /tmp/{{ jre18 }}
find . -name "jdk1.8*" -exec ln -s {} java_1.8 \;
chown root: -R .
cat >java_1.6_env<<EOF
export JAVA_HOME=/usr/local/java/java_1.6
export CLASSPATH=\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib
export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$PATH
EOF
chmod 444 java_1.6_env
cat >java_1.7_env<<EOF
export JAVA_HOME=/usr/local/java/java_1.7
export CLASSPATH=\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib
export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$PATH
EOF
chmod 444 java_1.7_env
cat >java_1.8_env<<EOF
export JAVA_HOME=/usr/local/java/java_1.8
export CLASSPATH=\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib
export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$PATH
EOF
chmod 444 java_1.8_env
# chattr +i -R /usr/local/java &>/dev/null
EOFALL
sed -i 's/\$/\\$/g' centos6_java_tomcat_init/roles/java/templates/java.sh.j2

cat >centos6_java_tomcat_init/roles/java/tasks/main.yml<<EOF
- name: wget java16
  get_url: "url=http://{{ NginxServer }}/jre/{{ jre16 }} dest=/tmp group=root owner=root mode=644"
- name: wget java17
  get_url: "url=http://{{ NginxServer }}/jre/{{ jre17 }} dest=/tmp group=root owner=root mode=644"
- name: wget java18
  get_url: "url=http://{{ NginxServer }}/jre/{{ jre18 }} dest=/tmp group=root owner=root mode=644"
- name: rsync java.sh
  template: src=roles/java/templates/java.sh.j2 dest=/tmp/java.sh
- name: setup java environment
  command: "bash /tmp/java.sh"
EOF

mkdir -pv centos6_java_tomcat_init/roles/tomcat/{files,templates,tasks}
cat >centos6_java_tomcat_init/roles/tomcat/templates/tomcat_deploy.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
chattr -i -R /usr/local/tomcat
rm -rf /usr/local/tomcat
mkdir -pv /usr/local/tomcat
cd /usr/local/tomcat
tar -xf /tmp/{{ tomcat6 }}
find . -name "apache-tomcat-6*" -exec ln -s {} tomcat6 \;
tar -xf /tmp/{{ tomcat7 }}
find . -name "apache-tomcat-7*" -exec ln -s {} tomcat7 \;
tar -xf /tmp/{{ tomcat8 }}
find . -name "apache-tomcat-8*" -exec ln -s {} tomcat8 \;
chown root: -R .
unset OPTS1 OPTS2 OPTS3 OPTS4
OPTS1="-Djava.security.egd=file:/dev/./urandom -Xms1256m -Xmx1512m"
OPTS2=\${OPTS1}" -XX:PermSize=164m -XX:MaxPermSize=228m"
OPTS3=\${OPTS2}" -XX:-UseGCOverheadLimit"
OPTS4=\${OPTS3}" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp"
sed -i "s|cygwin=false|JAVA_OPTS=\"\${OPTS3}\"\n&|g" tomcat*/bin/catalina.sh
sed -i "s|cygwin=false|# JAVA_OPTS=\"\${OPTS4}\"\n&|g" tomcat*/bin/catalina.sh
sed -i 's/8005/18080/g' tomcat*/conf/server.xml
sed -i 's/8443/9443/g' tomcat*/conf/server.xml
sed -i 's/8009/28080/g' tomcat*/conf/server.xml
sed -i 's/Connector port="8080" protocol="HTTP\/1.1"/&\
               maxThreads="800" acceptCount="1000"\
               compression="on"\
               compressionMinSize="2048"\
               noCompressionUserAgents="gozilla,traviata"\
               compressableMimeType="text\/html,text\/xml,text\/javascript,text\/css,text\/plain"/g' tomcat*/conf/server.xml
sed -i 's|appBase="webapps"|appBase="/web/project/tomcat6"|g' tomcat6/conf/server.xml
sed -i 's|appBase="webapps"|appBase="/web/project/tomcat7"|g' tomcat7/conf/server.xml
sed -i 's|appBase="webapps"|appBase="/web/project/tomcat8"|g' tomcat8/conf/server.xml
sed -i 's|<!-- Access log processes all example|\
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs/access/tomcat6"\
               prefix="tomcat6_access_log." suffix=".txt"\
               pattern="%h %l %u %t \&quot;%r\&quot; %s %b" />\
        &|g' tomcat6/conf/server.xml
sed -i 's|directory="logs"|directory="/web/logs/access/tomcat7"|g' tomcat7/conf/server.xml
sed -i 's/localhost_access_log/tomcat7_access_log/g' tomcat7/conf/server.xml
sed -i 's|directory="logs"|directory="/web/logs/access/tomcat8"|g' tomcat8/conf/server.xml
sed -i 's/localhost_access_log/tomcat8_access_log/g' tomcat8/conf/server.xml
EOFALL

cat >centos6_java_tomcat_init/roles/tomcat/templates/tomcat_cat.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
cd /usr/local/tomcat
cat >tomcat6/bin/cat.sh<<EOF
#!/bin/bash
source ~/.bash_profile
cd \$(dirname \$0)
d=\$(date +%Y%m%d.%H.%M.%S)
# catalina.out 日切
cd ../logs/
cp catalina.out catalina.out.\${d}
echo '' > catalina.out
tar -czf catalina.out.\${d}.tar.gz catalina.out.\${d} --remove-files
find . -name 'catalina.out.*.tar.gz' -type f -mtime +30 -exec rm -rf {} \;
# 杂项日志清理
find . -name 'catalina.*.log' -type f -mtime +30 -exec rm -rf {} \;
find . -name 'host-manager.*.log' -type f -mtime +30 -exec rm -rf {} \;
find . -name 'localhost.*.log' -type f -mtime +30 -exec rm -rf {} \;
find . -name 'manager.*.log' -type f -mtime +30 -exec rm -rf {} \;
# access log 日切
cd /web/logs/access/tomcat6
find . -name "*.txt" -type f -mtime +0 -exec tar -czf {}.tar.gz {} --remove-files \;
find . -name "*.tar.gz" -type f -mtime +30 -exec rm -rf {} \;
EOF
EOFALL
sed -i 's/\$/\\$/g' centos6_java_tomcat_init/roles/tomcat/templates/tomcat_cat.sh.j2

cat >centos6_java_tomcat_init/roles/tomcat/templates/tomcat_cat_cp.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
cd /usr/local/tomcat
cp -av tomcat6/bin/cat.sh tomcat7/bin/cat.sh
sed -i 's/tomcat6/tomcat7/g' tomcat7/bin/cat.sh
cp -av tomcat6/bin/cat.sh tomcat8/bin/cat.sh
sed -i 's/tomcat6/tomcat8/g' tomcat8/bin/cat.sh
chmod +x tomcat*/bin/cat.sh
find tomcat*/ -type f ! -perm -o=r -exec ls -l {} \;
find tomcat*/ -type f ! -perm -o=r -exec chmod o+r {} \;
rm -rf tomcat*/webapps
chattr +i /usr/local/tomcat
EOFALL

cat >centos6_java_tomcat_init/roles/tomcat/tasks/main.yml<<EOF
- name: wget tomcat6
  get_url: "url=http://{{ NginxServer }}/tomcat/{{ tomcat6 }} dest=/tmp group=root owner=root mode=644"
- name: wget tomcat7
  get_url: "url=http://{{ NginxServer }}/tomcat/{{ tomcat7 }} dest=/tmp group=root owner=root mode=644"
- name: wget tomcat8
  get_url: "url=http://{{ NginxServer }}/tomcat/{{ tomcat8 }} dest=/tmp group=root owner=root mode=644"
- name: rsync tomcat_deploy.sh
  template: src=roles/tomcat/templates/tomcat_deploy.sh.j2 dest=/tmp/tomcat_deploy.sh
- name: rsync tomcat_cat.sh
  template: src=roles/tomcat/templates/tomcat_cat.sh.j2 dest=/tmp/tomcat_cat.sh
- name: rsync tomcat_cat_cp.sh
  template: src=roles/tomcat/templates/tomcat_cat_cp.sh.j2 dest=/tmp/tomcat_cat_cp.sh
- name: setup tomcat environment 1
  command: "bash /tmp/tomcat_deploy.sh"
- name: setup tomcat environment 2
  command: "bash /tmp/tomcat_cat.sh"
- name: setup tomcat environment 3
  command: "bash /tmp/tomcat_cat_cp.sh"
EOF

mkdir -pv centos6_java_tomcat_init/roles/web_pro/{files,templates,tasks}
cat >centos6_java_tomcat_init/roles/web_pro/templates/web_pro_clear.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
if [ -f /var/spool/cron/web_pro ]
then
  rm -rf /var/spool/cron/web_pro
  for Pid in \$(ps -ef|grep '^web_pro '|grep -v grep|awk '{print \$2}');do kill -9 \${Pid};done
fi
if [ -d /web ]
then
  chattr -i -R /web
  rm -rf /web/*
fi
grep -q ^web_pro /etc/passwd
if [ \$? -eq 0 ]
then
  userdel -r web_pro
fi
sed -i '/^web_pro.*/d' /etc/security/limits.conf
sed -i '/^session required pam_limits.so$/d' /etc/pam.d/login
EOFALL

cat >centos6_java_tomcat_init/roles/web_pro/templates/web_pro_useradd.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
useradd -u 8080 web_pro
echo web_pro|passwd --stdin web_pro
echo 'web_pro soft nproc 2047'>>/etc/security/limits.conf
echo 'web_pro hard nproc 16384'>>/etc/security/limits.conf
echo 'web_pro soft nofile 1024'>>/etc/security/limits.conf
echo 'web_pro hard nofile 65536'>>/etc/security/limits.conf
echo 'web_pro soft stack 10240'>>/etc/security/limits.conf
echo 'web_pro hard stack 32768'>>/etc/security/limits.conf
echo 'session required pam_limits.so'>>/etc/pam.d/login
EOFALL

cat >centos6_java_tomcat_init/roles/web_pro/templates/web_pro_checkTOMCAT.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
mkdir -pv /web/{profile,project,logs,checkTOMCAT}
chown web_pro: -R /web
chmod 750 -R /web
cd /web/checkTOMCAT
cat>checktomcat.sh<<EOF
#!/bin/bash
source /etc/profile
# 工作目录
CPWD=\$(dirname \${0})
# 配置表单
CHKLIST=\${CPWD}/checktomcat.lst
# 超时对比文件
TIMESTANDARD=\${CPWD}/checktomcat.tsd
# 自动拉起行为日志
CHECKLOG=\${CPWD}/checktomcat_log.txt
# 脚本运行日志
RUNLOG=\${CPWD}/checktomcat_run_\$(date +%F).log
echo "\$(date +%F.%T) Check file \${CHKLIST}">>\${RUNLOG}
# 处理过程:
while read line
do
  if [ "\${line:0:1}" == "#" -o "\${line}" == "" ]
  then
    continue
    # 如果配置表单为注释行或者空行,则忽略
  fi
  # 标志性项目名:BIN目录:统计进程数项目名:启动命令:监控日志:日志超时时间
  # 标志性项目名 便于人工识别项目
  # 统计进程数项目名 唯一定义该项目的进程 不能有歧义
  VNAME=\$(echo \${line}|awk -F ':' '{print \$1}')
  VWORKDIR=\$(echo \${line}|awk -F ':' '{print \$2}')
  VPROC=\$(echo \${line}|awk -F ':' '{print \$3}')
  VSTART=\$(echo \${line}|awk -F ':' '{print \$4}')
  VLOG=\$(echo \${line}|awk -F ':' '{print \$5}')
  VTIME=\$(echo \${line}|awk -F ':' '{print \$6}')
  # 如果配置表单该行BIN目录不存在,则打日志并忽略该行处理
  if [ -d "\${VWORKDIR}" ]
  then
    cd "\${VWORKDIR}"
  else
    echo "\$(date +%F.%T) WARNNING \${VWORKDIR} is not exists, check \${VNAME} is skip...">>\$CHECKLOG
    continue
  fi
  # 当前该项目的进程数量
  PROCCOUNTS=\$(ps -ef|grep "\${VPROC}"|grep java|grep -v "grep"|wc -l)
  # 注意:\${VPROC}必须能够唯一标识该项目的进程
  # 如果当前该项目的进程数量为0,则拉起该项目
  if [ "\${PROCCOUNTS}" == "0" ]
  then
    echo \${VNAME} not running, restarted.>>\${CHECKLOG}
    echo "\$(date +%F.%T) \${VNAME} not running">>\${CHECKLOG}
    echo "\$(date +%F.%T) \${VSTART}">>\${CHECKLOG}
    \${VSTART} &
    continue
  fi
  # 日志超时检测
  if [ "\${VTIME}" != "0" ]
  then
    # 刷新对比文件的时间戳
    touch -t \$(date -d "-\${VTIME} second" +"%Y%m%d%H%M.%S") \${TIMESTANDARD}
    # 对比日志是否比对比文件时间戳新
    LOGFILECOUNTS=\$(find \${VLOG} -newer \${TIMESTANDARD}|wc -l)
    if [ "\${LOGFILECOUNTS}" == "0" ]
    then
      echo "\${VLOG} is not exists or is expired \${VTIME} second.">>\${CHECKLOG}
      echo "\$(date +"%F.%T") \${VNAME} logfile is expired \${VTIME} second">>\${CHECKLOG}
      echo "\$(date +"%F.%T") \${VSTART}">>\${CHECKLOG}
      touch \${VLOG}
      for i in \$(ps -ef|grep "\${VPROC}"|grep java|grep -v "grep"|awk '{print \$2}')
      do
        kill -9 \${i}
      done
      # 杀掉该项目的所有进程
      \${VSTART} &
      continue
    fi
  fi
done<\${CHKLIST}
cd \${CPWD}
EOF
chmod 700 checktomcat.sh
# 创建配置表单
echo '# TOMCAT_NAME:BIN_PATH:PROCESS_NAME:START_SCRIPT:CHECK_LOG:LOG_TIMEOUT:PORT_OFFSET'>checktomcat.lst
# 生效自动任务
>/var/spool/cron/web_pro
chown web_pro: /var/spool/cron/web_pro
chmod 0600 /var/spool/cron/web_pro
echo "# Check TOMCAT Process" >>/var/spool/cron/web_pro
echo "*/1 * * * *          /web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "*/1 * * * * sleep 10;/web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "*/1 * * * * sleep 20;/web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "*/1 * * * * sleep 30;/web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "*/1 * * * * sleep 40;/web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "*/1 * * * * sleep 50;/web/checkTOMCAT/checktomcat.sh> /dev/null 2>&1" >>/var/spool/cron/web_pro
echo "0 3 * * * /usr/bin/find /web/checkTOMCAT/checktomcat_run_*.log -type f -mtime +30 -exec rm -rf {} \;" >>/var/spool/cron/web_pro
chown web_pro: -R /web
EOFALL
sed -i 's/\$/\\$/g' centos6_java_tomcat_init/roles/web_pro/templates/web_pro_checkTOMCAT.sh.j2

cat >centos6_java_tomcat_init/roles/web_pro/templates/web_pro_pro_deploy.sh.j2<<EOFALL
#!/bin/bash
source ~/.bash_profile
cd /web/checkTOMCAT
cat >pro_deploy.sh<<EOF
#!/bin/bash
source ~/.bash_profile
# JAVA环境目录
JAVA_ENV=/usr/local/java
# TOMCAT模板目录
TOMCAT_ENV=/usr/local/tomcat
# 实例目录
IPWD=/web
# 工作目录
CPWD=\$(dirname \${0})
# 配置表单
CHKLIST=\${CPWD}/checktomcat.lst
# 执行帮助
if [ "\$#" -ne 6 ]
then
    echo \$"Usage:   bash \$(basename \$0) -n PRO_NAME -j JAVA_VERSION -t TOMCAT_VERSION"
    echo \$"Example: bash \$(basename \$0) -n vincent_test -j java_1.6 -t tomcat6"
    echo \$"JAVA_VERSION can be java_1.6/java_1.7/java_1.8"
    echo \$"TOMCAT_VERSION can be tomcat6/tomcat7/tomcat8"
    exit 1
fi
while [ "\$#" -gt 0 ]
do
    case "\$1" in
            -n)
                shift
                typeset -l PRO_NAME="\${1}"
                shift
                ;;
            -j)
                shift
                typeset -l JAVA_VERSION="\${1}"
                shift
                ;;
            -t)
                shift
                typeset -l TOMCAT_VERSION="\${1}"
                shift
                ;;
    esac
done
# 端口偏移
PORT_OFFSET=\$(awk -F':' '{if(\$NF~/[0-9]+/) print \$NF}' \${CHKLIST}|wc -l)
# 实例名称
TOMCAT_NAME=\${TOMCAT_VERSION}_\$((8080+\$PORT_OFFSET))_\${PRO_NAME}
# 实例复制
cp -a \${TOMCAT_ENV}/\${TOMCAT_VERSION}/ \${IPWD}/\${TOMCAT_NAME}
# 配置文件修改
sed -i "s|#!/bin/sh|&\nsource \${JAVA_ENV}/\${JAVA_VERSION}_env|g" \${IPWD}/\${TOMCAT_NAME}/bin/catalina.sh
sed -i "s/tomcat.*\$/\${TOMCAT_NAME}/g" \${IPWD}/\${TOMCAT_NAME}/bin/cat.sh
sed -i "s/18080/\$((18080+\$PORT_OFFSET))/g" \${IPWD}/\${TOMCAT_NAME}/conf/server.xml
sed -i "s/8080/\$((8080+\$PORT_OFFSET))/g" \${IPWD}/\${TOMCAT_NAME}/conf/server.xml
sed -i "s/9443/\$((9443+\$PORT_OFFSET))/g"   \${IPWD}/\${TOMCAT_NAME}/conf/server.xml
sed -i "s/28080/\$((28080+\$PORT_OFFSET))/g" \${IPWD}/\${TOMCAT_NAME}/conf/server.xml
sed -i "s/tomcat[678]/\${TOMCAT_NAME}/g" \${IPWD}/\${TOMCAT_NAME}/conf/server.xml
# 配置表单添加
echo "\${PRO_NAME}:\${IPWD}/\${TOMCAT_NAME}/bin:\${TOMCAT_NAME}:./startup.sh:CHECK_LOG:0:\${PORT_OFFSET}">>\${CHKLIST}
# 添加日志日切任务
crontab -l>/tmp/web_pro_crontab.txt
echo "# \${TOMCAT_NAME} DAILY LOG ARCHIVE" >>/tmp/web_pro_crontab.txt
echo "0 3 * * * /bin/bash /web/\${TOMCAT_NAME}/bin/cat.sh">>/tmp/web_pro_crontab.txt
cat /tmp/web_pro_crontab.txt |crontab
rm -rf /tmp/web_pro_crontab.txt
# 生成测试页面:
mkdir -p /web/project/\${TOMCAT_NAME}/ROOT
echo "\$(hostname -i):\${TOMCAT_NAME}">>/web/project/\${TOMCAT_NAME}/ROOT/index.html
echo "curl http://\$(hostname -i):\$((8080+\$PORT_OFFSET))/index.html"
EOF
chmod +x pro_deploy.sh
chown web_pro: -R /web
chattr +i /web/tomcat*/bin
chattr +i /web/tomcat*/conf
chattr +i /web/tomcat*/lib
cd /web/checkTOMCAT/
chattr +i *.sh
EOFALL
sed -i 's/\$/\\$/g' centos6_java_tomcat_init/roles/web_pro/templates/web_pro_pro_deploy.sh.j2

cat >centos6_java_tomcat_init/roles/web_pro/tasks/main.yml<<EOF
- name: rsync web_pro_clear.sh
  template: src=roles/web_pro/templates/web_pro_clear.sh.j2 dest=/tmp/web_pro_clear.sh
- name: rsync web_pro_useradd.sh
  template: src=roles/web_pro/templates/web_pro_useradd.sh.j2 dest=/tmp/web_pro_useradd.sh
- name: rsync web_pro_checkTOMCAT.sh
  template: src=roles/web_pro/templates/web_pro_checkTOMCAT.sh.j2 dest=/tmp/web_pro_checkTOMCAT.sh
- name: rsync web_pro_pro_deploy.sh
  template: src=roles/web_pro/templates/web_pro_pro_deploy.sh.j2 dest=/tmp/web_pro_pro_deploy.sh
- name: clear web_pro
  command: "bash /tmp/web_pro_clear.sh"
- name: useradd web_pro
  command: "bash /tmp/web_pro_useradd.sh"
- name: web_pro add checkTOMCAT
  command: "bash /tmp/web_pro_checkTOMCAT.sh"
- name: web_pro add pro_deploy
  command: "bash /tmp/web_pro_pro_deploy.sh"
EOF

cat >centos6_java_tomcat_init/deployMain.yml<<EOF
- hosts: "Server"
  gather_facts: true
  remote_user: root
  roles:
    - java
    - tomcat
    - web_pro
EOF

# 提交到gitlab之上
cd
cd devops
Time=$(date +%F' '%T)
git add -A
git commit -m "[+]  ${Time} commit init script"
git push -u origin master

Jenkins Pipeline 脚本样例


网页登陆jenkins,部署pipeline job,设置groovy脚本:

#!groovy
pipeline{
  agent{node{label 'master'}}
  environment{
    PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
  }
// #################################################
// # 定义变量
// #################################################
  parameters{
    string(name:'Host_IP',defaultValue:'192.168.77.200',description:'模板机将要部署设置为的主机IP')
    string(name:'Host_name',defaultValue:'web',description:'模板机将要部署设置为的主机名')
    choice(
      choices: '192.168.77.10\n192.168.77.20\n192.168.77.30',
      description: '选择管控该主机的zabbix server地址',
      name: 'ZabbixServer'
    )
    string(name:'CloneIP',defaultValue:'192.168.77.250',description:'模板机克隆后可用vlan的IP')
    string(name:'RootDefaultPass',defaultValue:'vincent',description:'模板机的通用root密码')
    string(name:'Ethernet',defaultValue:'eth0',description:'模板机的网卡设备名')
  }
  stages{
// #################################################
// # 设置步骤,进行git下载,下载ansible处理脚本
// #################################################
    stage("Pull deploy code"){
      steps{
        // sh 'git config --global http.sslVerify false'
        // 如果gitlab使用了私有的ssl证书,则打开
        dir("${env.WORKSPACE}"){
          git branch: 'master',
          credentialsId:'c79b7cd2-9698-4af2-976b-0a45342878d9',
          // 创建用于gitlab的root用户登陆的jenkins凭据
          url:'http://192.168.77.100/vincent/devops.git'
        }
      }
    }
// #################################################
// # 执行ansible部署
// #################################################
    stage("Ansible deployment"){
      steps{
        dir("${env.WORKSPACE}"){
          echo "[INFO] 开始部署"
          echo "###################################"
          sh '''
          set +x          
          echo -e "[+] $(date +%F_%T) 休眠等待主机${CloneIP}克隆完毕:"  
          for cn in $(seq 3)
          do    
            while [ $(nc -z ${CloneIP} 22 &>/dev/null;echo $?) -ne 0 ]
            do
              sleep 5
              echo -e "[+] $(date +%F_%T)   休眠等待..."
            done
            sleep 2
          done
          # CentOS6克隆后网络自适应,探测到可用IP之后会重启,因此休眠等待要多探测几次
          echo -e "[+] $(date +%F_%T) 加载环境变量:"
          source /home/deploy/.py3.6.env/bin/activate
          source /home/deploy/.py3.6.env/ansible/hacking/env-setup -q
          echo -e "[+] $(date +%F_%T) 任务环境信息:"
          echo -e "[+] \t 模板机克隆后的IP: ${CloneIP}"
          echo -e "[+] \t 模板机克隆后的密码: ${RootDefaultPass}"
          echo -e "[+] \t 模板机的网络设备名: ${Ethernet}"
          echo -e "[+] \t 将被部署的主机名: ${Host_name}"
          echo -e "[+] \t 将被部署的IP: ${Host_IP}"
          echo -e "[+] \t 将被部署的主机托管zabbix server地址: ${ZabbixServer}"
          echo -e "[+] $(date +%F_%T) ssh key 部署:"
          echo ''>~/.ssh/known_hosts
          sshpass -p ${RootDefaultPass} ssh-copy-id -o StrictHostKeyChecking=no root@${CloneIP}
          ssh -o StrictHostKeyChecking=no root@${CloneIP} date &>/dev/null
          echo -e "[+] $(date +%F_%T) 执行ansbile deploy OS:"
          cd centos6_java_tomcat_init
          cp -a inventory/proenv.source inventory/proenv
          sed -i "s/CloneIPValue/${CloneIP}/g" inventory/proenv
          sed -i "s/Host_nameValue/${Host_name}/g" inventory/proenv
          sed -i "s/Host_IPValue/${Host_IP}/g" inventory/proenv
          sed -i "s/EthernetValue/${Ethernet}/g" inventory/proenv
          sed -i "s/ZabbixServerValue/${ZabbixServer}/g" inventory/proenv
          ansible-playbook -i inventory/proenv ./deployOs.yml
          sleep 30
          echo -e "[+] $(date +%F_%T) 执行ansbile deploy Main:"
          ssh -o StrictHostKeyChecking=no root@${Host_IP} date &>/dev/null
          sed -i "s/${CloneIP}/${Host_IP}/g" inventory/proenv
          ansible-playbook -i inventory/proenv ./deployMain.yml
          set -x
          '''
          echo "###################################"
          echo "[INFO] 部署完成"
          echo """# 登陆 ${Host_IP} 进行测试:
                  ssh root@${Host_IP}
                  su - web_pro
                  cd /web/checkTOMCAT
                  bash pro_deploy.sh -n test1 -j java_1.8 -t tomcat8
                  curl http://${Host_IP}:8080/index.html
               """
        }
      }
    }
  }
}

测试过程:


  • 克隆虚拟机,登陆192.168.77.250确认克隆成功
  • 执行jenkins相应的job进行构建测试,查看日志确认构建成功
  • 登陆被部署的主机IP进行测试
su - web_pro
cd /web/checkTOMCAT
bash pro_deploy.sh -n test1 -j java_1.6 -t tomcat6
bash pro_deploy.sh -n test2 -j java_1.7 -t tomcat7
bash pro_deploy.sh -n test3 -j java_1.8 -t tomcat8

[TOC]

猜你喜欢

转载自blog.csdn.net/zwjzqqb/article/details/84555646