首发于:Jenkins 中文社区nginx
本文介绍如何使用 Jenkins + Ansible 实现对 Nginx 的自动化部署。最终达到的效果有以下几点:git
本次实验使用 Docker Compose 搭建 Jenkins 及 Jenkins agent。使用 Vagrant 启动一台虚拟机,用于部署 Nginx。使用 Vagrant 是可选的,读者可使用 VirtualBox 启动一个虚拟机。使用 Vagrant 彻底是为了自动化搭建实验环境。github
如下是整个实验环境的架构图:docker
注意,图中的 5123 <-> 80
表明将宿主机的 5123 端口请求转发到虚拟机中的 80 端口。shell
git clone https://github.com/zacker330/jenkins-ansible-nginx.git cd jenkins-ansible-nginx 复制代码
docker build -f JenkinsSlaveAnsibleDockerfile -t jenkins-swarm-ansible . 复制代码
docker-compose up -d 复制代码经过
http://localhost:8080
访问 Jenkins master,若是出现“解锁密码”页面,以下图,则执行命令 docker-compose logs jenkins
查看 Jenkins master 启动日志。将日志中的解锁密码输入到表单中。而后就一步步按提示安装便可。vagrant up
复制代码
注意,Vagrantfile 文件中的 config.vm.box
值必须改为你的 vagrant box 。至此,实验环境已经搭建好了。接下来就能够新建 Jenkins 任务了。安全
除此以外,不须要其它配置了,是否是很简单?
复制代码
点击“当即构建”:bash
最终执行日志以下:服务器
至此,部署已经完成。之后修改 Nginx 的配置,只须要修改代码,而后推送到远程仓库,就会自动化部署。不须要手工登陆到目标机器手工修改了。markdown
最后,咱们能够经过访问 http://localhost:5123
,若是出现以下页面说明部署成功:架构
以上步骤并不能看出自动化部署真正作了什么。那是由于咱们全部的逻辑都写在代码中。是的,能够说是 everything is code。
接下来咱们介绍代码仓库。
% tree -L 2 ├── JenkinsSlaveAnsibleDockerfile # Jenkins agent 镜像 Dockerfile ├── Jenkinsfile # 流水线逻辑 ├── README.md ├── Vagrantfile # Vagrant 虚拟机定义文件 ├── docker-compose.yml # Jenkins 实现环境 ├── env-conf # 全部应用配置 │ └── dev # dev 环境的配置 ├── deploy # Ansible 部署脚本所在文件夹 │ ├── playbook.yaml │ └── roles └── swarm-client.sh # Jenkins swarm 插件的客户端 复制代码
Jenkinsfile 文件用于描述整条流水线的逻辑。代码以下:
pipeline{ // 任务执行在具备 ansible 标签的 agent 上 agent { label "ansible"} environment{ // 设置 Ansible 不检查 HOST_KEY ANSIBLE_HOST_KEY_CHECKING = false } triggers { pollSCM('H/1 * * * *') } stages{ stage("deploy nginx"){ steps{ sh "ansible-playbook -i env-conf/dev deploy/playbook.yaml" } }}} 复制代码
environment
部分:用于定义流水线执行过程当中的环境变量。triggers
部分:用于定义流水线的触发机制。pollSCM
定义了每分钟判断一次代码是否有变化,若是有变化则自动执行流水线。agent
部分:用于定义整条流水线的执行环境。stages
部分:流水线的全部阶段,都被定义在这部分。以上只是定义流水线是如何执行的,目前整条流水线只有一个 deploy nginx
阶段,而且只执行了一条 ansible-playbook
命令。可是它并无告诉咱们部署逻辑是怎么样的。
全部的部署逻辑,包括 Nginx 的安装启动、配置的更新以及加载,都放在 Ansible 脚本中。对 Ansible 不熟的同窗,能够在本文末尾找到介绍 Ansible 的文章。
整个部署逻辑的入口在 deploy/playbook.yaml
,代码以下:
--- - hosts: "nginx" become: true roles: # Nginx 的部署 - ansible-role-nginx # 对防火墙的设置 - ansible-role-firewall 复制代码
hosts
:定义了 playbook 部署的目标主机分组名为 nginx
。roles
:包含了两个执行具体部署动做的 role,至于 role 内部逻辑,不在本文讨论范围,有兴趣的同窗阅读源码。谈到部署,就不得不谈配置管理。
回顾前文中流水线中执行的 shell 命令:ansible-playbook -i env-conf/dev deploy/playbook.yaml
咱们经过 -i
参数指定部署时所使用的环境配置。经过这种方式实现环境配置与执行脚本的分离。这样带来如下几个好处:
-i
参数值改为:env-conf/test
。本次实验中,各个环境的配置放在 env-conf
目录中,目前只有 dev 环境,如下是 env-conf/
目录结构:
% cd env-conf/ % tree └── dev ├── group_vars │ └── nginx.yaml ├── host_vars │ └── 192.168.52.10 └── hosts 复制代码
[nginx]
192.168.52.10
复制代码
192.168.52.10
是一个 YAML 格式文件。注意文件名是该主机的 IP。咱们在文件中放主机相关的配置,好比 Ansible 链接主机时使用到的用户名和密码。nginx
这个组的的配置变量。文件名与 hosts
中的组名对应。到此,咱们完整的自动化部署已经讲解完成。可是还遗留下一些问题:
host_vars/192.168.52.10
文件中的,存在安全风险。本文属于使用 Jenkins + Ansible 实现自动化部署的入门文章,笔者将根据读者的反馈决定是否写续集。
若是以为本文讲的 Jenkins 流水线逻辑部分不够过瘾,能够考虑入手一本最近才出版的《Jenkins 2.x实践指南》。长按下图进行扫码购买。
做者:翟志军