您的位置:首页 > 其它

jenkins+ansible+maven自动部署

2017-09-21 19:25 639 查看
近期看下了自动化部署,记录下部署流程。

1.服务器jdk、maven已安装

2.安装jenkins:

创建目录:

mkdir -p /data/apps/jenkins


下载war:

wget  http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war


为方便文件管理,修改/etc/profile增加jenkins路径,并立即生效:

vi /etc/profile
增加:export JENKINS_HOME=/data/apps/jenkins_home
source /etc/profile


创建启动脚本start.sh(端口号不写默认8080,防止冲突,我修改成了9003):

# !/bin/bash

nohup /usr/local/jdk1.8.0_131/bin/java -Xmx2g -Xms2g -Xmn1g -XX:PermSize=128m -XX:MaxPermSize=256m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -Xloggc:gc_jenkins.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar jenkins.war --httpPort=9003 >> stdout.log 2>&1 &


执行启动脚本:./start.sh,会产生相应的日志文件等,如下图所示。



此时通过浏览器访问ip:端口号就可以访问jenkins页面了。

这里假设你首次的一些验证、密码设置都成功,并进入页面。



然后系统管理-管理插件-可选插件下载必要插件 比如git maven



安装后:



3.ansible安装

检查环境依赖,如果没有则需要安装,不然在安装ansible时会报错

yum -y install gcc python-devel openssl-devel


检查下环境是否已安装有pip,如果没有,可通过如下方式安装

sudo easy_install pip


安装ansible

sudo pip install ansible


为方便管理,创建配置文件

mkdir -p /etc/ansible
vi /etc/ansible/ansible.cfg


最新配置文件:https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

比如设置hostfile = /etc/ansible/inventory/

在inventory添加配置文件hosts,并配置host,格式:

[XXXX]
xx.xx.xx.xx
xx.xx.xx.xx


目录结构为:



host里配置的服务器都需要配置ssh免密访问:

1、执行 ssh-keygen -t rsa 生成密钥对(一路回车即可)



执行之后,/root/.ssh会生成一对密钥



2、通过 ssh-copy-id 进行传输公钥

ssh-copy-id -i /root/.ssh/id_rsa.pub root@xx.xx.xx.xx

或者

将id_rsa.pub文件的内容拷贝至远程服务器的~/.ssh/authorized_keys文件中

成功后执行ssh root@xx.xx.xx.xx,成功登录至对应服务器,不需要密码(居然不知道服务器密码,只能用跳板机登录,我很无奈的选择了第二种方式。)

该安装的基本都安装了,现在开始配置部署了。

jenkins页面新建maven项目:







使用git时,如果需要密码,需要设置Credentials,否则会报以下错



成功构建之后,设置执行ansible,可设置自定义参数,比如设置日志级别,jvm参数等,因为存在多个项目工程,每个工程部署基本一致,所以我把启动命令提取成一个参数了,这样不同工程的jvm大小啦,日志级别啥的都可以统一配置。(原本想执行对应工程启动脚本,鉴于同一服务可能存在多台服务器,后期如果针对服务调整启动参数需要去多台服务器调整,太麻烦,所以一股脑把启动命令拎出来了。。。)

以下自定义参数是针对我需要设置的:

update_server:需要操作的服务器,需要免认证登陆,并在上述配置过host

project:jenkins添加的这个project名称,方便扩展多个项目

jar_name:要操作的jar名称

path_jar:需要部署的jar路径

path_jar_backup:jar更新前备份路径

doc_url:服务启动后,校验服务启动成功与否的校验路径

start_sh:启动脚本参数

ansible-playbook /etc/ansible/deploy_common_template.yml --extra-vars '{"update_server": "XXX","project": "common_manage","jar_name": "xxx.jar","path_jar": "/data/apps/xxx/lib","path_jar_backup": "/data/apps/xxx/backup","doc_url": "http://127.0.0.1:9011/doc","start_sh": "-Dspring.profiles.active=xx -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xmx1g -Xms1g -XX:MaxGCPauseMillis=300 -XX:PermSize=128m -XX:MaxPermSize=256m -Xss256k -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -verbose:gc -Xloggc:/data/logs/gc_manage.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar /data/apps/xxx/lib/xxx.jar >> /data/logs/xxx/stdout.log 2>&1 &"}'




创建上述使用的/etc/ansible/deploy_common_template.yml:

- hosts: "{{update_server}}"
roles:
- common_template


创建使用的规则common_template:

roles创建流程or规则:

mkdir -pv /etc/ansible/roles/{xxx,xxx,xxx}/{tasks,handlers,files,vars,templates,meta,default}


在每个角色的handlers、tasks、meta、defaults、vars目录下创建main.yml文件。

touch /etc/ansible/roles/xxx/{default,vars,tasks,meta,handlers}/main.yml


roles/ \ansible所有的信息都放到此目录下面对应的目录中

└── common_template \角色名称

├── default \为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件;

├── files \存放有copy或script等模块调用的文件

├── handlers \此目录总应当包含一个main.yml文件,用于定义各角色用到的各handler

├── meta \应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持

├── tasks \至少包含一个名为main.yml的文件,定义了此角色的任务列表,可使用include指令

├── templates \template模块会自动在此目录中寻找Jinja2模板文件

└── vars \应当包含一个main.yml文件,用于定义此角色用到的变量



其中,主要脚本任务存放在tasks目录下的main.yml里:

- name: 【1】backup {{jar_name}}
shell: mv {{path_jar}}/{{jar_name}} {{path_jar_backup}}/{{jar_name}}`date "+%Y_%m_%d_%H_%M_%S"` removes={{path_jar}}/{{jar_name}}
- name: 【2】copy jar to project
copy: src=/data/apps/jenkins_home/workspace/{{project}}/target/{{jar_name}} dest={{path_jar}}/{{jar_name}}
- name: 【3】project server exist
shell: ps aux | grep {{jar_name}} | grep -v grep | wc -l
register: server_ct
- name: "【4】stop {{jar_name}} server"
shell: kill -9 `ps aux | grep {{jar_name}} | grep -v grep | awk '{print $2}'`
when: server_ct.stdout != "0"
- name: 【5】server already kill
shell: ps aux | grep {{jar_name}} | grep -v grep | wc -l
register: server_ct_2
until: server_ct_2.stdout == "0"
retries: 100
delay: 1
- name: 【6】project jar exist
shell: ls -al {{path_jar}}/* | grep {{jar_name}} | grep -v grep | wc -l
register: manage_ct

- name: "【7】start {{jar_name}} server,start_sh:{{start_sh}}"
shell: nohup java  {{start_sh}}
when: manage_ct.stdout != "0"
- name: "【8】server port stat"
shell: curl -s {{doc_url}} | wc -l
register: result
until: result.stdout != "0"
retries: 100
delay: 1


现在就可以在jenkins里构建项目了。

然后可以通过控制台查看操作进展情况。

如果涉及nginx的调整,可以在/etc/ansible/deploy_common_template.yml定义多个执行roles,比如:

- hosts: xxx
roles:
- xxx
- hosts: xxx
roles:
- nginx_update
- hosts: xxx
roles:
- role: restart_project
- hosts: xxx
roles:
- all_nginx_allow


这样的话,就是把整个流程拆分成多个role,每个role里执行单个计划。

比如nginx_update:



其中tasks/main.yml:

# tasks file for /etc/ansible/roles/nginx_update
- name: 【5】copy nginx conf to online
copy: src=/etc/ansible/roles/nginx_update/files/stop_{{update_server}}.nginx.conf dest=/usr/local/nginx/conf/nginx.conf
- name: 【6】nginx conf test
shell: /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
- name: 【7】nginx conf reload
shell: /usr/local/nginx/sbin/nginx -s reload
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: