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