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

Continuous Delivery with Ansible x GitLab CI

Continuous Delivery with Ansible x GitLab CI

# DevOps 人一定要知道的 Ansible & GitLab CI 持續交付技巧
 
Ansible 是個與 Puppet, Salt, Chef 並列的 Infrastructure as Code 組態設定工具,其簡單易用的特性更讓人愛不釋手;GitLab 是業界很常見的 Git 私有版本控制服務,搭配其 GitLab CI 將能快速建立屬於自己的 CI/CD Pipeline 與自動化部署。
 
本次凍仁將會藉由 Ansible 和 GitLab 帶領大家一探持續部署的世界和 DevOps 的威力!
 
#DevOpsTaiwan #DevOpsTW #COSCUP #COSCUP2017
 
> http://coscup.org/2017/#/schedule/day1/3071450

Chu-Siang Lai

August 05, 2017
Tweet

More Decks by Chu-Siang Lai

Other Decks in Technology

Transcript

  1. [ chusiang@coscup-2017 ~ ] $ cat .profile # Author: 凍仁翔

    / [email protected] # Blog: http://note.drx.tw # Modified: 2017-08-05 13:14
  2. 關於我 • 凍仁翔 (@chusiang_lai)。 • 《凍仁的筆記》站長。 • DevOps Taiwan 志⼯工。

    • 1 年年以上的 Ansible 使⽤用經驗。 • 5 年年以上的 IT 維運經驗。 • 第 8 屆 IT 邦幫忙鐵⼈人賽 DevOps 組冠軍。 5
  3. Outline VI. GitLab CI 是什什麼? VII. Pipeline 是什什麼? VIII.怎麼操作 GitLab

    CI? IX. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付?
  4. Outline VI. GitLab CI 是什什麼? VII. Pipeline 是什什麼? VIII.怎麼操作 GitLab

    CI? IX. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付? X. Q&A
  5. 我⼼心中的 DevOps ⼈人是什什麼? 17 開發⼈人 (Dev) 維運⼈人 (Ops) DevOps ⼈人

    從裝機到架站 等 Ops 架好? 耗費數⼩小時 (hr) 不⽤用 20 分 (min) 上班 寫 code 敲敲指令裝裝機器 改了了什什麼常常忘記 寫 code 管機器 下班 有事就 On Call 沒事就下班 有事就救火 沒事就 On Call 有事就 On Call 沒事就讓 code “⾃自⼰己" 管機器
  6. 今天會⽤用到哪些 Tools? 19 Version Control (版本控制) Configuration Management (組態設定) Continuous

    Integration (持續整合) Measurement (測量量) Log Git
 GitLab
 GitHub Ansible
 Chef GitLab CI
 Jenkins CI Travis CI Zabbix ELK Provisioning (服務開通) Vagrant, Docker
  7. "⼯工⼈人" 交付 持續交付 ⼈人為失誤風險 ⾼高 低 交付週期 1 週以上 1

    次 提交程式碼即交付 交付時間 > 數⼩小時 < 5 分鐘 可維護性 常常於發佈時救火 (變更更⼯工作 → 例例外⼯工作) 即早發現,即早治療 提早下班 難 易易 導入持續交付的好處是什什麼? 32
  8. 我⼼心中的 Ansible 是什什麼? 1. 與 Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定 ⼯工具

    (Infrastructure as Code)。 2. Python 陣營的組態設定⼯工具。 3. 不需幫每台機器 (instance) 安裝 Agent,只要有 Python 和 SSH 就可以闖天下! 4. 容易易上⼿手,是⾺馬上可以⽤用的好物! 5. 社群強⼤大,有商業公司⽀支持的⾃自由軟體。 40
  9. 我⼼心中的 Ansible 是什什麼? 1. 與 Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定 ⼯工具

    (Infrastructure as Code)。 2. Python 陣營的組態設定⼯工具。 3. 不需幫每台機器 (instance) 安裝 Agent,只要有 Python 和 SSH 就可以闖天下! 4. 容易易上⼿手,是⾺馬上可以⽤用的好物! 5. 社群強⼤大,有商業公司⽀支持的⾃自由軟體。 43
  10. 1. 減少 (重複) 例例⾏行行性作業的⼈人⼒力力成本,提升團隊⽣生產⼒力力。 2. 節省企業開⽀支。 A. 以年年薪百萬計算,時薪約 $340。(1,000,000 /

    365 / 8 = 342) B. 若若以⼀一個⽉月 4 週,⼀一年年 52 週計算 … 案例例分析 ↓ 26 hr / 週 = ↓ $35,360 / ⽉月 = ↓ $459,680 / 年年
  11. 怎麼安裝 Ansible? • 只需在 Control Machine (主控端) 安裝 Ansible; Managed

    node 則需 Python 2.5+ 和 SSH。 50 # Debian & Ubuntu (apt). $ sudo apt-get install ansible # RHEL & CentOS (yum). $ sudo yum install ansible # Mac OS X (homebrew). $ brew install ansible # Python (pip). $ sudo pip install ansible
  12. 怎麼設定 Ansible? • 藉由 ansible.cfg 來來設定 inventory (host file) 檔案路路徑、

    Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。 51 $ vim ansible.cfg [defaults] # 指定 inventory 檔案路路徑。 hostfile = hosts # 遠端使⽤用者名稱 remote_user = docker #private_key_file = ~/.ssh/id_rsa # host_key_checking: 不詢問加入 ssh ⾦金金鑰 host_key_checking = False
  13. inventory 是什什麼? • 定義 Managed node (被控端) 位址與群組的主機清冊,
 通常會⽤用來來設定 ssh

    或 winrm 的連線資訊。 52 $ vim hosts # ansible_ssh_host: 遠端 SSH 主機位址。 # ansible_ssh_port: 遠端 SSH 埠⼝口 (Port)。 # ansible_ssh_user: 遠端 SSH 使⽤用者名稱。 # ansible_ssh_private_key_file: 本機 SSH 私鑰檔路路徑。 # ansible_ssh_pass: 遠端 SSH 密碼 (建議改⽤用私鑰)。 [dev] ansible-demo ansible_ssh_host=127.0.0.1 ansible_ssh_pass=pwd [test] ansible-test ansible_ssh_host=172.10.10.1 ansible_ssh_port=2222 [prod] ansible-prod ansible_ssh_host=10.10.10.1 ansible_ssh_user=deploy
  14. ⼀一般的 command line 是什什麼? • 這裡的 command line 為 Linux

    Shell 底下的指令操作, 以下為 ping 和 echo 的操作的結果。 56 $ 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
  15. 怎麼⽤用 Ad-Hoc commands? ansible <host-pattern> [-m module_name] [-a args] [options]

    • host-pattern: all, server1, server1:server2, server_group. 57 $ 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 ⽂文件。
  16. Playbooks 是什什麼? • 比 Shell Script 更更結構化的腳本 語⾔言,是⼀一鍵部署的好物。 • 使⽤用

    YAML 格式,簡單易易讀。 (寫 code 就如同寫⽂文件) • 通常會有 Play, Task, Module 和 handler 等。 • 藉由 Jinja2 (template 系統)
 表達式,使⽤用變數、判斷式
 、迴圈等語法。 Baby Playbook Onesie - http://goo.gl/GKJvXn 59
  17. Playbooks 是什什麼? • ⼀一份 Playbook 可以有多個 Play、多個 Task 和多個 Module。

    • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 60 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: path=/etc/inputrc line="set editing-mode vi"
  18. Playbooks 是什什麼? • 執⾏行行 playbook。 61 $ ansible-playbook example.yml PLAY

    [This is a Super-basic playbook.] ***************************************** TASK [setup] ******************************************************************* ok: [ansible-demo.local] TASK [Hello World] ************************************************************* changed: [ansible-demo.local] TASK [Install Vim & Emacs] ***************************************************** changed: [ansible-demo.local] => (item=[u'vim', u'emacs']) TASK [use vi-mode in readline] ************************************************* changed: [ansible-demo.local] PLAY RECAP ********************************************************************* ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0
  19. Playbooks 是什什麼? • 執⾏行行 playbook。 62 $ ansible-playbook example.yml PLAY

    [This is a Super-basic playbook.] ***************************************** TASK [setup] ******************************************************************* ok: [ansible-demo.local] TASK [Hello World] ************************************************************* changed: [ansible-demo.local] TASK [Install Vim & Emacs] ***************************************************** changed: [ansible-demo.local] => (item=[u'vim', u'emacs']) TASK [use vi-mode in readline] ************************************************* changed: [ansible-demo.local] PLAY RECAP ********************************************************************* ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0 TASK [setup]:被執⾏行行的 managed node 有哪些 PLAY RECAP:總結 (ok / changed / failed )
  20. Plays 是什什麼? • 透過動作 (Play) 對特定 Managed node 進⾏行行操控,通常包含 Task

    和 Module。 • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 63 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: path=/etc/inputrc line="set editing-mode vi" Play
  21. Tasks 是什什麼? • 藉由各種不同的模組 (Module)、迴圈和判斷式等組合來來完成各種任務 (Task)。 • 此例例⽤用到了了 Play*1, Task*3

    和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 64 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: path=/etc/inputrc line="set editing-mode vi" Task 1 Task 2 Task 3
  22. Modules 是什什麼? • Ansible 的內建操作⽅方法 (Method),好比 Python 的內建函式。 • 此例例⽤用到了了

    Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 65 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: path=/etc/inputrc line="set editing-mode vi" Module
  23. apt • 適⽤用於 Debian、Ubuntu 的 apt 套件模組 (Packaging Modules)。 •

    類似的 Linux 指令有 apt, apt-get, aptitude 和 dpkg。
 
 
 
 
 
 
 
 
 
 
 
 67 # 更更新套件索引 (快取),等同於 apt-get update 指令。 - name: Update repositories cache become: yes apt: update_cache: yes # 安裝 vim 套件。 - name: Install the package "vim" become: yes apt: name: vim state: present
  24. lineinfile • ⽤用正規表⽰示式對檔案進⾏行行插入或取代⽂文字的檔案模組 (Files Modules)。 • 其類似的 Linux 指令為 sed。


    
 
 
 
 
 
 
 
 
 
 
 68 # Before 2.3, option 'dest', 'destfile' or 'name' was used instead of ‘path'. # 關閉 SELinux。 - name: disable selinux lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: 'SELINUX=enforcing' # 移除 docker 使⽤用者的 sudo 權限。 - name: remove sudo permission of docker lineinfile: path: /etc/sudoers state: absent regexp: '^docker'
  25. shell • 在遠端⽤用 /bin/sh 執⾏行行 shell 指令的指令模組 (Commands Modules), ⽀支援變數

    (variables)、< , > , | , ; 和 & 等運算。
 
 
 
 
 
 
 
 
 
 
 
 69 # 藉由 ls 和 wc 檢查檔案數量量。 - name: check files number shell: ls /home/docker/ | wc -l # 列列出所有的 Python ⾏行行程。 - name: show all python process shell: ps aux | grep python # 執⾏行行 shell script,並把結果導向 /tmp/result.log。 - name: execute run.sh shell: ./run.sh > /tmp/result.log
  26. Ch 5. 部署流⽔水線解析 Ch 6. 建置與部署的腳本化 Ch 7. 提交階段 Ch

    8. ⾃自動化驗測試 Ch 9. 非功能性需求測試 Ch 10. 應⽤用程式的部署與發佈 書上寫的 Pipeline 是什什麼? 《Continuous Delivery》- https://goo.gl/r9vXFg 83
  27. 84

  28. 原始 程式碼 應⽤用程式 設置 提交階段 編譯 單元測試 程式碼分析 組裝 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
  29. • 使⽤用 YAML 語法進⾏行行撰寫。此範例例⼤大致可分為 1 個 stage (階段) 和
 1

    個 job (⼯工作)。
 
 
 
 
 
 
 
 
 
 
 
 怎麼寫 .gitlab-ci.yml? $ vim .gitlab-ci.yml stages: - build build_binary: image: ubuntu:16.04 stage: build script: - chmod 755 penguin-htdocs/DEBIAN - dpkg -b penguin-htdocs tags: - docker
  30. Ⅸ. 怎麼⽤用 Ansible 和 GitLab CI 進⾏行行持續交付? 96 在 GitLab

    CI 裡,⽤用 Ansible Docker Containers 跑 Playbooks 即可。
  31. $ vim .gitlab-ci.yml stages: - build - deploy - test

    - release build_binary: image: ubuntu:16.04 stage: build script: # For fix bad permissions of control directory on GitLab CI. - chmod 755 penguin-htdocs/DEBIAN # build deb. - dpkg -b penguin-htdocs artifacts: expire_in: 1 week paths: - penguin-htdocs.deb tags: - docker ... 99 1
  32. ... deploy_to_dev: image: chusiang/ansible:alpine-3.6 stage: deploy script: - ls -

    cd ansible-playbooks/ - echo "${VAULT_KEY}" > secret.txt - ansible-playbook deploy.yml - rm -f secret.txt only: - master@chusiang/coscup2017-cd-demo - develop@chusiang/coscup2017-cd-demo - tags@chusiang/coscup2017-cd-demo tags: - docker ... 100 2 2
  33. ... test_dev: image: chusiang/ansible:alpine-3.6 stage: test script: - cd ansible-playbooks/

    - echo "${VAULT_KEY}" > secret.txt - ansible-playbook test.yml - rm -f secret.txt only: - master@chusiang/coscup2017-cd-demo - develop@chusiang/coscup2017-cd-demo - tags@chusiang/coscup2017-cd-demo tags: - docker ... 101 3
  34. ... release_to_prd: image: chusiang/ansible:alpine-3.6 stage: release script: - cd ansible-playbooks/

    - echo "${VAULT_KEY}" > secret.txt - ansible-playbook -i production deploy.yml - rm -f secret.txt only: - master@chusiang/coscup2017-cd-demo - tags@chusiang/coscup2017-cd-demo tags: - docker 102 4
  35. 練習環境為 Control Machine (Alpine 3.6) + Managed node*2 (Ubuntu 16.04)。

    透過 GitLab CI 和 Ansible 操控 Managed node 108
  36. Fork me, and send Merge Requests ! 請於 fork 後隨意修改,並發送

    MR (Pull Requests),因完整的 Pipelines 只會於 chusiang/coscup2017-cd-demo 的特定 Branchs 和打 Tags 才會被觸發。
  37. CD 挑戰賽 A. 開賽後,發送 Merge Requests
 ⾄至 http://s.drx.tw/cUET 的 develop

    和 master branch。 B. 依提交順序收 M.R.。 C. 兩兩條 Pipelines 共 7 個 stages 皆需通過 (success)。 • develop: stage × 3 • master: stage × 4 D. 前 3 名挑戰成功者,將獲得
 Ansible 貼紙 1 張!
  38. Code 還在本機? 推上 Git server? 組態設定對了了? 單元測試過了了? 持續交付過了了? 真 實

    案 例例 R&D:我程式寫完了了,但還要
 等 CD 過了了才⾏行行。 我:讓 Pipelines ⾶飛⼀一下吧! (好像可以⾶飛的再快⼀一點?!)。
  39. 我的 Pipeline 進化史 Unit Test Integration Test Delivery Deployme Build

    Syntax Check Unit Test Delivery Deployme Build Syntax Check Unit Test Delivery Deployme Build Syntax Check Delivery Deployme Build Syntax Check Build Syntax Check Build
  40. 參參考⽂文獻 1. 提到 DevOps 到底在談些什什麼玩意兒? by Chen Cheng-Wei - https://goo.gl/7YTeKD

    2. Continuous Delivery - 敏捷開發的最後⼀一哩路路 by Miles - https://goo.gl/UhpAfG 3. Ansible Documentation - http://docs.ansible.com/ansible/intro_installation.html 4. 《Ansible: Up and Running》- https://www.ansible.com/ansible-book 5. 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧 / 3e - https://goo.gl/vHyVDt 6. 現代 IT ⼈人⼀一定要知道的 Ansible ⾃自動化組態技巧系列列⽂文章 - https://goo.gl/EOjs4I 7. Getting started with GitLab CI | GitLab Documentation - https://goo.gl/NctsCk 8. Demo project of COSCUP 2017 - https://gitlab.com/chusiang/coscup2017-cd-demo 114
  41. 圖片來來源 • 《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 115
  42. END