jenkins+ansible+maven自动部署,jenkinsansible


近期看下了自动化部署,记录下部署流程。
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: 【5copy 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

相关内容

    暂无相关文章