[Docker][ansible-playbook]3 持续集成环境初探

预计阅读时间: 20分钟

本期解决痛点如下:
1. 代码版本的多样性,编译环境的多样性如何解决?
答案是使用docker,将不同的编译环境images统统打包到私有仓库上,根据需求进行下载,从宿主机上挂载volume到docker container上进行编译等操作
2. 打包编译好的各个模块组件如何部署到不同的服务器上?
答案是使用ansible-playbook,根据yml脚本进行部署,其服务器部署ip由统一的inventory配置文件控制(默认路径在 /etc/ansible/hosts)

Talking is cheap,let‘s go:

环境列表:
角色1: 安装了docker以及git 的宿主机 (源代码服务器)
角色2: 需要被部署的服务器
角色3: docker container(每次根据docker image生成),运行在宿主机上

环境配置(具体步骤在后面):

  • 角色1:ssh-keygen生成秘钥和公钥,将公钥copy置角色2的authorized_keys文化中
  • 配置docker私有仓库,为docker run做准备,  请参考 http://www.cnblogs.com/lienhua34/p/4922130.html
  • 使用git下载自己的repository脚本到角色1(其中包含 playbook 运行所需要的yml以及inventory hosts配置文件)

运行脚本: 宿主机角色1上运行并观察结果

#docker run --rm=true --publish-all=true --name my_deploy --volume=/root/.ssh/id_rsa:/root/.ssh/id_rsa:ro --volume=/export/jenkins/workspace/my-playbooks:/playbooks --workdir=/playbooks 192.168.111.99:5000/centos7-ansible ansible-playbook web.yml -i inventory/test_env1/hosts

 1 # docker run --rm=true --publish-all=true --name my_deploy --volume=/root/.ssh/id_rsa:/root/.ssh/id_rsa:ro--volume=/export/jenkins/workspace/my-playbooks:/playbooks --workdir=/playbooks 192.168.111.99:5000/centos7-ansible ansible-playbook web.yml -i inventory/test_env1/hosts
 2
 3 PLAY [127.0.0.1] ***************************************************************
 4
 5 TASK [setup] *******************************************************************
 6 ok: [127.0.0.1]
 7
 8 TASK [download web page or pkg] ************************************************
 9 changed: [127.0.0.1]
10
11 PLAY [web] *********************************************************************
12
13 TASK [setup] *******************************************************************
14 ok: [222.177.111.222]
15
16 TASK [creates depoy directory] *************************************************
17 ok: [222.177.111.222]
18
19 TASK [copy package to web node] ************************************************
20 changed: [222.177.111.222]
21
22 TASK [check web process] *******************************************************
23 changed: [222.177.111.222]
24
25 PLAY RECAP *********************************************************************
26 127.0.0.1                  : ok=2    changed=1    unreachable=0    failed=0
27 222.177.111.222             : ok=4    changed=2    unreachable=0    failed=0

在角色2被部署服务器上观察部署结果:

1 [[email protected]角色2]# cd /root/dist/
2 [[email protected]角色2 dist]# ls
3 samplepage
4 [[email protected]角色2 dist]# cat /tmp/check.Log
5 UID        PID  PPID  C STIME TTY          TIME CMD
6 root         1     0  0 May17 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
7 root         2     0  0 May17 ?        00:00:00 [kthreadd]

Docker Run的脚本具体解读:

#docker run --rm=true --publish-all=true --name my_deploy --volume=/root/.ssh/id_rsa:/root/.ssh/id_rsa:ro --volume=/export/jenkins/workspace/my-playbooks:/playbooks --workdir=/playbooks 192.168.111.99:5000/centos7-ansible ansible-playbook web.yml -i inventory/test_env1/hosts

--rm=true 表示不保留container

--publish-all=true 表示将随机选择映射端口对外进行通信 (https://docs.docker.com/engine/userguide/networking/default_network/binding/)

--volume=/root/.ssh/id_rsa:/root/.ssh/id_rsa:ro 告诉角色3(docker container)使用角色1(宿主机)的ssh id_rsa key(采用只读的方式)来访问角色3(需要被部署的服务器)

--volume=/export/jenkins/workspace/my-playbooks:/playbooks 讲角色1的git repository 工作路径映射至角色2的/playbooks 路径,这样就巧妙的免去了原先手工将代码copy到编译环境的步骤

192.168.111.99:5000/centos7-ansible  指定需要运行的docker image 编译环境

ansible-playbook web.yml -i inventory/test_env1/hosts    整句话为一段段,指在角色3(docker container)上使用ansible-playbook根据角色1(宿主机)的inventory/test_env1/hosts配置文件,按照web.yml脚本来配置角色2(被部署web服务器)

=====环境配置的具体步骤:==========

  • 角色1:ssh-keygen生成秘钥和公钥,将公钥copy置角色2的authorized_keys文化中

角色1:

 1 [[email protected]角色1]# ssh-keygen
 2 Generating public/private rsa key pair.
 3 Enter file in which to save the key (/root/.ssh/id_rsa):
 4 Created directory ‘/root/.ssh‘.
 5 Enter passphrase (empty for no passphrase):
 6 Enter same passphrase again:
 7 Your identification has been saved in /root/.ssh/id_rsa.
 8 Your public key has been saved in /root/.ssh/id_rsa.pub.
 9 The key fingerprint is:
10 f3:5f:f4:37:d44f:18 [email protected]
11 The key‘s randomart image is:
12 +--[ RSA 2048]----+
13 | E+o...|
14 | o |
15 +-----------------+

角色2:

1 [[email protected]角色2 .ssh]# cat authorized_keys
2 ssh-rsa Abvx2bklJcJLn+439iaQ== [email protected]
3 [[email protected]角色2 .ssh]# pwd
4 /root/.ssh

坑1:如果从角色1无法从私有仓库下载,请修改Docker的配置文件如下

[email protected]角色1:/home/test# cat /etc/default/docker |grep 5000
DOCKER_OPTS="--insecure-registry <Yourprivate.docker.imagesRepository.IP>:5000"
# systemctl restart docker
  • 使用git下载自己的repository脚本到角色1(其中包含 playbook 运行所需要的yml以及inventory hosts配置文件)
 1 [email protected]角色1:/export/jenkins/workspace/my-playbooks# cat web.yml
 2 ---
 3 - hosts: 127.0.0.1
 4   connection: local
 5   tasks:
 6     - name: download web page or pkg
 7       get_url: url=https://www.google.com.hk dest=/tmp/samplepage
 8
 9 - hosts: web
10   tasks:
11     - name: creates depoy directory
12       file: path=/root/dist/ state=directory
13     - name: copy package to web node
14       copy: src=/tmp/samplepage dest=/root/dist/
15     - name: check web process
16       shell: "ps -ef>/tmp/check.Log"

修改inventory 配置文件

其中 web 里面的IP为角色2,即需要被部署的服务器

1 [email protected]角色1:/export/jenkins/workspace/my-playbooks# cat inventory/test_env1/hosts
2 [web]
3 222.177.111.222 web_path=/export/App/
4
5 [email protected]角色1:/export/jenkins/workspace/my-playbooks# pwd
6 /export/jenkins/workspace/my-playbooks

后记:

1. 依托于强大的playbook,不但可以做文件/目录的增删改,还可以做解压、循环等更高级的操作,请参考

playbook 入门: http://msiyuetian.blog.51cto.com/8637744/1752326

playbook 官方文档 http://ansible-tran.readthedocs.io/en/latest/docs/playbooks.html

预告:下一篇将介绍“如何使用Jenkins结合makefile来进行docker run的操作”,这样就打通了从脚本自动编译到部署的任脉。

时间: 2024-09-30 20:50:48

[Docker][ansible-playbook]3 持续集成环境初探的相关文章

实战docker+jenkins+git构建持续集成环境

本文重点介绍jenkins以及让jenkins如何实现在docker容器中运行.jenkins和docker私有仓库又是怎么结合的.docker说明及安装和git说明及安装在本文中不会特别详细的介绍. ?并且,在本文中不着重介绍原理性的东西,比如不会介绍什么是持续集成.持续构建等等.本文的重点是实战为主.对持续集成.持续交互.持续部署不太了解的朋友可以参考这篇文章了解一下:https://www.zhihu.com/question/23444990 1.背景说明 Jenkins是一个开源软件项

在 Docker 里构造 Meteor 持续集成环境

持续集成由以下环节组成: 代码版本库 (gitlab等) CI服务 (gitlab-ci/jenkins等 coordinator) CI Runner 当开发者将修改推送到版本库时,版本库会通知 CI服务,CI服务则会取出一份代码,交给 Runner进行检测,Runner将检测结果汇报给 CI服力.当然,开发者在提交代码之前,应该已经在自己的环境里做过必要的测试了. Meteor已经选定 Velocity做为官方测试框架,通过 meteor run --test可以调用不同的测试工具完成单元测

docker搭建gitlab+Jenkins持续集成环境

安装docker 此处省略一.使用docker安装gitlab docker pull gitlab/gitlab-ce:latest下载完成之后使用docker生成容器docker run -dit \-p 8443:443 \-p 8080:80 \-p 2222:22 \-p 9090:9090 \--name gitlab \--restart always \-v /home/gitlab/config:/etc/gitlab \-v /home/gitlab/logs:/var/lo

Docker结合Jenkins构建持续集成环境

环境说明: jenkins+svn:192.168.71.142 测试环境:192.168.71.145 生产环境:192.168.71.148 操作系统:centos7.5 Maven3.5 Tomcat8 JDK1.8 Jenkins2.7 Docker CE 17.06 SVN安装配置及简单使用: # yum -y install subversion # mkdir /home/svn # svnadmin create /home/svn/repos # vi /home/svn/re

构建Docker+Jenkins持续集成环境

docker和Jenkins不是什么新东西了,两者结合也不是什么稀奇的事情,也已经有很多Jenkins和docker相结合的文章,此文仅为自己的一点心得实践,如有不对的地方,欢迎大家纠正. 先贴上大致的流程图,逐步说明: 代码-Git: 并没有什么好说明的,就是简单的使用了Git作为版本控制工具而已,通用使用规范不在细说.此步的产出:Git分支特定版本号 Git-自动构建.自动构建-代码包: 做法也很通用了,将project的Git钩子同Jenkins结合,达到特定分支有push时机触发自动构建

Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目

前文使用Docker搭建Jenkins+Docker持续集成环境我们已经搭建了基于docker+jenkins的持续集成环境,并构建了基于maven的项目.这一节,我们继续扩展功能,增加对Nodejs的支持,实现nodejs项目构建.并打包成docker镜像和自动部署. 1. 配置Nodejs环境 1.1 安装nodejs插件 打开系统管理——管理插件——可选插件,搜索NodeJS,选择NodeJS Plugin安装 1.2 配置nodejs 版本 系统管理 —— 全局工具配置 —— NodeJ

简单搭建Gitlab CI持续集成环境

简单搭建Gitlab CI持续集成环境 简单介绍Gitlab CI的功能 从GitLab 8.X 开始,GitLab CI就已经集成在GitLab中,我们只要在项目中添加一个.gitlab-ci.yml文件,然后添加一个Runner,开启Runner,即可进行持续集成.而且随着GitLab的升级,GitLab CI变得越来越强大. GitLab Runner 在没使用过Gitlab之前,我也有一个困惑,到底Gitlab Runner是什么东西.它的作用是什么?</br>GitLab Runne

持续集成环境搭建

Jenkins - 持续集成环境搭建 1. Jenkins 概述 Jenkins是一个开源的持续集成工具.持续集成主要功能是进行自动化的构建.自动化构建包括自动编译.发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件. 2. Jenkins功能 主要功能: l 代码库(svn/git等)代码发生变化后更新代码至jenkins工作目录 l 代码变化后启动编译或设置定时编译 l 输出编译结果,包括生成的目标文件 l 邮件通知构建结果 3. Jenkins构建过程 1. 向代码库提交代

jenkins + Git 搭建持续集成环境

jenkins + Git 搭建持续集成环境 持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前广泛应用的持续集成工具,本文记录我使用jenkins+Git配置持续集成环境的整个流程以及踩到的坑(jenkins过程的坑往往不是在第一次配置,而是在配置结束后更改某些配置项的时候踩到). 总体流程如下: tomcat8.0下载地址:http://tom