Contenu connexe Similaire à Continuous Delivery Workshop with Ansible x GitLab CI (20) Plus de Chu-Siang Lai (15) Continuous Delivery Workshop with Ansible x GitLab CI1. 1
______________________________
/ DevOps ⼈人⼀一定要知道的持續交付技巧
- Ansible & GitLab CI 實戰演練 /
------------------------------
^__^
(oo)_______
(__) )/
||----w |
|| ||
[ chusiang@DigitalOecanHsinchu ~ ] $ cat .profile
# Author: 凍仁翔 / chusiang@drx.tw
# Blog: http://note.drx.tw
# Modified: 2017-10-15 22:44
4. 關於我
• 凍仁翔 (@chusiang_lai)。
• 《凍仁的筆記》站長。
• DevOps Taiwan 志⼯工。
• 2 年年左右的 Ansible 使⽤用經驗。
• 5 年年以上的 IT 營運經驗。
• 第 8 屆 IT 邦幫忙鐵⼈人賽
DevOps 組冠軍。
4
27. 持續交付和持續部署有什什麼不同?
前者需⼿手動 Release ⾄至 Production,⽽而後者則⾃自動化之。
Continuous Delivery
Continuous Deployment
auto auto manual
Build Deploy Test Release
auto auto auto
Build Deploy Test Release
27
30. R&D:我程式寫完了了! 我:等 CD 過了了再說。
Code 還在本機?
推上 Git server?
組態設定對了了?
單元測試過了了?
持續交付過了了?
真 實 案 例例
R&D:我程式寫完了了!
我:(哪裡寫完了了?!)
30
32. R&D:我程式寫完了了! 我:等 CD 過了了再說。
Code 還在本機?
推上 Git server?
組態設定對了了?
單元測試過了了?
持續交付過了了?
真 實 案 例例
32
36. Ansible ⾃自 2013 年年創立,
於 2015 年年被 Red Hat 併購。
iThome - http://goo.gl/yJbWtz
36
39. Ansible 和 Tower 有什什麼不同?
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
39
40. 我⼼心中的 Ansible 是什什麼?
1. 與 Puppet、SaltStack、Chef 並列列其四。
2. Python like 的組態設定⼯工具
(Infrastructure as Code)。
40
48. 怎麼安裝 Ansible?
• 只需在 Control Machine (主控端) 安裝 Ansible;
Managed node 則需 Python 2.5+ 和 SSH。
$ sudo apt-get install ansible # Debian, Ubuntu.
$ sudo yum install ansible # RHEL, CentOS.
$ brew install ansible # Mac OS X (homebrew).
$ sudo pip install ansible # Python (pip).
48
49. 怎麼設定 Ansible?
• 藉由 ansible.cfg 來來設定 inventory (host file) 檔案路路徑、
Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。
$ vim ansible.cfg
1 [defaults]
2 inventory = hosts # 指定 inventory 路路徑。
3
4 remote_user = docker # 遠端登入的使⽤用者名稱。
5
6 #private_key_file = ~/.ssh/id_rsa
7
8 host_key_checking = False # 不檢查 ssh ⾦金金鑰。
49
50. inventory 是什什麼?
• 定義 Managed node (被控端) 位址與群組的主機清冊,
通常會⽤用來來設定 ssh 或 winrm 的連線資訊。
$ vim hosts
1 # 在同⼀一主機的不同 Port 跑 ssh server。
2
3 [staging]
4 stg.demo.drx.tw ansible_ssh_host=demo.drx.tw
ansible_ssh_port=10022
5
6 [production]
7 prd.demo.drx.tw ansible_ssh_host=demo.drx.tw
ansible_ssh_port=20022
50
54. ⼀一般的 command line 是什什麼?
• 這裡的 command line 為 Linux Shell 底下的指令操作,
以下為 ping 和 echo 的操作的結果。
$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.037 ms
--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet
loss
round-trip min/avg/max/stddev = 0.037/0.037/0.037/0.000 ms
$ echo Hello World
Hello World
54
55. 怎麼⽤用 Ad-Hoc commands?
ansible <host-pattern> [-m module_name] [-a args] [options]
• host-pattern: all, server1, server1:server2, server_group.
$ ansible all -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
$ ansible all -m command -a "echo Hello World"
localhost | SUCCESS | rc=0 >>
Hello World
# 各個 Module 的詳細說明請參參考官⽅方 All Modules ⽂文件。
55
57. 57
Playbooks 是什什麼?
• 比 Shell Script 更更結構
化的腳本語⾔言,是⼀一鍵
部署的好物。
• 使⽤用 YAML 格式,簡單
易易讀。
Baby Playbook Onesie - http://goo.gl/GKJvXn
58. 58
Playbooks 是什什麼?
• 通常會有 Play, Task,
Module 和 handler 等。
• 整合 Jinja2 的 template
系統,可使⽤用變數、判
斷式、迴圈等表達式。
Baby Playbook Onesie - http://goo.gl/GKJvXn
59. 59
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play、多個 Task 和多個 Module。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
60. 60
Playbooks 是什什麼?
• 執⾏行行 playbook。
$ ansible-playbook example2.yml
PLAY [a sample playbook.] *******************************************
TASK [setup]*********************************************************
ok: [stg.demo.drx.tw]
TASK [Hello World] **************************************************
changed: [stg.demo.drx.tw]
TASK [Install Vim] **************************************************
changed: [stg.demo.drx.tw] => (item=[u'vim'])
PLAY RECAP **********************************************************
stg.demo.drx.tw : ok=1 changed=2 unreachable=0 failed=0
61. 61
• 執⾏行行 playbook。
Playbooks 是什什麼?
$ ansible-playbook example2.yml
PLAY [a sample playbook.] *******************************************
TASK [setup]*********************************************************
ok: [stg.demo.drx.tw]
TASK [Hello World] **************************************************
changed: [stg.demo.drx.tw]
TASK [Install Vim] **************************************************
changed: [stg.demo.drx.tw] => (item=[u'vim'])
PLAY RECAP **********************************************************
stg.demo.drx.tw : ok=1 changed=2 unreachable=0 failed=0
TASK [setup]:被執⾏行行的 managed node 有哪些
PLAY RECAP:總結 (ok / changed / failed )
62. 62
• 透過動作 (Play) 對特定 Managed node 進⾏行行操控,通常包含 Task 和 Module。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。
Plays 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Play
63. 63
• 藉由各種不同的模組 (Module)、迴圈和判斷式等組合來來完成各種任務 (Task)。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。
Tasks 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Task 1
Task 2
64. 64
• 最⼩小的操作⽅方法 (Method),好比 Python 的內建函式。
• 此例例⽤用到了了 Play × 1, Task × 2 和 Module × 2 (command, apt)。
Modules 是什什麼?
$ vim example.yml
1 ---
2 - name: a sample playbook
3 hosts: all
4 tasks:
5 - name: Hello World
6 command: echo "Hello World"
7 - name: Install Vim
8 become: true
9 apt:
10 name: vim
Module
66. 練習環境為 Control Machine (Ubuntu 16.04) + Managed node*2 (Ubuntu 16.04)。
透過 Ansible 和 Jupyter 操控 Managed node
66
67. $ docker run -P -d
chusiang/ansible-jupyter:ubuntu-16.04
67
68. # 建立 Control Machine。
$ docker run -p 8888:8888 -d
chusiang/ansible-jupyter:ubuntu-16.04
# 建立 Managed node 1。
$ docker run -p 10022:22 -d
chusiang/ansible-managed-node:ubuntu-16.04
# 建立 Managed node 2。
$ docker run -p 20022:22 -d
chusiang/ansible-managed-node:ubuntu-16.04
# 查看 Managed node 的 ssh port。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
......
68
69. 怎麼⽤用 Jupyter 上的 Ansible 操控 Managed node?
透過 ansible.cfg 和 inventory 將兩兩者串串接。
69
72. GitLab 是什什麼?
集 Git Repository、Docker Registry、Issue tracking、Code Review、
CI 和 CD 於⼀一⾝身的現代平台。
72
73. 回顧 Ansible 和 Tower 的 Ecosystems
https://www.ansible.com/blog/red-hat-ansible-automation-engine-vs-tower
73
75. ⽤用 GitLab CI 實作 Pipeline
Unit Test Integration Test Delivery DeploymentBuildSyntax Check
75
77. Ch 5. 部署流⽔水線解析
Ch 6. 建置與部署的腳本化
Ch 7. 提交階段
Ch 8. ⾃自動化驗測試
Ch 9. 非功能性需求測試
Ch 10. 應⽤用程式的部署與發佈
書中的 Pipeline 是什什麼?
《Continuous Delivery》- https://goo.gl/r9vXFg
77
78. 原始
程式碼
應⽤用程式
設置
提交階段
編譯
單元測試
程式碼分析
組裝 binaries
驗收階段
設置環境
部署 binaries
冒煙測試
驗收測試
UAT 階段
設置環境
部署 binaries
冒煙測試
探索性測試
⽣生產⼒力力測試階段
設置環境
部署 binaries
冒煙測試
執⾏行行⽣生產⼒力力測試
⽣生產環境
設置環境
部署 binaries
冒煙測試
版本控制
⾃自動發佈⾃自動發佈
⼀一鍵發佈
⼀一鍵發佈
Binary 儲存庫
binaries
metadata
程式碼 應⽤用程式設置
binaries metadata binaries
binaries
metadata metadata
Adapted from “Continuous Delivery” © Dave Farley and Jez Humble 2010
Translated by Chu-Siang Lai 2017 78
79. 原始
程式碼
應⽤用程式
設置
提交階段
編譯
單元測試
程式碼分析
組裝 binaries
驗收階段
設置環境
部署 binaries
冒煙測試
驗收測試
UAT 階段
設置環境
部署 binaries
冒煙測試
探索性測試
⽣生產⼒力力測試階段
設置環境
部署 binaries
冒煙測試
執⾏行行⽣生產⼒力力測試
⽣生產環境
設置環境
部署 binaries
冒煙測試
版本控制
⾃自動發佈⾃自動發佈
⼀一鍵發佈
⼀一鍵發佈
Binary 儲存庫
binaries
metadata
程式碼 應⽤用程式設置
binaries metadata binaries
binaries
metadata metadata
Adapted from “Continuous Delivery” © Dave Farley and Jez Humble 2010
Translated by Chu-Siang Lai 2017 79
85. Ⅷ. 怎麼操作 GitLab CI?
在專案底下建立 .gitlab-ci.yml,當程式碼上傳⾄至 GitLab 即會觸發 GitLab CI。
85
86. • YAML 語法。
• 此例例⼤大致可分為 stage × 1 和 job × 1。
怎麼寫 .gitlab-ci.yml?
$ vim .gitlab-ci.yml
1 stages:
2 - build
3
4 build_binary:
5 image: ubuntu:16.04
6 stage: build
7 script:
8 - chmod 755 penguin-htdocs/DEBIAN
9 - dpkg -b penguin-htdocs
10 tags:
11 - docker
86
90. Ⅸ. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
在 GitLab CI,⽤用 Ansible (Docker Containers) 跑 Playbooks 即可。
90
103. $ vim .gitlab-ci.yml
1 stages:
2 - build
3 - deploy
4 - test
5 - release
6
7 build_binary:
8 image: ubuntu:16.04
9 stage: build
10 script:
11 # For fix bad permissions of control directory on GitLab CI.
12 - chmod 755 penguin-htdocs/DEBIAN
13
14 # build deb.
15 - dpkg -b penguin-htdocs
16 artifacts:
17 expire_in: 1 week
18 paths:
19 - penguin-htdocs.deb
20 tags:
21 - docker
22
5
TestDeploy ReleaseBuild
103
104. 22
23 deploy_to_dev:
24 image: chusiang/ansible:alpine-3.6
25 stage: deploy
26 script:
27 - ls
28 - cd ansible-playbooks/
29 - echo "${VAULT_KEY}" > secret.txt
30 - ansible-playbook deploy.yml
31 - rm -f secret.txt
32 only:
33 - master@chusiang/coscup2017-cd-demo
34 - develop@chusiang/coscup2017-cd-demo
35 - tags@chusiang/coscup2017-cd-demo
36 tags:
37 - docker
38
6
TestDeploy ReleaseBuild
104
105. 38
39 test_dev:
40 image: chusiang/ansible:alpine-3.6
41 stage: test
42 script:
43 - cd ansible-playbooks/
44 - echo "${VAULT_KEY}" > secret.txt
45 - ansible-playbook test.yml
46 - rm -f secret.txt
47 only:
48 - master@chusiang/coscup2017-cd-demo
49 - develop@chusiang/coscup2017-cd-demo
50 - tags@chusiang/coscup2017-cd-demo
51 tags:
52 - docker
53
7
TestDeploy ReleaseBuild
105
106. 53
54 release_to_prd:
55 image: chusiang/ansible:alpine-3.6
56 stage: release
57 script:
58 - cd ansible-playbooks/
59 - echo "${VAULT_KEY}" > secret.txt
60 - ansible-playbook -i production deploy.yml
61 - rm -f secret.txt
62 only:
63 - master@chusiang/coscup2017-cd-demo
64 - tags@chusiang/coscup2017-cd-demo
65 tags:
66 - docker
67 8
TestDeploy ReleaseBuild
106
115. Demo 環境為 Control Machine (Alpine 3.6) + Managed node*2 (Ubuntu 16.04)。
透過 GitLab CI 和 Ansible 操控 Managed node
115
120. 我的 Pipeline 進化史
Unit Test Integration Test Delivery DeploymentBuildSyntax Check
Unit Test Delivery DeploymentBuildSyntax Check
Unit TestDelivery DeploymentBuildSyntax Check
Delivery DeploymentBuildSyntax Check
BuildSyntax Check
Build
120
122. ※ 此圖出⾃自 Chen Cheng-Wei 的 Effective DevOps 簡報 (https://www.slideshare.net/warfan/effective-devops-78979993)。
123. • 提到 DevOps 到底在談些什什麼玩意兒? by Chen Cheng-Wei - https://goo.gl/7YTeKD
• Continuous Delivery - 敏捷開發的最後⼀一哩路路 by Miles - https://goo.gl/UhpAfG
• Ansible Documentation - http://docs.ansible.com/ansible/intro_installation.html
• 《Ansible: Up and Running》- https://www.ansible.com/ansible-book
• 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧 / 3e - https://goo.gl/vHyVDt
• 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧系列列⽂文章 - https://goo.gl/EOjs4I
• Getting started with GitLab CI | GitLab Documentation - https://goo.gl/NctsCk
• Demo project of COSCUP 2017 - https://gitlab.com/chusiang/coscup2017-cd-demo
參參考⽂文獻
123
124. 圖片來來源
• 《Continuous Delivery》 | Amazon.com - https://www.amazon.com/dp/0321601912
• 《Continuous Delivery 中⽂文版》 | 天瓏網路路書店 - https://goo.gl/SK745B
• DevOps Services & Continuous Delivery - https://goo.gl/jswxch
• 《The Phoenix Project》 | Amazon.com - https://goo.gl/visckK
• Resenha: Harry Potter e a Pedra Filosofal, de J.K. Rowling | Acrobata das Letras
- https://goo.gl/R34tSA
• Brown Book Icon | SoftIcons.com - https://goo.gl/U9U2am
• Always Agile Consulting · Introducing Continuous Delivery - https://goo.gl/2Nhtcr
• 5 CI/CD Strategies for Faster Software Deployments and Better Automation | snap
- https://goo.gl/UZPf5e
124