歡迎來到“50 天 50 個 devops 工具”系列的第 31 天!在上一篇文章中,我們向您介紹了 ansible,涵蓋其基本架構、設置和一些簡單的手冊。今天,我們將更深入地了解 ansible 的世界,探索先進的技術和實際應用程序,將您的自動化技能提升到一個新的水平。這篇文章將重點介紹 ansible 角色、ansible vault、條件和循環等功能,為您提供實際示例來鞏固您的理解。
回顧:什么是 ansible?
在深入研究高級概念之前,讓我們快速回顧一下 ansible 是什么:
無代理自動化工具: ansible 使用 ssh 來管理節點,無需安裝任何代理。
基于 yaml 的 playbook: ansible 的任務是在人類可讀的 yaml 文件中定義的。
冪等性: 確保同一個劇本可以多次運行,而不會產生意想不到的副作用。
高級 ansible 概念
在本節中,我們將探索 ansible 的一些高級功能,這些功能可以實現更強大、更靈活的自動化。
1. ansible 角色
隨著您的 ansible 劇本變得越來越復雜,保持它們的組織性和可維護性變得很重要。 ansible 角色允許您將劇本構建為可重用的組件。
角色結構:
ansible 角色具有特定的目錄結構:
roles/ ├── common/ │ ├── tasks/ │ │ └── main.yml │ ├── handlers/ │ │ └── main.yml │ ├── templates/ │ ├── files/ │ ├── vars/ │ │ └── main.yml │ └── defaults/ │ └── main.yml
登錄后復制
每個目錄都有特定的用途:
tasks/: 包含要執行的主要任務。
handlers/: 定義應由某些任務觸發的操作(例如,重新啟動服務)。
templates/: 保存可以動態生成的 jinja2 模板。
files/: 存放需要復制到被管節點的靜態文件。
vars/: 包含特定于角色的變量。
defaults/: 存儲角色的默認變量。
創建和使用角色:
讓我們創建一個簡單的角色來設置 nginx web 服務器。
創建角色目錄:
mkdir -p roles/nginx/{tasks,handlers,templates,files,vars,defaults}
登錄后復制
定義任務:
在roles/nginx/tasks/main.yml中,添加以下內容:
--- - name: install nginx apt: name: nginx state: present - name: start nginx service: name: nginx state: started enabled: true
登錄后復制
使用劇本中的角色:
創建使用此角色的劇本:
--- - name: apply nginx role hosts: webservers roles: - nginx
登錄后復制
運行劇本:
ansible-playbook -i hosts playbook.yml
登錄后復制
使用角色有助于將復雜的劇本分解為更小的、可重用的組件,使您的自動化腳本更易于管理和擴展。
2. ansible vault
管理基礎設施時,您經常需要處理密碼、api 密鑰或 ssh 私鑰等敏感信息。 ansible vault 允許您在劇本中加密這些秘密。
加密文件:
使用 ansible vault 加密文件:
ansible-vault encrypt secrets.yml
登錄后復制
系統會提示您輸入密碼。每當運行劇本或解密文件時都需要此密碼。
使用加密變量:
在您的劇本中,您可以引用存儲在加密文件中的變量:
--- - name: deploy application with secrets hosts: appservers vars_files: - secrets.yml tasks: - name: use secret api key shell: echo "{{ api_key }}"
登錄后復制
運行劇本:
運行使用加密文件的 playbook 時,請使用 –ask-vault-pass 選項:
ansible-playbook -i hosts playbook.yml --ask-vault-pass
登錄后復制
ansible vault 是一款功能強大的工具,可確保您的敏感數據在自動化基礎設施的同時保持安全。
3. 條件和循環
現實世界的劇本通常需要根據某些條件做出決策或迭代項目列表。 ansible 提供對條件和循環的支持來處理這些場景。
使用條件:
條件允許任務僅在滿足特定條件時執行:
--- - name: install apache on debian-based systems apt: name: apache2 state: present when: ansible_os_family == "debian"
登錄后復制
循環項目:
當您需要對多個項目執行相同的任務時,循環非常有用:
--- - name: create multiple users user: name: "{{ item }}" state: present loop: - alice - bob - charlie
登錄后復制
您還可以使用更復雜的循環:
--- - name: install multiple packages apt: name: "{{ item.name }}" state: "{{ item.state }}" loop: - { name: 'nginx', state: 'present' } - { name: 'git', state: 'latest' }
登錄后復制
條件和循環使您的劇本能夠靈活地適應不同的環境和要求。
4. 動態庫存管理
在云環境中,您的基礎設施可能會頻繁更改,實例會定期啟動或關閉。管理靜態清單文件變得不切實際。動態庫存腳本允許 ansible 查詢您的云提供商并自動發現和管理您的基礎設施。
示例:使用 aws ec2 動態清單
ansible 為 aws ec2 提供動態清單腳本,您可以使用它自動發現您的 ec2 實例。
安裝所需的python包:
pip install boto boto3
登錄后復制
下載 ec2 動態清單腳本:
ansible 提供了一個 ec2 inventory 腳本,您可以下載并放置在您的項目中:
curl -o ec2.py https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.py chmod +x ec2.py
登錄后復制
配置腳本:
您可能需要配置腳本來指定您的 aws 區域和憑證。配置文件(ec2.ini)可以根據需要自定義。
使用動態清單運行 playbook:
ansible-playbook -i ec2.py playbook.yml
登錄后復制
這種方法可確保 ansible 始終擁有您的基礎設施的最新視圖,使其成為管理動態云環境的理想選擇。
5. 使用 ansible playbook 塊處理復雜的依賴關系
在某些情況下,您可能需要確保一系列任務要么全部成功,要么全部失敗。 ansible playbook 塊允許您對任務進行分組并在它們之間應用通用屬性或錯誤處理。
示例:用塊對任務進行分組
假設您正在設置一項復雜的服務,其中每項任務都取決于前一項任務的成功:
--- - hosts: appservers tasks: - block: - name: install required packages apt: name: "{{ item }}" state: present loop: - nginx - postgresql - redis - name: start services service: name: "{{ item }}" state: started loop: - nginx - postgresql - redis rescue: - name: rollback in case of failure shell: | systemctl stop nginx systemctl stop postgresql systemctl stop redis
登錄后復制
在此示例中,如果塊內的任何任務失敗,則將執行救援部分中的任務,允許您實現自定義錯誤處理和回滾機制。
6. 使用 ansible playbook 編排復雜的工作流程
在處理多步驟流程時,例如部署微服務架構或設置持續集成/持續部署(ci/cd)管道,您需要編排多個 playbook 以按特定順序運行。
示例:編排微服務部署
假設您有三個需要按特定順序部署的微服務:
準備環境:安裝docker和kubernetes。
部署數據庫服務: 該服務需要先于其他服務啟動。
部署后端服務: 依賴于數據庫服務。
部署前端服務: 取決于后端服務。
劇本結構:
--- - import_playbook: prepare_environment.yml - import_playbook: deploy_database.yml - import_playbook: deploy_backend.yml - import_playbook: deploy_frontend.yml
登錄后復制
運行精心策劃的劇本:
ansible-playbook site.yml
登錄后復制
此編排可確保每個服務都按正確的順序部署,并正確管理依賴項。
現實場景:部署多層應用程序
讓我們考慮一個場景,您需要部署一個由前端服務器、后端服務器和數據庫服務器組成的多層 web 應用程序。您要確保數據庫設置在后端服務器之前,后端服務器設置在前端之前。
第 1 步:定義庫存
創建清單文件hosts:
[frontend] 192.168.1.10 [backend] 192.168.1.11 [database] 192.168.1.12
登錄后復制
第 2 步:編寫劇本
這是部署應用程序的簡化劇本:
--- - name: deploy database hosts: database tasks: - name: install mysql apt: name: mysql-server state: present - name: deploy backend hosts: backend tasks: - name: install python dependencies pip: name: - flask - sqlalchemy state: present when: ansible_os_family == "debian" - name: deploy frontend hosts: frontend tasks: - name: install nginx apt: name: nginx state: present
登錄后復制
第 3 步:執行 playbook
運行 playbook 來部署應用程序:
ansible-playbook -i hosts deploy.yml
登錄后復制
此劇本確保數據庫在后端之前設置,后端在前端之前設置。您可以根據需要添加更多任務和角色以完全配置應用程序。
結論
在今天的帖子中,我們深入研究了 ansible 的高級功能,展示了如何使用角色構建劇本、使用 ansible vault 保護敏感信息以及使用動態清單管理動態基礎設施。我們還探索了如何使用 playbook 塊處理復雜的工作流程,利用 ansible galaxy 的社區角色,以及集成 ansible 進行容器編排。
ansible 的多功能性使其成為 devops 工程師的關鍵工具,使您能夠自動執行復雜的任務、確保跨環境的一致性并加快部署流程。
明天,我們將深入研究新的 devops 工具。敬請期待!
? 請務必在 linkedin 上關注我以獲取最新更新:shiivam agnihotri