[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] *************************************************************** 45 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]]# cd /root/dist/ 2 [[email protected] dist]# ls 3 samplepage 4 [[email protected] 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]]# 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] .ssh]# cat authorized_keys 2 ssh-rsa Abvx2bklJcJLn+439iaQ== [email protected] 3 [[email protected] .ssh]# pwd 4 /root/.ssh
- 配置docker私有倉庫, 請參考 http://www.cnblogs.com/lienhua34/p/4922130.html
坑1:如果從角色1無法從私有倉庫下載,請修改Docker的配置文件如下
[email protected]:/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]:/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]:/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]:/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的操作”,這樣就打通了從腳本自動編譯到部署的任脈。
[Docker][ansible-playbook]3 持續集成環境初探