本文基于 ansible 2.3.0.0 編寫
我們目前有 8 個大區共 24 台 nginx 伺服器,每個區除了 upstream 位址不同,其它配置參數都一樣。自從使用了 ansible 來維護更新後,工作變得非常輕松,幾分鐘内就可以更新所有 24 台伺服器的 nginx 配置。并且實作了檢查配置有誤後,自動恢複上一次配置的機制。
以下就以此為例,展示如何利用 ansible 在自動化部署 nginx 時,如何規避錯誤的配置。
首先看看我的 nginx role 目錄結構
deploy.Nginx/
├── files
│ └── nginx.conf
├── handlers
│ └── main.yml
├── tasks
│ ├── Debian.yml
│ ├── main.yml
│ └── sites_conf_test.yml
└── templates
├── cms_console_newtouch_com.j2
└── console_newtouch_com.j2
roles/deploy.Nginx/tasks/main.yml
裡
include sites_conf_test.yml
的代碼片段:
- include: sites_conf_test.yml
vars:
- file: '{{ item }}'
with_items:
- 'console_newtouch_com'
這裡傳遞了變量 file 的值給
sites_conf_test.yml
,這樣我們可以擴充配置多個站點配置檔案。
roles/deploy.Nginx/tasks/sites_conf_test.yml
的代碼:
- name: Create ~/'{{ file }}.conf'
template:
src: '../templates/{{ file }}.j2'
dest: '~/{{ file }}.conf'
register: createResult
- block:
- name: Copy '~/{{ file }}.conf'
copy:
src: '~/{{ file }}.conf'
dest: '/etc/nginx/sites-enabled/{{ file }}.conf'
backup: yes
remote_src: yes
register: copyResult
when: createResult.changed
- name: 'Test {{ file }}.conf config'
command: nginx -t
notify: Reload nginx service
when: copyResult.changed
rescue:
- name: '{{ file }}.conf test failed, rolling backup file.'
copy:
src: '{{ copyResult.backup_file }}'
dest: '/etc/nginx/sites-enabled/{{ file }}.conf'
remote_src: yes
代碼解析:
- 首先使用 template 子產品,在伺服器上生成 nginx 站點的配置檔案。
- 2.3.0.0 有個問題還沒解決,就是 template 子產品的 backup 參數,并不會傳回備份檔案的名稱,是以隻能曲線救國,先建立一個臨時的檔案。
- 然後,重點就在這個 block 編排裡。第一個 task 是把生成的
檔案拷貝到console_newtouch_com.conf
目錄下,因為啟用了 backup 參數,是以 copyResult 會包含 backup_file 的絕對路徑位址名稱。這個就用在配置復原操作中。/etc/nginx/sites-enabled/
- 第二個 task 就是執行 nginx -t 來确認新配置檔案是否正确了。如果失敗了,就會觸發 rescue 裡的任務。我們隻需要把備份檔案恢複,保證伺服器上的配置是好的。
同理可以用在更新 nginx.conf 的操作裡。