📘
現代 IT 人一定要知道的 Ansible 自動化組態技巧
  • README
  • 前言
  • Ansible 是什麼?
  • 怎麼部署 Ansible 環境?
  • 怎麼用 Vagrant 練習 Ansible?
  • 怎麼用 Docker 練習 Ansible?
  • 怎麼操作 Ansible?
  • 怎麼用 Jupyter 操控 Ansible?(localhost)
  • 怎麼用 Jupyter 操控 Ansible?(Managed node)
  • 怎麼用 Docker Compose 練習 Ansible?
  • Ansible 的開發工具有哪些?
  • 怎麼看 Ansible Modules 文件?
  • 常用的 Ansible Module 有哪些?
  • 怎麼使用 setup 取得 Managed node 的 facts?
  • 怎麼使用 Ansible 的 Template 系統?
  • 怎麼在 Playbooks 裡使用 Handlers?
  • Ansible 如何發送 notification 到 Slack?
  • Ansible 如何發送 notification 到 HipChat?
  • 如何在 Playbooks 使用 loops?
  • 如何維護大型的 Playbooks?
  • Roles 是什麼?
  • 怎麼使用 Roles?
  • 怎麼用 Roles 部署 LNMP 網頁應用程式?(上)
  • 怎麼用 Roles 部署 LNMP 網頁應用程式?(下)
  • 怎麼用 Roles 部署 TestLink?
  • 怎麼在 Ansible Galaxy 分享 Roles?(上)
  • 怎麼在 Ansible Galaxy 分享 Roles?(下)
  • 怎麼用 Travis CI 測試 Roles?
  • 怎麼混用 Ansible 建置 Docker image?
  • 怎麼在 Docker Hub 混用 Ansible 自動建置 Docker image?
  • 怎麼用 Vault 管理敏感資料?
  • 總結
Powered by GitBook
On this page
  • 23. 怎麼用 Roles 部署 LNMP 網頁應用程式?(下)
  • 怎麼用 Roles 撰寫強化版的 Playbooks?
  • 後語
  • 相關連結

Was this helpful?

Edit on GitHub

怎麼用 Roles 部署 LNMP 網頁應用程式?(下)

Previous怎麼用 Roles 部署 LNMP 網頁應用程式?(上)Next怎麼用 Roles 部署 TestLink?

Last updated 1 year ago

Was this helpful?

23. 怎麼用 Roles 部署 LNMP 網頁應用程式?(下)

上一章「」我們挑選了 Nginx, MySQL 和 PHP 的 Roles,接下來就讓凍仁展示怎麼用 Roles 簡化大型的 TestLink Playbooks 吧!

怎麼用 Roles 撰寫強化版的 Playbooks?

取得範例檔

Git

  1. 取得 demo code。

$ git clone https://github.com/chusiang/automate-with-ansible.git
  1. 進入 testlink 目錄。

$ cd automate-with-ansible/lab/ch23/testlink

Zip

  1. 若不想使用 Git,可改下載 zip 檔。

$ wget https://github.com/chusiang/automate-with-ansible/archive/main.zip
  1. 解壓縮。

$ unzip main.zip
  1. 進入 testlink 目錄。

$ cd automate-with-ansible-main/lab/ch23/testlink/

從 Galaxy 下載 Roles

在 Python 的世界裡,我們可藉由 requirements.txt 批次下載 pip 套件,而在 Ansible 的世界裡則是 requirements.yml。

$ ansible-galaxy install -f -p roles -r requirements.yml

使用 Vagrant 建立開發環境

  1. 觀看 Vagrantfile 內容。

$ cat Vagrantfile
# -*- mode: ruby -*-

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "setup.yml"
    ansible.sudo = true
    #ansible.verbose = "vvv"
  end
end

# vi: set ft=ruby :

執行 Playbooks

  1. 啟用虛擬機並執行 Playbook。

$ vagrant up
  1. 若過程中有問題,可使用 provision 重新執行 Ansible。

$ vagrant provision

TestLink Playbooks 架構解說

$ tree -L 2
.
├── README.md
├── Vagrantfile
├── defaults
│   └── main.yml            # main vars.
├── handlers
│   └── main.yml            # main handler.
├── requirements.yml        # for Roles.
├── roles
│   ├── chusiang.php7
│   ├── geerlingguy.mysql
│   └── williamyeh.nginx
├── setup.yml               # main playbook.
├── tasks
│   ├── check.yml
│   ├── main.yml            # main task.
│   ├── setting_nginx.yml
│   ├── setting_php-fpm.yml
│   ├── setting_testlink.yml
│   └── setup_testlink.yml
└── templates
    ├── config_db.inc.php.j2
    ├── nginx-testlink.conf.j2
    ├── php7-cli.ini.j2
    └── php7-fpm.ini.j2

8 directories, 16 files
  1. README.md:可先從這裡取得較詳細的資訊。

  2. requirements.yml:這裡定義了相依的 Roles。

$ cat requirements.yml
# Nginx 1.10
- src: williamyeh.nginx
  path: roles/

# PHP 7
- src: chusiang.php7
  path: roles/

# MySQL 5.6
- src: geerlingguy.mysql
  path: roles/
  1. setup.yml:前面提到 Vagrant provision 進入點是這裡,故我們可從這個 playbook 了解主要架構。

$ cat setup.yml
01 #!/usr/bin/env ansible-playbook
02
03 ---
04 - name: play 'setup testlink'
05   hosts: all
06   become: true
07
08   vars_files:
09     - defaults/main.yml
10
11   roles:
12     - williamyeh.nginx
13     - chusiang.php7
14     - {
15         role: geerlingguy.mysql,
16         mysql_packages: ['mysql-server-5.6', 'mysql-client-5.6','python-mysqldb'],
17       }
18
19   tasks:
20     - name: include main task
21       include: tasks/main.yml
22
23     - name: include check task
24       include: tasks/check.yml
25
26   handlers:
27     - include: handlers/main.yml
28
29 # vim:ft=yaml.ansible:
  • 在第 6 行裡,用了 become: yes 來取得 root 權限。

  • 在第 8, 9 行裡,載入了定義好的 defaults/main.yml 變數檔案,這裡宣告了所有會用到的變數。

  • 在第 11-17 行裡,載入了 Nginx, MySQL 和 PHP 的 Roles。

  • 在第 20, 21 行裡,載入了主要的 tasks。

  • 在第 23, 24 行裡,載入了檢查用的 tasks。

  • 在第 26, 27 行裡,載入了主要的 handler。

  1. defaults/main.yml:覆蓋 Roles 預設變數和 TestLink 會用到的相關變數皆宣告於此。

  2. tasks/

  3. main.yml:tasks 的主要進入點,並藉由它載入預設執行的 tasks。

    $ cat tasks/main.yml
    ---
    # tasks file for testlink
    
    - name: setup testlink
      include: setup_testlink.yml
    
    - name: setting php-fpm
      include: setting_php-fpm.yml
    
    - name: setting nginx
      include: setting_nginx.yml
    
    - name: setting testlink
      include: setting_testlink.yml
    
    # vim:ft=yaml.ansible:
  4. setup_testlink.yml:所有關於安裝 TestLink 會用到 tasks。

  5. setting_php-fpm.yml:設定 PHP 的 tasks。

  6. setting_nginx.yml:設定 Nginx 的 tasks。

  7. setting_testlink.yml:設定 TestLink 的 tasks。

  8. check.yml:檢查狀態用的 tasks。

  9. templates/

  10. config_db.inc.php.j2:TestLink 的 Database 設定檔模板。

  11. nginx-testlink.conf.j2:Nginx 設定檔模板。

  12. php7-cli.ini.j2:php7-cli 設定檔模板。

  13. php7-fpm.ini.j2:php7-fpm 設定檔模板。

  14. handlers/main.yml:主要的 handler,主要用來重新啟動 php-fpm 和 nginx。

$ cat handlers/main.yml
---
# handlers file for testlink

- name: restart php-fpm
  service: name=php7.0-fpm enabled=yes state=restarted

- name: restart nginx
  service: name=nginx enabled=yes state=restarted

以上,當我們整合好 Roles 後,只需撰寫部署 TestLink 的 Playbooks 即可。仔細算一算這份範例的 Tasks 行數加起來還不到 220 行呢!

$ wc -l setup.yml tasks/*
      29 setup.yml
      42 tasks/check.yml
      16 tasks/main.yml
      25 tasks/setting_nginx.yml
      18 tasks/setting_php-fpm.yml
      11 tasks/setting_testlink.yml
      78 tasks/setup_testlink.yml
     219 total

後語

原先凍仁想從實作環境、建立 Playbooks、下載 Roles ... 等手把手一步步帶領著大家,但事後發現成效不佳,無法逐一說明,所以才會改用重點式介紹。

相關連結

在這份 Playbooks 與「」不同的是,凍仁除了把 variables, tasks, handlers 拆開寫以外,還加入 Roles 的部份。

為避免版面過於混亂,凍仁已上傳範例檔,還請大家先至 下載。

透過凍仁定義好的 requirements.yml 下載多個 Roles,詳情請參考 一文。

由於這次的 Vagrantfile 有設置 provision (配置) ansible 的語法,故使用 vagrant up 時會一併執行 playbook。詳情請參考「」一文。

執行完畢後,開啟瀏覽器 (Browsers) 並進入 TestLink 網站 (),其帳號密碼皆為 admin。

若您實作後無法正常執行,可於下方留言給凍仁,或至 開 。

19. 如何維護大型的 Playbooks?
GitHub
Installing multiple roles from a file | Ansible Documentation
04. 怎麼用 Vagrant 練習 Ansible?
http://192.168.33.10
GitHub
issues
22. 怎麼用 Roles 部署 LNMP 網頁應用程式?(上)
22. 怎麼用 Roles 部署 LNMP 網頁應用程式?(上)
automate_with_ansible_practice-26.jpg
2016-12-23-ansible-testlink-1.gif
2016-12-23-ansible-testlink-2.gif