Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Continuous Delivery Workshop with Ansible x Git...

Chu-Siang Lai
October 21, 2017

Continuous Delivery Workshop with Ansible x GitLab CI

# DevOps 人一定要知道的持續交付技巧 - Ansible & GitLab CI 實戰演練
 
Ansible 是個與 Puppet, Salt, Chef 並列其四的 Infrastructure as Code 組態設定工具,其簡單易用的特性讓人愛不釋手;GitLab 是業界常見的 Git 私有版本控制服務,搭配其 GitLab CI 更能建立屬於自己的發佈流程。
 
本次凍仁將藉由工作坊的形式,帶領大家一探持續交付的世界和自動化的威力!
 
* 活動網址: https://www.meetup.com/DigitalOceanHsinchu/events/243518189/
* Gist note: https://gist.github.com/chusiang/56843a737b8c3931c1736d6939a4e172
 
#Ansible #GitLab #DevOps #Workshop

Chu-Siang Lai

October 21, 2017
Tweet

More Decks by Chu-Siang Lai

Other Decks in Technology

Transcript

  1. ______________________________ / DevOps ⼈人⼀一定要知道的持續交付技巧 \ \ - Ansible & GitLab

    CI 實戰演練 / ------------------------------ \ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || [ chusiang@DigitalOecanHsinchu ~ ] $ cat .profile # Author: 凍仁翔 / [email protected] # Blog: http://note.drx.tw # Modified: 2017-10-15 22:44
  2. 關於我 • 凍仁翔 (@chusiang_lai)。 • 《凍仁的筆記》站長。 • DevOps Taiwan 志⼯工。

    • 2 年年左右的 Ansible 使⽤用經驗。 • 5 年年以上的 IT 營運經驗。 • 第 8 屆 IT 邦幫忙鐵⼈人賽 DevOps 組冠軍。 4
  3. Outline • GitLab 是什什麼? • Pipeline 是什什麼? • 怎麼操作 GitLab

    CI? • 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付? • Q&A 8
  4. 可以⽤用到哪些 Tools 替代? Ansible Chef, Puppet, Slat Docker AWS, Vagrant

    GitLab CI, Jenkins CI, Drone CI Git, GitLab GitHub 17
  5. R&D:我程式寫完了了! 我:等 CD 過了了再說。 Code 還在本機? 推上 Git server? 組態設定對了了?

    單元測試過了了? 持續交付過了了? 真 實 案 例例 R&D:我程式寫完了了! 我:(哪裡寫完了了?!) 30
  6. 我⼼心中的 Ansible 是什什麼? 3. 不需 Agent,有 Python 和 SSH 就可以闖天下!

    4. 容易易上⼿手。 5. 社群強⼤大,有商業公司⽀支援。 42
  7. 怎麼安裝 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
  8. 怎麼設定 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
  9. 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
  10. ⼀一般的 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
  11. 怎麼⽤用 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
  12. 57 Playbooks 是什什麼? • 比 Shell Script 更更結構 化的腳本語⾔言,是⼀一鍵 部署的好物。

    • 使⽤用 YAML 格式,簡單 易易讀。 Baby Playbook Onesie - http://goo.gl/GKJvXn
  13. 58 Playbooks 是什什麼? • 通常會有 Play, Task, Module 和 handler

    等。 • 整合 Jinja2 的 template 系統,可使⽤用變數、判 斷式、迴圈等表達式。 Baby Playbook Onesie - http://goo.gl/GKJvXn
  14. 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
  15. 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
  16. 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 )
  17. 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
  18. 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
  19. 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
  20. # 建立 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
  21. 70

  22. Ch 5. 部署流⽔水線解析 Ch 6. 建置與部署的腳本化 Ch 7. 提交階段 Ch

    8. ⾃自動化驗測試 Ch 9. 非功能性需求測試 Ch 10. 應⽤用程式的部署與發佈 書中的 Pipeline 是什什麼? 《Continuous Delivery》- https://goo.gl/r9vXFg 77
  23. 原始 程式碼 應⽤用程式 設置 提交階段 編譯 單元測試 程式碼分析 組裝 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
  24. 原始 程式碼 應⽤用程式 設置 提交階段 編譯 單元測試 程式碼分析 組裝 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
  25. 82

  26. 84

  27. • 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
  28. Customer Git server GitLab CI server Build Deploy Test Release

    Engineer Git Push Coding & Git Commit 101
  29. $ 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 Test Deploy Release Build 103
  30. 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 Test Deploy Release Build 104
  31. 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 Test Deploy Release Build 105
  32. 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 Test Deploy Release Build 106
  33. Demo 環境為 Control Machine (Alpine 3.6) + Managed node*2 (Ubuntu

    16.04)。 透過 GitLab CI 和 Ansible 操控 Managed node 115
  34. 我的 Pipeline 進化史 Unit Test Integration Test Delivery Deployment Build

    Syntax Check Unit Test Delivery Deployment Build Syntax Check Unit Test Delivery Deployment Build Syntax Check Delivery Deployment Build Syntax Check Build Syntax Check Build 120
  35. • 提到 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
  36. 圖片來來源 • 《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