[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         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的操作”,這樣就打通了從腳本自動編譯到部署的任脈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM