天天看點

ansible 批量更新 nginx 配置,以及失敗時的自動復原樣例

本文基于 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           

代碼解析:

  1. 首先使用 template 子產品,在伺服器上生成 nginx 站點的配置檔案。
  2. 2.3.0.0 有個問題還沒解決,就是 template 子產品的 backup 參數,并不會傳回備份檔案的名稱,是以隻能曲線救國,先建立一個臨時的檔案。
  3. 然後,重點就在這個 block 編排裡。第一個 task 是把生成的

    console_newtouch_com.conf

    檔案拷貝到

    /etc/nginx/sites-enabled/

    目錄下,因為啟用了 backup 參數,是以 copyResult 會包含 backup_file 的絕對路徑位址名稱。這個就用在配置復原操作中。
  4. 第二個 task 就是執行 nginx -t 來确認新配置檔案是否正确了。如果失敗了,就會觸發 rescue 裡的任務。我們隻需要把備份檔案恢複,保證伺服器上的配置是好的。

同理可以用在更新 nginx.conf 的操作裡。

繼續閱讀