Ansible 維護大型的 Playbooks

2018-07-25 11:00 更新

在學(xué)時,凍仁曾借由大型程式來撰寫復(fù)雜的 C 語言。如今當(dāng) Ansible Playbooks 寫久之后,其架構(gòu)也會變得復(fù)雜,這時該怎么寫才好維護呢?就讓凍仁娓娓道來吧!

automate_with_ansible_practice-24.jpg

圖片來源:https://goo.gl/jBL5i3

官方早在 Playbooks Best Practices 文件中列了 12 條最佳實踐 (Best Practices),底下將以凍仁認為最重要的部份進行介紹。

什么是最佳實踐 (Best Practices)?

來自維基百科的解釋:

最佳實踐,是一個管理學(xué)概念,認為存在某種技術(shù)、方法、過程、活動或機制可以使生產(chǎn)或管理實踐的結(jié)果達到最優(yōu),并減少出錯的可能性。(more)

凍仁認為,Best Practices 就如同 80/20 法則,只要掌握了 Best Practices,就可以用 20% 的投入獲得 80% 的成效。

在許多技術(shù)文件里 (如 AndroidAWS 和 Vue.js) 也會有這個特別的章節(jié),甚至還有前輩提到接觸一門新技術(shù)時,應(yīng)該要先從 Best Practices 開始看呢。

官方建議的目錄結(jié)構(gòu)

以下修改至官方建議的目錄結(jié)構(gòu) (Directory Layout) 范例,只留下凍仁目前覺得最重要的部份。

production        # inventory file for production.
staging           # inventory file for staging.

site.yml          # master playbook
webservers.yml    # playbook for webserver tier
dbservers.yml     # playbook for dbserver tier

roles/
  common/         # role name
    tasks/        #   
      main.yml    # main tasks file.
    handlers/     #
      main.yml    # handlers file.
    templates/    #
      ntp.conf.j2 # templates end in .j2.
    files/        #   
      bar.txt     # files
      foo.sh      # script files
    vars/         #
      main.yml    # variables with this role.
    defaults/     #
      main.yml    # default variables.
    meta/         #
      main.yml    # role dependencies
  • productionstaging:借由 inventory file 來切換環(huán)境。我們在「Ansible 使用 Template 系統(tǒng)」一章時已提過,在 Best Practices 里就有特別說明此手法。
  • site.yml:主要的 playbook。
  • webservers.yml:網(wǎng)頁服務(wù)器一層的 playbook。
  • dbservers.yml:資料庫服務(wù)器一層的 playbook。

實戰(zhàn)用的目錄結(jié)構(gòu)

底下將以某個用 django 開發(fā)的 API web server 專案為例。

README.md               # 該專案的說明文件。
Vagrantfile
ansible.cfg             # configure for ansible
files/
  id_rsa_deploy         # 用 Git 部署的 ssh key。
  ssl_key/
    ...
group_vars/
  main.yml              # 各環(huán)境共用的 vars。
  local.yml             # 本機開發(fā)的 vars。
  production.yml        # 正式環(huán)境的 vars。
  staging.yml           # 測試環(huán)境的 vars。
production              # 正式環(huán)境的 inventory file。
requirements.yml
restart_service.yml     # 重開 API 服務(wù)的 playbook。
roles/
  chusiang.switch-apt-mirror/
  ...
setup.yml               # 主要 playbook。
staging                 # 測試環(huán)境的 inventory file。
tasks/
  restart_api.yml       # 重開 api 的 tasks。
  setting_api.yml       # 設(shè)定 api 的 tasks。
  setting_nginx.yml     # 設(shè)定 nginx 的 tasks。
  setup.yml             # 主要安裝流程的 tasks。
templates/
  local_settings.py.j2
  nginx.conf.j2         # nginx vhost.
  nginx_ssl.conf        # nginx vhost (ssl).
  supervisor.conf.j2
tests/
  Dockerfile            # 用 Docker 跑測試。
update_config.yml
  • Vagrantfile:在本機主要使用 Vagrant 搭配 group_vars/local.yml 進行開發(fā)。
  • ansible.cfg:依各專案客制 Ansible 相關(guān)環(huán)境。
  • files/:集中管理要使用 files module 復(fù)制到 Managed node 的檔案。
  • group_vars/:設(shè)定 staging, production 等不同環(huán)境變數(shù)至各個檔案,若有共用的部份則寫在 main.yml 里。
  • setup.yml:include 各種 tasks 的主要 playbook。
  • tasks/:將各種不同任務(wù)獨立出來的 tasks,在裡分別為 restart_api.ymlrestart_api.ymlsetting_nginx.yml 和 setup.yml。
  • templates/:集中管理要使用 templates module 復(fù)制到 Managed node 的檔案。

總結(jié)

大家可以先照著官方的規(guī)劃練習(xí),寫久了再依個人風(fēng)格調(diào)整即可,畢竟要讓大型的 Playbooks 變得好維護,不外乎為以下原則:

  1. 通過 inventory file 和變數(shù)把 local, staging 和 production 等環(huán)境。
  2. 盡可能的把重復(fù)的 tasks 獨立出來,然后讓 playbook 依不同需求 include 進來用。在這個例子里,凍仁把 setup.yml 和 update_config.yml 兩個 playbook 中重復(fù)的 tasks 獨立成 tasks/setting_api.yml,并通過 include 重復(fù)使用。
  3. 可以用 Roles 就用 Roles!x3

后話

我們可以借由 Roles 讓大型的 Playbooks 更易于維護,在此文中也一直提到它的重要性,這部份就讓凍仁留到下一章介紹了。

相關(guān)連結(jié)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號