Ansible 的條件任務允許根據特定條件決定是否執行任務,避免不必要的操作,例如在應用程式已存在時跳過安裝步驟。透過 when 陳述式,可以設定執行任務的條件,例如檢查檔案或目錄是否存在、變數值是否符合預期等。搭配 register 指令,可以將指令的執行結果儲存至變數,供後續任務判斷使用。此外,Ansible 的標籤功能可以將相關任務歸類別,方便選擇性執行。透過 tags 屬性,可以為任務新增標籤,然後使用 --tags 引數在執行 Playbook 時指定要執行的標籤,例如僅執行安裝或設定相關的任務。結合條件任務和標籤,可以更精細地控制 Playbook 的執行流程,提升自動化佈署的效率和靈活性。

使用條件任務和標籤最佳化 Ansible Playbook

在前面的章節中,我們已經建立了一個基本的 Django 應用程式佈署 Playbook。本章節將介紹如何使用條件任務和標籤來最佳化 Playbook,使其更加靈活和可控。

在 Ansible 中使用條件任務

在執行 Playbook 時,我們不希望每次都重新安裝 Django 應用程式和重置資料函式庫。Ansible 提供了條件命令,可以在執行任務之前進行測試和驗證。

主要的條件陳述式是 when,它與大多數程式語言中的 if 陳述式類別似。我們可以使用 when 陳述式來檢查應用程式目錄是否存在,如果不存在,則執行相關的任務。

實作條件任務

  1. 開啟 roles/django_app/tasks/main.yml 檔案。

  2. 在安裝 Django 和建立應用程式目錄的任務之後,新增以下四行程式碼:

    - name: check if django app already exists
      shell: ls -l {{ django_app_location }} | grep -c web_app
      register: djangostatus
      failed_when: djangostatus.rc == 2
    

    這段程式碼會檢查應用程式目錄 web_app 是否存在,並將結果註冊到 djangostatus 變數中。如果目錄存在,djangostatus.stdout 的值將為 1,否則為 0。

  3. 修改後續任務,使其僅在 djangostatus.stdout 等於 “0” 時執行:

    - name: create a directory for our django app
      file: path={{ django_app_location }}/web_app mode=0755 owner=user group=user state=directory
      when: djangostatus.stdout == "0"
    
    - name: create your new django app in the web_app directory
      shell: django-admin startproject web_app {{ django_app_location }}web_app
      when: djangostatus.stdout == "0"
    
    - name: configure your database to use work with django
      copy: src=settings.py dest={{ django_app_location }}/web_app/web_app/settings.py
      when: djangostatus.stdout == "0"
    
    - name: apply a migration into the mysql database
      shell: python3 {{ django_app_location }}/web_app/manage.py migrate
      when: djangostatus.stdout == "0"
    
    - name: create the admin superuser
      shell: python3 {{ django_app_location }}/web_app/manage.py createsuperuser --noinput --username=admin --email=admin@example.com
      when: djangostatus.stdout == "0"
    

驗證條件任務

執行 Playbook:

ansible-playbook -i hosts site.yml -e django_app_location=`pwd`

如果 Django 應用程式目錄已經存在,相關任務將被跳過。在 Play Recap 中,您應該會看到跳過的任務數量。

使用標籤執行特定任務

除了條件任務外,Ansible 還提供了標籤功能,允許您標記特定的任務或程式碼區塊,並在執行 Playbook 時選擇性地執行它們。

實作標籤

roles/django_app/tasks/main.yml 檔案中,為相關任務新增 tags 屬性:

- name: create a directory for our django app
  file: path={{ django_app_location }}/web_app mode=0755 owner=user group=user state=directory
  tags: django_setup

- name: create your new django app in the web_app directory
  shell: django-admin startproject web_app {{ django_app_location }}web_app
  tags: django_setup

- name: configure your database to use work with django
  copy: src=settings.py dest={{ django_app_location }}/web_app/web_app/settings.py
  tags: django_setup

- name: apply a migration into the mysql database
  shell: python3 {{ django_app_location }}/web_app/manage.py migrate
  tags: django_setup

- name: create the admin superuser
  shell: python3 {{ django_app_location }}/web_app/manage.py createsuperuser --noinput --username=admin --email=admin@example.com
  tags: django_setup

執行標籤

使用 --tags 選項執行 Playbook:

ansible-playbook -i hosts site.yml -e django_app_location=`pwd` --tags django_setup

這樣,只有標記為 django_setup 的任務才會被執行。

自定義Ansible模組、Vault與Galaxy的使用

在前面的章節中,我們已經奠定了良好的Ansible基礎知識。本章將繼續擴充套件您的知識,使您能夠更快速地實施和自定義專案。儘管Ansible提供了大量的預裝模組,但在某些情況下,您可能仍需要建立自己的模組。同樣地,雖然我們一直在建立自己的角色,但在某些情況下,檢視Ansible社群是否已經建立了符合您需求的角色會更為方便。

使用Ansible Vault保護敏感資訊

我們將在本章開始時介紹Ansible處理敏感資訊和密碼的標準方法。Ansible Vault是一種用於加密敏感資料的工具,使您能夠安全地儲存和管理密碼、API金鑰等敏感資訊。

啟用Ansible Vault的步驟

  1. 建立加密檔案:使用ansible-vault create命令建立一個新的加密檔案。
  2. 編輯加密檔案:使用ansible-vault edit命令編輯現有的加密檔案。
  3. 加密現有檔案:使用ansible-vault encrypt命令將現有的檔案加密。
  4. 解密檔案:使用ansible-vault decrypt命令解密檔案以供檢視或編輯。
# 使用ansible-vault建立一個新的加密檔案
ansible-vault create secret.yml

內容解密:

此命令會開啟一個編輯器,讓您輸入要加密的內容。儲存並關閉編輯器後,檔案將被加密儲存。

使用Ansible Galaxy

Ansible Galaxy是一個公開的平台,允許使用者分享和下載Ansible角色。您可以利用Galaxy搜尋和安裝社群建立的角色,以簡化您的專案實施。

使用Ansible Galaxy的步驟

  1. 搜尋角色:使用ansible-galaxy search命令搜尋符合您需求的角色。
  2. 安裝角色:使用ansible-galaxy install命令安裝您需要的角色。
  3. 建立自己的角色:使用ansible-galaxy init命令建立一個新的角色結構,以便與他人分享。
# 搜尋與nginx相關的角色
ansible-galaxy search nginx

內容解密:

此命令會列出所有與搜尋關鍵字相關的角色,您可以根據描述和評分選擇合適的角色進行安裝。

建立自定義Ansible模組

儘管Ansible提供了大量的內建模組,但在某些情況下,您可能需要建立自定義模組以滿足特定的需求。

建立自定義模組的步驟

  1. 選擇程式語言:大多數Ansible模組使用Python編寫,因為Ansible本身就是根據Python的。
  2. 編寫模組程式碼:根據您的需求編寫模組程式碼,確保它能夠接受引數並傳回正確的結果。
  3. 測試模組:在本地或測試環境中測試您的自定義模組,確保它按預期工作。
#!/usr/bin/python
from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(type='str', required=True),
            state=dict(type='str', default='present', choices=['present', 'absent'])
        )
    )

    name = module.params['name']
    state = module.params['state']

    # 在這裡實作您的邏輯
    result = dict(
        changed=False,
        message=f'Name: {name}, State: {state}'
    )

    module.exit_json(**result)

if __name__ == '__main__':
    main()

內容解密:

此範例展示了一個基本的Ansible模組結構。它接受namestate兩個引數,並根據這些引數執行相應的操作。最終,它傳回一個包含執行結果的字典。

使用Ansible Vault管理機密資訊

在前面的章節中,我們已經瞭解到將密碼以純文字形式儲存並不是最佳實踐。幸運的是,Ansible提供了一種加密資料的方法,以確保資料的安全性,這就是ansible-vault命令。

為何使用Ansible Vault

在之前的章節中,我們已經將變數移到每個角色的var目錄中。這為我們使用ansible-vault加密資料提供了良好的起點。我們將以db_server角色為例,因為它使用了MySQL資料函式庫的明文密碼。

步驟一:移動變數檔案

首先,我們需要將db_server角色的變數檔案移到一個新的檔案中,專門用於測試環境。這樣,我們就可以為不同的環境建立不同的變數檔案。

mv roles/db_server/vars/main.yml roles/db_server/vars/test_environment.yml

內容解密:

  • 這個步驟是將原有的main.yml變數檔案重新命名為test_environment.yml,以便於區分不同環境的變數。
  • 這樣做的好處是,我們可以根據不同的環境使用不同的密碼。

步驟二:加密變數檔案

接下來,我們使用ansible-vault命令來加密新的變數檔案。

ansible-vault encrypt roles/db_server/vars/test_environment.yml

內容解密:

  • 執行此命令後,系統會提示輸入密碼,這個密碼將用於加密和解密資料。
  • ansible-vault使用AES256演算法進行加密,確保資料的安全性。

步驟三:檢視加密後的檔案

加密後,我們可以使用head命令檢視檔案的前幾行,以確認檔案已經被加密。

head -n5 roles/db_server/vars/test_environment.yml

內容解密:

  • 輸出的內容應該是亂碼,表明檔案已經被成功加密。
  • 這一步驟驗證了加密過程的有效性。

步驟四:使用ansible-vault view檢視解密內容

我們可以使用ansible-vault view命令來檢視解密後的內容。

ansible-vault view roles/db_server/vars/test_environment.yml

內容解密:

  • 系統會提示輸入密碼,輸入正確的密碼後,即可檢視解密後的內容。
  • 這一步驟確保了資料在加密後仍然可以被正確存取。

步驟五:修改db_server角色以支援不同環境變數

接下來,我們需要修改db_server角色,使其能夠根據不同的環境載入相應的變數檔案。

---
- name: load the variables for this environment
  include_vars: "{{ env }}_environment.yml"

內容解密:

  • 這段程式碼新增了一個任務,用於載入指定環境的變數檔案。
  • env變數將在執行playbook時透過命令列引數傳遞。

步驟六:執行Playbook並使用加密變數

現在,我們可以執行playbook,並使用加密的變數。

ansible-playbook -i hosts site.yml -e django_app_location=`pwd` -e env=test --ask-vault-pass

內容解密:

  • --ask-vault-pass選項會提示輸入vault密碼,用於解密變數檔案。
  • -e env=test指定了要使用的環境變數檔案。

使用密碼檔案

除了在執行時輸入密碼外,我們也可以使用密碼檔案來自動化這個過程。

  1. 建立一個名為password_file.txt的檔案,並將vault密碼寫入其中。
  2. 使用--vault-password-file選項來指定密碼檔案。
ansible-vault view roles/db_server/vars/test_environment.yml --vault-password-file=password_file.txt

內容解密:

  • 這樣,在執行playbook或檢視加密檔案時,就不需要手動輸入密碼了。
  • 需要注意的是,密碼檔案的安全性非常重要,應確保其許可權設定正確,以避免未授權存取。

管理敏感資料與角色共用:Ansible Vault 與 Ansible Galaxy 的應用

在現代的 DevOps 和自動化佈署中,保護敏感資料和重複利用現有資源是至關重要的。Ansible 提供了兩項強大的工具——Ansible Vault 和 Ansible Galaxy,分別用於加密敏感資料和管理共用角色。本篇文章將詳細探討這兩項工具的使用方法,並結合實際案例和技術分析,幫助讀者更好地理解和應用它們。

使用 Ansible Vault 保護敏感資料

在進行自動化佈署時,我們經常需要處理敏感資料,如資料函式庫密碼、API 金鑰等。Ansible Vault 提供了一種安全的方式來加密這些敏感資訊。

建立和加密檔案

首先,我們可以使用 ansible-vault create 命令建立一個加密的檔案。例如:

ansible-vault create roles/db_server/vars/test_environment.yml --vault-password-file password_file.txt

這個命令會建立一個新的加密檔案 test_environment.yml,並使用 password_file.txt 中的密碼進行加密。

檢視加密檔案內容

要檢視加密檔案的內容,可以使用 ansible-vault view 命令:

ansible-vault view roles/db_server/vars/test_environment.yml --vault-password-file password_file.txt

編輯加密檔案

如果需要修改加密檔案的內容,可以使用 ansible-vault edit 命令:

ansible-vault edit roles/db_server/vars/test_environment.yml --vault-password-file password_file.txt

更改加密密碼

若要更改加密檔案的密碼,可以使用 ansible-vault rekey 命令:

ansible-vault rekey roles/db_server/vars/test_environment.yml --ask-vault-pass

這個命令會提示輸入舊密碼和新密碼,完成密碼的更改。

解密檔案

最後,若需要解密檔案,可以使用 ansible-vault decrypt 命令:

ansible-vault decrypt roles/db_server/vars/test_environment.yml --ask-vault-pass

這個命令會將檔案解密,使其還原為明文狀態。

利用 Ansible Galaxy 重用角色

Ansible Galaxy 是一個由 Ansible 社群維護的平台,提供了豐富的預製角色,用於簡化自動化佈署的工作。

搜尋角色

可以使用 ansible-galaxy search 命令來搜尋所需的角色。例如,要搜尋與 Django 相關的角色,可以執行:

ansible-galaxy search django

這個命令會列出所有與 Django 相關的角色。

指定作者搜尋

如果知道角色的作者,可以使用 --author 選項來縮小搜尋範圍。例如:

ansible-galaxy search django --author ScorpionResponse

這個命令會列出由 ScorpionResponse 建立的 Django 相關角色。

安裝角色

找到所需的角色後,可以使用 ansible-galaxy install 命令進行安裝。例如:

ansible-galaxy install ScorpionResponse.django

這個命令會下載並安裝 ScorpionResponse 建立的 Django 角色。