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

carol2000 carol2000     2022-09-01     763

关键词:

预计阅读时间: 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         1     0  0 May17 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0 May17 ?        00:00:00 [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:

 1 [root@角色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 root@cbfb30
11 The key's randomart image is:
12 +--[ RSA 2048]----+
13 | E+o...|
14 | o |
15 +-----------------+

角色2:  (作为角色2,每一台机器都要配置authorized_keys )

1 [root@角色2 .ssh]# cat authorized_keys
2 ssh-rsa Abvx2bklJcJLn+439iaQ== test@jtest.com
3 [root@角色2 .ssh]# pwd
4 /root/.ssh

坑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分别为webdatabase,如其中 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的操作”,这样就打通了从脚本自动编译到部署的任脉。

ansible-playbook用法举例

查看详情

ansible-playbook变量(vars)

ansible-playbook中定义变量:-hosts:webserversvars:http_port:80 ①、在host里定义变量执行结果:  查看详情

ansible-playbook拾遗

 ansible-playbook 和handles一起使用---- hosts: webuser: roottasks:- name: ensure nginx is at the latest versionyum: name=nginx sta 查看详情

ansible-playbook 额外变量的顺序和优先级

】ansible-playbook额外变量的顺序和优先级【英文标题】:ansible-playbookextravarsorderandprecedence【发布时间】:2022-01-2315:25:08【问题描述】:我正在运行ansible-playbook和多个--extra-vars类似ansible-playbook--extra-vars@vars_a.yml--extra-vars@vars_b.yml--ex... 查看详情

ansible-playbook入门实例解析

[[email protected]tlsit]#ansible-playbooka.ymlPLAY[test]******************************************************************************************************************************************* 查看详情

2.ansible-playbook基本参数

不错学完了第一课我叫你ansible-playbook的参数--force-handlersrunhandlersevenifataskfails强制执行handler--list-tagslistallavailabletags列出标签--list-taskslistalltasksthatwouldbeexecuted列出要执行的tasks--skip-tags=SKIP_TAGSonlyru 查看详情

ansible-playbook

yaml的基本元素 变量 Inventory 条件测试 迭代 playbook的组成结构; Inventory modules AdhocCommand playbooks tasks:任务 variables:变量 template:模板 handler:处理器 roles:角色 基本结构: -hosts:webservers  remot 查看详情

ansible-playbook批量添加zabbix监控项目同步配置信息

前言 在上一篇教程中我们已经实现了使用ansible-playbook批量在远程主机上部署zabbix客户端并正常运行,现在我们再次通过ansible-playbook给客户端主机批量增加zabbix监控项目配置(创建监控项目示例:自动发现远程主机监听的TCP... 查看详情

ansible-playbook使用示例参考

ansible-playbook参考(1)基础示例~]# vim base.yaml- hosts: 192.168.1.114  remote_user: root  tasks:  - name: install httpd server&nbs 查看详情

ansible-playbook使用示例参考

ansible-playbook参考(1)基础示例~]# vim base.yaml- hosts: 192.168.1.114  remote_user: root  tasks:  - name: install httpd server&nbs 查看详情

ansible-playbook

语言格式:yml  单个yml文件示例: ----hosts:webservers#主机组vars:##变量设置http_port:80max_clients:200remote_user:roottasks:###主要任务-name:ensureapacheisatthelatestversionyum:pkg=httpdstate=latest-name:writetheapache 查看详情

ansible-playbook

playbook: 通过事先编写好的playbook文件实现批量管理操作 ===============ansible的任务集注意:1.yml中不可使用tabs键2.缩进对齐,严格控制缩进3.#表注释4.---开头 playbook文件 :是ansible主机用于配置,部署和管理托管主机... 查看详情

ansible-playbook主机变量2

ansible-playbook配置hosts后可以指定变量,通过-k可以交互输入密码,也可以将密码写在hosts文件中。入口yaml文件中通过{{**}}获取变量,命令行通过-i指定hosts文件,-e传入参数,如果同时传入多个host参数可使用逗号分隔,同时也可以... 查看详情

ansible-playbook剧本编写(代码片段)

Ansible-playbook一.playbooks组成1.playbooks本身由以下各部分组成二.示例2.when条件判断3.迭代4.Templates模块5.tags模块6.Roles模块一.playbooks组成1.playbooks本身由以下各部分组成(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一... 查看详情

ansible-playbook剧本编写(代码片段)

Ansible-playbook一.playbooks组成1.playbooks本身由以下各部分组成二.示例2.when条件判断3.迭代4.Templates模块5.tags模块6.Roles模块一.playbooks组成1.playbooks本身由以下各部分组成(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一... 查看详情

ansible-playbook之循环(loops)

ansible-playbook的循环(Loops)1.标准的Loops:也是最常用的一种循环例:当需要安装10个软件包时,不用写10次任务,只需要写一次然后进行循环即可#注:已经安装的软件系统即不在安装[[email protected] playbook]# cat yum_list.y... 查看详情

ansible-playbook基本使用

例子:1、ping模块所有cce组主机存活率[[email protected]~]#ansiblecce-mping2、使用command执行命令[[email protected]~]#ansiblecce-mcommand-a‘cat/etc/redhat-release‘3、使用shell模块执行命令[[email protected]~]#ansiblecc 查看详情

sh交互式ansible-playbook执行脚本。(代码片段)

查看详情