Ansible 的條件任務允許根據特定條件決定是否執行任務,避免不必要的操作,例如在應用程式已存在時跳過安裝步驟。透過 when 陳述式,可以設定執行任務的條件,例如檢查檔案或目錄是否存在、變數值是否符合預期等。搭配 register 指令,可以將指令的執行結果儲存至變數,供後續任務判斷使用。此外,Ansible 的標籤功能可以將相關任務歸類別,方便選擇性執行。透過 tags 屬性,可以為任務新增標籤,然後使用 --tags 引數在執行 Playbook 時指定要執行的標籤,例如僅執行安裝或設定相關的任務。結合條件任務和標籤,可以更精細地控制 Playbook 的執行流程,提升自動化佈署的效率和靈活性。
使用條件任務和標籤最佳化 Ansible Playbook
在前面的章節中,我們已經建立了一個基本的 Django 應用程式佈署 Playbook。本章節將介紹如何使用條件任務和標籤來最佳化 Playbook,使其更加靈活和可控。
在 Ansible 中使用條件任務
在執行 Playbook 時,我們不希望每次都重新安裝 Django 應用程式和重置資料函式庫。Ansible 提供了條件命令,可以在執行任務之前進行測試和驗證。
主要的條件陳述式是 when,它與大多數程式語言中的 if 陳述式類別似。我們可以使用 when 陳述式來檢查應用程式目錄是否存在,如果不存在,則執行相關的任務。
實作條件任務
開啟
roles/django_app/tasks/main.yml檔案。在安裝 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。修改後續任務,使其僅在
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的步驟
- 建立加密檔案:使用
ansible-vault create命令建立一個新的加密檔案。 - 編輯加密檔案:使用
ansible-vault edit命令編輯現有的加密檔案。 - 加密現有檔案:使用
ansible-vault encrypt命令將現有的檔案加密。 - 解密檔案:使用
ansible-vault decrypt命令解密檔案以供檢視或編輯。
# 使用ansible-vault建立一個新的加密檔案
ansible-vault create secret.yml
內容解密:
此命令會開啟一個編輯器,讓您輸入要加密的內容。儲存並關閉編輯器後,檔案將被加密儲存。
使用Ansible Galaxy
Ansible Galaxy是一個公開的平台,允許使用者分享和下載Ansible角色。您可以利用Galaxy搜尋和安裝社群建立的角色,以簡化您的專案實施。
使用Ansible Galaxy的步驟
- 搜尋角色:使用
ansible-galaxy search命令搜尋符合您需求的角色。 - 安裝角色:使用
ansible-galaxy install命令安裝您需要的角色。 - 建立自己的角色:使用
ansible-galaxy init命令建立一個新的角色結構,以便與他人分享。
# 搜尋與nginx相關的角色
ansible-galaxy search nginx
內容解密:
此命令會列出所有與搜尋關鍵字相關的角色,您可以根據描述和評分選擇合適的角色進行安裝。
建立自定義Ansible模組
儘管Ansible提供了大量的內建模組,但在某些情況下,您可能需要建立自定義模組以滿足特定的需求。
建立自定義模組的步驟
- 選擇程式語言:大多數Ansible模組使用Python編寫,因為Ansible本身就是根據Python的。
- 編寫模組程式碼:根據您的需求編寫模組程式碼,確保它能夠接受引數並傳回正確的結果。
- 測試模組:在本地或測試環境中測試您的自定義模組,確保它按預期工作。
#!/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模組結構。它接受name和state兩個引數,並根據這些引數執行相應的操作。最終,它傳回一個包含執行結果的字典。
使用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指定了要使用的環境變數檔案。
使用密碼檔案
除了在執行時輸入密碼外,我們也可以使用密碼檔案來自動化這個過程。
- 建立一個名為
password_file.txt的檔案,並將vault密碼寫入其中。 - 使用
--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 角色。