初涉自动化部署


自动化部署与持续交付

日常工作中,每个程序员都会经历项目部署,而很多人在这时大多会经历以下环节:

  • Git :分布式版本控制系统,负责项目代码的分支拉取与分支更新等;
  • Maven :项目管理工具,负责项目打包;
  • 项目部署 :日常可能使用ftp方式传输项目包,Shell相关脚本部署,或者使用IDEA Alibaba Cloud Toolkit相关插件的部署功能等。

而以上内容中比较传统的方式有一个缺点,就是需要人为的衔接每一步,稍微掉以轻心,则部署就比较容易出问题。

而如今更需要一个自动化部署与持续交付的组合拳来分担压力,更为准确和系统化的实现项目部署。接下来介绍一下Git\Maven + Jenkins + Ansible三剑客,能轻松解决这一难题,实现自动化部署。

简单分析图:


Git\Maven + Jenkins + Ansible自动化部署三剑客分工:

  • Git :分布式版本控制系统,负责项目代码的分支拉取与分支更新等工作;
  • Maven :项目管理工具,负责项目打包工作;
  • Ansible :自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能;
  • Jenkins :持续集成工具,用于监控持续重复的工作,通过插件管理来集成Git、Maven、Ansible来实现对应功能;

1. 版本清单

Item Version
CentOS 7
JDK 1.8
Python 3.6.5
Jenkins 2.204.1
Maven 3.6.3
Ansible 2.9.2

2. 安装与部署

2.1 Jenkins安装前的环境部署

生产环境中防火墙可能不能关闭,那么则需要放行相关程序所需要的端口(jenkins默认为8080)

下载jenkins rpm包:

https:\pkg.jenkins.io\redhat-stable\

2.1.1 jdk1.8安装

参考链接中安装jdk1.8的部分:
https:\blog.csdn.net\qq_26368081\article\details\78984316

2.1.2 maven安装

1.下载maven压缩包
wget http:\\mirror.bit.edu.cn\apache\maven\maven-3\3.6.3\binaries\apache-maven-3.6.3-bin.tar.gz

2.解压mavan压缩包
tar  -zxvf apache-maven-3.6.3-bin.tar.gz

3.查看maven版本号
进入maven目录
.\mvn --version

2.2 Jenkins安装与部署

JENKINS_USER = deploy表示jenkins的用户
JENKINS_PORT = 8080表示jenkins的端口

启动jenkins服务:
systemctl start jenkins
开机自启动jenkins服务: 
systemctl enable jenkins

2.2.1 登陆jenkins管理平台

接下来使用可以访问到该服务器jenkins端口的电脑登陆:服务器ip + jenkins端口号
例如:http:\192.168.10.132:8080

2.2.2 复制输入初始密码登陆

复制文件中的密码
vi \var\lib\jenkins\secrets\initialAdminPassword

2.2.3 安装插件

选择推荐安装的插件即可

2.2.4 创建管理员帐户

创建平台管理员帐户

2.2.5 角色权限部署

0.目的:每个用户只管理属于自己的自动化部署项目
路径:Manage Jenkins - Manage Plugins - 可选插件

1.安装所需插件:
Role-based Authorization Strategy - 直接安装
Authorize Project - 直接安装

2.部署路径:Manage Jenkins - Configure Global Security
按图示开启用户登陆和选择Role-Based Strategy策略

3.路径:Manage Jenkins - Manage and Assign Roles

4.配置:

帐号准备
新建三个帐号prod、test、abc分别表示生产环境帐号、测试环境帐号、未知帐号
路径:管理平台页面 - 注销 - 创建一个用户帐号

配置Manage Roles
在Manage Roles中有两种角色
Global roles:分配全局策略
Project roles:根据项目环境来分配项目权限

Global roles栏
可添加guest游客的角色,只赋予read权限(Overrall - Read),可查看全局的面板

Item roles栏
可根据环境(例如生产环境、测试环境等)来进行项目分类

Role:分类名
Pattern:正则表达式匹配

例子:
.*test :匹配所有以test结尾的项目,并分配图上的权限。注意使用通配符‘’时,需要在’’前添加’.’,否则无法保存并会报错。例如:.*plat

配置Assign Roles
把具体用户(prod、test)与Manage Roles中配置的角色权限关联起来

注意:
Anonymous User不分配权限,只需要给admin分配管理员权限

验证权限
新建Item:a.test和a.prod
路径:管理平台 - 新建Item - a.test - Freestyle project - 确定 - 返回管理平台页面

因为是测试Item,所以没有继续创建具体Item内容

admin管理用户的管理界面

test用户的管理界面

prod用户的管理界面

具体的权限在前面的Manage Roles - Item roles里根据需要进行设置

关闭用户注册入口
路径:Manage Jenkins - Configure Global Security - 访问控制 - Jenkins’ own user database - 允许用户注册
取消√即可

2.3 Ansible安装与部署

2.3.1 Ansible安装前的环境部署

python安装与部署

1.在安装Python之前,需要先安装一些后面遇到的依赖问题(如果有依赖问题,按照提示安装):

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

2.python压缩包下载

使用命令

wget https:\\www.python.org\ftp\python\3.6.5\Python-3.6.5.tgz

or

*进入该网址直接本地下载然后ftp方式传输至服务器上 *

https:\www.python.org\ftp\python\

3.解压、配置与编译安装

1.解压文件
tar -xvf Python-3.6.5.tgz

2.包安装在\usr\local\Python3(具体安装位置看个人喜好)
mkdir -p \usr\local\Python3

3.配置
cd Python-3.6.5
.\configure --prefix=\usr\local\python3

4.编译安装
make
make install

5.做软链接
ln -s \usr\local\python3\bin\python3.6 \usr\bin\python3
设置pip软连接
ln -s \usr\local\python3\bin\pip3.6 \usr\bin\pip3

6.测试是否安装成功
python3 -V

7.因为yum源使用的Python2,替换为Python3以后,会导致其无法正常工作。需要修改以下信息:
修改yum配置文件:
vi \usr\bin\yum
第一行修改为#!\usr\bin\python2.7

8.验证yum源正常使用
yum -y install vim 执行两次测试安装与校验

9.用pip安装PyQuery包
pip3 install PyQuery

10.升级pip
pip3 install --upgrade pip

2.3.2 Ansible安装部署

1.sudo yum install epel-release
2.sudo yum install ansible
3.pip install --upgrade pip
4.pip install paramiko PyYAML Jinja2 httplib2 six
5.pip install ansible        

ssh免密码\密钥认证

1.本地机器上使用ssh-keygen产生公钥私钥对
ssh-keygen -t rsa 
(一路回车)

2.用ssh-copy-id将公钥复制到远程机器(~\ .ssh\authorized_key.文件)中
ssh-copy-id -i \root\.ssh\id_rsa.pub 用户名@192.168.x.xxx
(\root\.ssh\id_rsa.pub这个路径有可能不同,以自身具体路径准,详见下方截图)

3.输入yes继续连接,输入远程服务器的密码(密钥文件的形式不需要输入密码,但)

4.ssh方式登录远程服务器验证免密是否生效
(1)密码方式:
ssh 用户名@192.168.x.xxx
(2)密钥方式:
需要对密钥文件权限进行修改-禁止文件的访问权限,否则系统会判断该文件可能被篡改而无法使用该密钥进行登录
chmod 700 filename
ssh -i 密钥文件路径 用户名@192.168.x.xxx

5.完成ssh免密码\密钥认证

Jenkins ansible插件安装

路径:*Manage Jenkins - Manage Plugins - 可选插件 *

未找到可能是因为已经安装了,在已安装里寻找

2.4 其他补充部署

2.4.1 Jenkins关于jdk的部署

路径:Manage Jenkins - Global Tool Configuration - JDK

JAVA_HOME填写jre路径(以自己实际路径为准)

红色警告无伤大雅,配置是正确的

2.4.2 Jenkins关于maven的部署

3. 新建Item完成自动化部署

3.1 新建Item

1.路径:Jenkins工作台 - 新建Item - 输入任务名称(例:abc.test) - 选择Freestyle project - 确定

Freestyle在普通集成中一般足够使用,如果现实业务中有复杂的逻辑而Freestyle无法满足时,建议可以使用Jenkins 流水线(pipeline)编写pipeline脚本来实现自定义逻辑。
流水线写法可参考:ip地址:port端口号\job\pipeline.test\pipeline-syntax\(例:http:\192.168.10.132:8080\job\pipeline.test\pipeline-syntax)
流水线example:https:\jenkins.io\doc\pipeline\examples\

2.This project is parameterized(项目参数配置)

(1) 添加git分支选择参数 - Git Parameter

添加该参数的作用是在部署该Item时,部署人员可以动态选择git remote branchs中的任意分支,实现灵活部署

(2) 源码管理 - Git\Multiple SCMs

预备:添加Git凭据
路径:工作台 - 凭据 - Stores scoped to Jenkins - Jenkins - 全局凭据 (unrestricted) - 添加一些凭据
填写用户名密码保存即可

需要从git\svn拉取多个项目情况需要安装Multiple SCMs plugin插件

$ + 前面设置的参数名(例如:$playbookBranch)
实现动态选择远程分支的作用

(3) 构建 - Maven

Maven构建模块可以用来对项目进行install\package等操作

(4) 构建 - Ansible playbook

Ansible Playbooks常用模块介绍:

http:\note.youdao.com\noteshare?id=0bfc53f1b967f11d8f7e26ce38cbb6d8

Playbooks框架与格式介绍:

http:\note.youdao.com\noteshare?id=d0d98975bc335c3e12fa73274e62c41f

简单的ansible task脚本例子:

  # 上传jar包到远程服务器指定目录下
  # {{appPkgSrcDir}} 这些参数在inventory文件中定义
  - name: upload jar file to server
    tags:
     - upload
     - test
    copy:
     src: "{{ appPkgSrcDir }}\{{appName}}"
     dest: "{{appDeployDest}}"

  # 得到指定应用的pid
  - name: get pid of service
    shell: "ps -ef | grep -v grep | grep {{serviceName}} | awk '{print $2}'"
    register: pid

  # 展示pid
  - name: display pid
    debug: msg="{{pid.stdout}}"

  - name: source profile
    shell: "source \etc\profile"

  # 强制kill进程(生产环境不建议直接这样操作)
  - name: Force kill stuck processes
    shell: "kill -9 {{ pid.stdout }}"

  - name: sleep 2s 
    command: sleep 2s

  # 开启服务
  - name: start {{serviceName}}
    shell: "cd \data\mbApp\pay-mgt;nohup \home\jdk\jdk1.8.0_152\bin\java -jar {{appName}} --spring.profiles.active=test > nohup.out 2>&1 &"

这个例子比较简单,只适合在开发\测试环境进行测试时为了便捷而使用

Jenkins Ansible配置


评论
  目录