[Docker][ansible-playbook]3 持续集成环境之分布式部署
预计阅读时间: 30分钟
本期解决痛点如下:
1. 代码版本的多样性,编译环境的多样性如何解决?
答案是使用docker,将不同的编译环境images统统打包到私有仓库上,根据需求进行下载,从宿主机上挂载volume到docker container上进行编译等操作
2. 打包编译好的各个模块组件如何部署到不同的服务器上?
答案是使用ansible-playbook,根据yml脚本进行分布式部署,其各个服务器的部署ip由统一的inventory配置文件控制(默认路径在 /etc/ansible/hosts)
Talk is cheap,let's go:
环境列表:
角色1: 安装了docker以及git 的宿主机 (源代码服务器)
角色2: 需要被部署的服务器组
角色3: docker container(每次根据docker image生成),运行在宿主机上
环境配置(yml和inventory hosts配置参数以及具体配置步骤在后面):
- 角色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
# 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
PLAY [127.0.0.1] ***************************************************************
TASK [setup] *******************************************************************
ok: [127.0.0.1]
TASK [download web page or pkg] ************************************************
changed: [127.0.0.1]
PLAY [web] *********************************************************************
TASK [setup] *******************************************************************
ok: [222.177.111.222]
TASK [creates depoy directory] *************************************************
ok: [222.177.111.222]
TASK [copy package to web node] ************************************************
changed: [222.177.111.222]
TASK [check web process] *******************************************************
changed: [222.177.111.222]
PLAY [database] ****************************************************************
TASK [setup] *******************************************************************
ok: [222.177.111.222]
TASK [creates db depoy directory] **********************************************
ok: [222.177.111.222]
TASK [copy package to db node] *************************************************
changed: [222.177.111.222]
TASK [shell operation process] *************************************************
changed: [222.177.111.222]
PLAY RECAP *********************************************************************
127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0
222.177.111.222 : ok=8 changed=4 unreachable=0 failed=0
在角色2 被部署服务器组web和database上观察部署结果:
[root@角色2 web服务器]# cd /root/dist/
[root@角色2 web服务器]# ls
samplepage
[root@角色2 web服务器]# cat /tmp/check.Log
UID PID PPID C STIME TTY TIME CMD
root May17 ? :: /usr/lib/systemd/systemd --switched-root --system --deserialize
root May17 ? :: [kthreadd]
[root@角色2 db服务器~]# cat database/db.
db.conf db.Log
[root@角色2 db服务器~]# cat database/db.Log
Fri May 19 14:33:01 CST 2017
[root@角色2 db服务器~]# pwd
/root
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:
[root@角色1]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f3:5f:f4::d44f: root@cbfb30
The key's randomart image is:
+--[ RSA ]----+
| E+o...|
| o |
+-----------------+
角色2: (作为角色2,每一台机器都要配置authorized_keys )
[root@角色2 .ssh]# cat authorized_keys
ssh-rsa Abvx2bklJcJLn+439iaQ== test@jtest.com
[root@角色2 .ssh]# pwd
/root/.ssh
- 配置docker私有仓库, 请参考 http://www.cnblogs.com/lienhua34/p/4922130.html
坑1:如果从角色1无法从私有仓库下载,请修改Docker的配置文件如下
root@角色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配置文件)
其中web.yml的配置如下
root@角色1:/export/jenkins/workspace/my-playbooks# cat web.yml
---
- hosts: 127.0.0.1
connection: local
tasks:
- name: download web page or pkg
get_url: url=https://www.google.com.hk dest=/tmp/samplepage
- hosts: web
tasks:
- name: creates depoy directory
file: path=/root/dist/ state=directory
- name: copy package to web node
copy: src=/tmp/samplepage dest=/root/dist/
- name: check web process
shell: "ps -ef>/tmp/check.Log"
- hosts: database
tasks:
- name: creates db depoy directory
file: path=/root/database/ state=directory
- name: copy package to db node
copy: src=/tmp/samplepage dest=/root/database/db.conf
- name: shell operation process
shell: "echo `date` >/root/database/db.Log"
由上图可以看到样例中需要配置2台机器 ,其hosts分别为web和database,如其中 web 里面的IP为角色2,即需要被部署的服务器。
然后再修改对应的inventory hosts配置文件,指定web和host服务器角色的ip和路径等参数
root@角色1:/export/jenkins/workspace/my-playbooks# cat inventory/test_env1/hosts
[web]
222.177.111.222 web_path=/export/App/web
[database]
222.177.111.222 db_path=/export/App/db
后记:
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的操作”,这样就打通了从脚本自动编译到部署的任脉。
[Docker][ansible-playbook]3 持续集成环境之分布式部署的更多相关文章
- [ansible-playbook]4 持续集成环境之分布式部署利器 ansible playbook学习
3 ansible-play讲的中太少了,今天稍微深入学习一点 预计阅读时间:15分钟 一: 安装部署 参考 http://getansible.com/begin/an_zhuang_ansile ...
- Docker 结合Jenkins 构建持续集成环境
Docker 结合Jenkins 构建持续集成环境 Jenkins : 一个开源的持续集成工具, 提供软件版本发布.自动测试等一系列流程及丰富的插件 Maven: 一个自动化构建工具, 通过一段描述 ...
- 持续集成环境--Tomcat热部署导致线程泄漏
一.问题由来 我们组用jenkins部署了持续集成环境,(jenkins部署war包到远程服务器的tomcat). 每次提交了代码,jenkins上一键构建,就可以自动拉取最新代码,打war包,热部署 ...
- 基于Docker+Jenkins+Gitlab搭建持续集成环境
随着DevOps理念和敏捷理念的发展,我们希望通过自动化技术,加快项目的迭代.尤其是当使用微服务方案后,面临在大量的项目构建和部署工作,借助于jenkins的持续集成,可以快速把应用打包成docker ...
- 使用Jenkins+Docker+Gitlab+Maven搭建持续集成环境
继使用Docker搭建Gitlab后 大致的步骤如下: 开发人员通过IDE工具(IntelliJ IDEA)将代码推送到gitlab. jenkins从gitlab中获取到源码,并使用maven编译. ...
- Docker结合Jenkins构建持续集成环境
1.环境说明: jenkins+svn:192.168.71.142 测试环境:192.168.71.145 生产环境:192.168.71.148 操作系统:centos7. Maven3. Tom ...
- JavaWeb+SVN+Maven+Tomcat +jenkins搭建持续集成环境和自动部署
https://blog.csdn.net/wh52788/article/details/80900477 https://blog.csdn.net/liyong1028826685/articl ...
- 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)
本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...
随机推荐
- Python3之内建模块datetime
datetime datetime是python处理日期和时间的标准库 获取当前日期和时间 >>> from datetime import datetime #获取当前的datet ...
- 常见问题:计算机网络/完整HTTP访问
域名解析 以浏览器进行HTTP访问为例,首先搜索自身DNS缓存(一般缓存1000条左右,仅缓存1分钟),若有且未过期,结束. 若未找到,则搜索操作系统的DNS缓存. 若未找到,尝试读取hosts文件. ...
- 19-js策略模式
var PriceStrategy = function() { var stragtegy = { return30: function(price) { return +price + parse ...
- 使用video.js 7在html中播放rtmp视频流
1.背景 最近要做摄像头视频的展示,不想使用硬件方的专用插件,所以计划视频推送到SRS服务器,浏览器再通过rtmp协议显示,类似于直播. 经查询,了解到可以用ckplayer(有许可条款)和video ...
- CVE-2019-2725修复(删包)
本来想试试打补丁,但是有些麻烦,而且oracle补丁黑名单的方式总不让人放心. 因此考虑直接删除相关的包. 该方式适用于xmldecoder漏洞系列,如CVE-2017-3506.CVE-2017-1 ...
- linux抓取top命令中数据的方法
top在linux中是一个非常直观的命令,可以清晰地看到各进程对资源的使用情况. 但是如果你想从top命令展示中提取某些数据出来,如果想当然地使用这句命令: top|grep xxx 就会被卡住, ...
- [转帖]Hive 快速入门(全面)
Hive 快速入门(全面) 2018-07-30 16:11:56 琅琊山二当家 阅读数 4343更多 分类专栏: hadoop 大数据 转载: https://www.codercto.com/ ...
- 【转】linux卸载mysql
查看是否安装了MySQL执行命令rpm -qa | grep mysql 执行过程[root@localhost ~]# rpm -qa | grep mysqlmysql-community-lib ...
- C 语言函数手册:涵盖字符测试、字符串操作、内存管理、时间换算、数学计算、文件操作、进程管理、文件权限控制、信号处理、接口处理、环境变量、终端控制
1. 字符测试函数 函数 说明 isascii() 判断字符是否为ASCII码字符 2. 字符串操作 函数 说明 gcvt() 将浮点型数转换为字符串(四舍五入) index() 查找字符串并返回首次 ...
- QT 设置程序图标
1.应用窗口左上角的图标.状态栏上显示的图标用setWindowIcon()函数: 2.可执行程序的图标设置: (1).右键项目添加一个资源文件 (2).导入.ico文件图标