:用 Ansible Roles 與 Galaxy 重構(gòu) Playbook,讓配置管理可擴(kuò)展)
文檔/教程【免費(fèi)下載鏈接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.項目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps點擊查看免費(fèi)下載導(dǎo)讀本文是 90DaysOfDevOps 項目中 2022/pl/day66.md 的深度展開主題是Ansible Playbook 的進(jìn)階工程化在完成 Vagrant 四節(jié)點實驗環(huán)境與 Web 服務(wù)器配置后通過拆分 tasks/handlers 到子目錄和引入 Ansible Roles ansible-galaxy兩種手段將單體 Playbook 重構(gòu)為結(jié)構(gòu)清晰、可復(fù)用、可擴(kuò)展的自動化代碼。讀完本文你將掌握 Playbook 瘦身、import_tasks靜態(tài)導(dǎo)入、ansible-galaxy init角色腳手架、角色目錄規(guī)范以及如何處理舊版include語法的棄用警告——這些能力正是把 DevOps 配置管理從小實驗推向生產(chǎn)級的基礎(chǔ)。回顧Day 65 建立的實驗環(huán)境在進(jìn)入本課之前項目此前已通過 Configmgmt/Vagrantfile 拉起了一個包含 4 臺虛擬機(jī)的迷你實驗室并指定其中的 Linux 節(jié)點作為 Ansible 控制機(jī)control node。前文已跑通了若干 Playbook 場景最終得到一份能讓 web01 與 web02 各自成為獨(dú)立 Web 服務(wù)器的 Playbook。也就是說此刻我們的拓?fù)涫强刂茩C(jī)Linux 節(jié)點承載 Ansible 與 SSH 管理web01 / web02已被配置為 Apache2 Web 服務(wù)器另外兩臺節(jié)點尚無角色后續(xù)將分別承擔(dān)數(shù)據(jù)庫mysql與負(fù)載均衡nginx職能。前序 Playbook 的完整代碼位于 Configmgmt/ansible-scenario1首個含模板的單體版本與 Configmgmt/simple_play.yml最簡示例可以對照閱讀體會演進(jìn)脈絡(luò)。讓 Playbook 保持整潔拆分 tasks 與 handlers當(dāng) Playbook 里任務(wù)、處理器、模板越來越多時單個 YAML 文件會迅速變得難以維護(hù)。原文給出的第一步重構(gòu)是把**任務(wù)tasks和處理器handlers**分別抽到獨(dú)立子目錄中讓 Playbook 本體只保留編排邏輯。第一步把 tasks 抽到獨(dú)立文件將原本寫在 Playbook 中的 Apache 部署任務(wù)復(fù)制到tasks/apache2_install.yml- name: ensure apache is at the latest version apt: nameapache2 statelatest - name: write the apache2 ports.conf config file template: srctemplates/ports.conf.j2 dest/etc/apache2/ports.conf notify: restart apache - name: write a basic index.html file template: src: templates/index.html.j2 dest: /var/www/html/index.html notify: - restart apache - name: ensure apache is running service: name: apache2 state: started這段任務(wù)的職責(zé)非常清晰對應(yīng)四條核心動作任務(wù)模塊作用aptapt確保 apache2 為最新版本寫入 ports.conftemplate用 Jinja2 模板渲染 Apache 端口配置并notify觸發(fā)重啟寫入 index.htmltemplate渲染自定義歡迎頁到/var/www/html/同樣觸發(fā)重啟啟動服務(wù)service確保 apache2 處于 started 狀態(tài)注意notify的用法它并不會立即執(zhí)行重啟而是登記一個 handler只有在該任務(wù)真正改變狀態(tài)時才在 Playbook 末尾觸發(fā)——這正是 Ansible 冪等設(shè)計的體現(xiàn)。第二步把 handlers 抽到獨(dú)立文件同樣把重啟處理器復(fù)制到handlers/main.yml- name: restart apache service: name: apache2 state: restarted第三步Playbook 通過導(dǎo)入引用它們重構(gòu)后的 Playbook 更名為playbook2.yml通過import_tasks把外部文件靜態(tài)引入。倉庫中的真實實現(xiàn)見 Configmgmt/ansible-scenario2/playbook2.yml- hosts: webservers become: yes vars: http_port: 8000 https_port: 4443 html_welcome_msg: Hello 90DaysOfDevOps - Welcome to Day 66! tasks: - import_tasks: tasks/apache2_install.yml handlers: - import_tasks: handlers/main.yml這里值得留意Playbook 通過vars聲明了http_port、https_port、html_welcome_msg三個變量它們會被模板消費(fèi)詳見下文模板如何消費(fèi)變量。整份重構(gòu)后的完整場景代碼位于 Configmgmt/ansible-scenario2目錄結(jié)構(gòu)如下ansible-scenario2/ ├── handlers/ │ └── main.yml # restart apache 處理器 ├── tasks/ │ └── apache2_install.yml ├── templates/ │ ├── index.html.j2 │ └── ports.conf.j2 └── playbook2.yml驗證用 curl 檢查那次簡單的改動原文提示如果你從倉庫復(fù)制文件會注意到 write a basic index.html file 任務(wù)發(fā)生了變化——template的寫法從src... dest...鍵值對風(fēng)格變成了src: ...和dest: ...YAML 映射風(fēng)格。兩種語法等價后者是更規(guī)范、可讀性更好的現(xiàn)代寫法倉庫中的 ansible-scenario2/tasks/apache2_install.yml 同時保留了這兩種風(fēng)格正好用來對比學(xué)習(xí)。在控制機(jī)上執(zhí)行驗證命令curl web01:8000curl 之所以訪問 8000 端口是因為ports.conf.j2模板將 Apache 監(jiān)聽端口渲染為{{ http_port }}而http_port在 Playbook 的vars中被賦值為 8000。執(zhí)行后應(yīng)能看到由index.html.j2渲染出的歡迎頁內(nèi)容。到這里第一層重構(gòu)完成Playbook 本體只剩編排信息任務(wù)與處理器各自歸位即使未來任務(wù)數(shù)量成倍增長文件也不會失控。Roles 與 Ansible Galaxy把 Web 服務(wù)器配置變成可復(fù)用單元拆分 tasks/handlers 只是整理而Roles角色才是 Ansible 實現(xiàn)復(fù)用與分層的核心機(jī)制。當(dāng)我們要把剩余節(jié)點配置為數(shù)據(jù)庫服務(wù)器與負(fù)載均衡器時用 Role 把某類主機(jī)該做什么完整封裝是標(biāo)準(zhǔn)的工程化路徑。ansible-galaxy角色管理的瑞士軍刀ansible-galaxy是 Ansible 自帶的角色管理命令既可以從 Ansible Galaxy 共享社區(qū)下載現(xiàn)成角色也可以本地初始化一個標(biāo)準(zhǔn)角色骨架。本課用它來創(chuàng)建 apache2 角色ansible-galaxy init roles/apache2執(zhí)行后會在roles/apache2/下生成一套標(biāo)準(zhǔn)的角色目錄結(jié)構(gòu)。倉庫中該角色已完整落地見 Configmgmt/ansible-scenario3/roles/apache2roles/apache2/ ├── defaults/ │ └── main.yml # 角色默認(rèn)變量最低優(yōu)先級 ├── handlers/ │ └── main.yml # restart apache ├── meta/ │ └── main.yml # 角色元數(shù)據(jù)作者、依賴等 ├── tasks/ │ ├── apache2_install.yml │ └── main.yml # 角色任務(wù)入口 ├── templates/ │ ├── index.html.j2 │ └── ports.conf.j2 ├── tests/ │ ├── inventory │ └── test.yml # 角色自測用例 ├── vars/ │ └── main.yml # 角色內(nèi)部變量 └── README.md這套目錄是 Ansible 的約定優(yōu)于配置Ansible 運(yùn)行角色時會按固定順序加載這些目錄中的main.yml——先是defaults默認(rèn)值最低優(yōu)先級隨后按依賴關(guān)系加載meta最后執(zhí)行taskshandlers、templates、vars則各司其職。遷移現(xiàn)有內(nèi)容到角色結(jié)構(gòu)骨架建好后把上一節(jié)ansible-scenario2中的成果搬入對應(yīng)目錄tasks/apache2_install.yml→roles/apache2/tasks/apache2_install.ymltemplates/index.html.j2、templates/ports.conf.j2→roles/apache2/templates/handlers/main.yml→roles/apache2/handlers/main.yml。由于 Ansible 約定角色的任務(wù)入口固定為tasks/main.yml還需在入口文件中導(dǎo)入真正的任務(wù)清單。倉庫實現(xiàn)見 Configmgmt/ansible-scenario3/roles/apache2/tasks/main.yml--- # tasks file for roles/apache2 - import_tasks: apache2_install.yml改造 Playbook從聲明任務(wù)到聲明角色接下來把 Playbook 改為引用角色。在playbook1.ymltasks 直接內(nèi)聯(lián)與playbook2.ymltasks 用 import_tasks 引入兩個版本中任務(wù)與處理器的聲明方式各不相同而角色化之后Playbook 只需在roles鍵下羅列角色名即可。倉庫中重構(gòu)后的 Configmgmt/ansible-scenario3/playbook3.yml 如下- hosts: webservers become: yes vars: http_port: 8000 https_port: 4443 html_welcome_msg: Hello 90DaysOfDevOps - Welcome to Day 66! roles: - apache2對比playbook2.yml原來的tasks:與handlers:段落消失了取而代之的是roles: - apache2。Ansible 會自動尋找roles/apache2/目錄并執(zhí)行其中的任務(wù)與處理器同時角色內(nèi)部可以訪問 Playbook 級vars中聲明的變量。運(yùn)行角色化后的 Playbookansible-playbook playbook3.yml處理棄用警告include 與 import_tasks 的取舍運(yùn)行playbook3.yml時輸出中會出現(xiàn)一條deprecation棄用警告。原因在于早期版本中tasks/main.yml使用舊式include指令來引入任務(wù)文件而舊式裸include已被 Ansible 官方棄用。雖然 Playbook 仍能執(zhí)行但按官方建議應(yīng)盡快修正。修復(fù)方式是把tasks/main.yml中的引入方式改為import_tasks靜態(tài)導(dǎo)入在 Playbook 解析階段就把任務(wù)展開--- # tasks file for roles/apache2 - import_tasks: apache2_install.yml這里可以展開說明兩者的本質(zhì)區(qū)別這也是從源碼結(jié)構(gòu)能清晰觀察到的設(shè)計意圖import_tasks靜態(tài)導(dǎo)入解析期展開任務(wù)列表在運(yùn)行前就已確定支持when條件作用于整段導(dǎo)入、不支持循環(huán)變量傳遞適合導(dǎo)入結(jié)構(gòu)固定的任務(wù)清單——角色入口用它最穩(wěn)妥include_tasks動態(tài)導(dǎo)入運(yùn)行期按需加載支持在循環(huán)中按變量動態(tài)決定導(dǎo)入哪個文件但會帶來一定解析開銷與行為不確定性。修復(fù)后再次運(yùn)行ansible-playbook playbook3.yml棄用警告即消失。修正后的完整場景代碼見 Configmgmt/ansible-scenario3。模板如何消費(fèi)變量從源碼看渲染鏈路角色化后模板文件被遷移到roles/apache2/templates/下。閱讀倉庫源碼可以完整還原變量 → 模板 → 目標(biāo)文件的渲染鏈路ports.conf.j2 的核心行Listen {{ http_port }} IfModule ssl_module Listen {{ https_port }} /IfModule IfModule mod_gnutls.c Listen {{ https_port }} /IfModuleindex.html.j2 的完整內(nèi)容html h1{{ html_welcome_msg }}/h1 /html可見ports.conf.j2消費(fèi)http_port、https_portindex.html.j2消費(fèi)html_welcome_msg三者都由 Playbook 級vars提供。這也解釋了為什么curl web01:8000能取到 8000 端口上的歡迎頁——模板渲染、端口監(jiān)聽、內(nèi)容展示形成了一條完整的自動化鏈路。角色內(nèi)defaults/main.yml與vars/main.yml目前是空的見 defaults/main.yml說明變量優(yōu)先級完全由 Playbook 頂層vars提供實際生產(chǎn)中可以下沉到defaults讓角色自帶默認(rèn)值并允許被外部覆蓋。為負(fù)載均衡與通用配置再建兩個角色Web 服務(wù)器角色化只是開始。剩余的數(shù)據(jù)庫節(jié)點與負(fù)載均衡節(jié)點同樣需要角色化繼續(xù)用ansible-galaxy初始化# common適用于所有服務(wù)器通用工具、基礎(chǔ)配置 ansible-galaxy init roles/common # nginx用于負(fù)載均衡 / 反向代理節(jié)點 ansible-galaxy init roles/nginx至此倉庫中已具備 apache2、common、nginx 三個角色。項目后續(xù)場景ansible-scenario4、ansible-scenario5、ansible-scenario6、ansible-scenario7在此基礎(chǔ)上持續(xù)演進(jìn)從 nginx 負(fù)載均衡配置roles/nginx/tasks/configure_nginx.yml、roles/nginx/templates/mysite.j2、common 通用工具安裝roles/common/tasks/install_tools.yml到group_vars/all/common_variables.yml的變量分層以及 mysql 角色roles/mysql/tasks/install_mysql.yml、setup_mysql.yml——把每個節(jié)點職能封裝成角色正是本課方法論在后續(xù)章節(jié)的延續(xù)也是讀者可以提前通讀這些目錄來印證的方向。小結(jié)與下一步本課完成了兩級重構(gòu)模塊級拆分tasks、handlers、templates 各歸其位Playbook 只保留編排與變量ansible-scenario2角色級抽象用ansible-galaxy init生成標(biāo)準(zhǔn)角色骨架把 Web 服務(wù)器配置整體封裝為roles/apache2Playbook 通過roles:一行引用并順手修復(fù)了舊式include的棄用警告ansible-scenario3。這兩種做法都指向同一個目標(biāo)讓 Playbook 在節(jié)點數(shù)量與業(yè)務(wù)復(fù)雜度增長時依然保持清晰、可復(fù)用、可測試。已部署但尚未配置的數(shù)據(jù)庫與負(fù)載均衡節(jié)點將在下一篇Day 67中借助 common、nginx、mysql 等角色逐步落地。想要繼續(xù)動手實踐請把 Configmgmt/ansible-scenario3 的完整目錄復(fù)制到控制機(jī)對照本文逐文件閱讀再在實驗環(huán)境中重跑ansible-playbook playbook3.yml觀察輸出差異。贊分享文檔/教程【免費(fèi)下載鏈接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.項目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps點擊查看免費(fèi)下載相關(guān)推薦90DaysOfDevOps Day 66 實戰(zhàn)用 Ansible Galaxy 與 Roles 重構(gòu) Apache Playbook90DaysOfDevOps Day 66 實戰(zhàn)用 Ansible Galaxy 與 Roles 重構(gòu) Apache Playbook 本文是 90DaysO文檔/教程90DaysOfDevOps Day66Ansible Playbook 結(jié)構(gòu)優(yōu)化——從扁平任務(wù)到 Roles 與 Ansible Galaxy 的角色化重構(gòu)90DaysOfDevOps Day66Ansible Playbook 結(jié)構(gòu)優(yōu)化——從扁平任務(wù)到 Roles 與 Ansible Galaxy 的角色化重構(gòu)文檔/教程90DaysOfDevOps 第 66 天Ansible Playbooks 進(jìn)階——任務(wù)與處理器拆分、Roles 與 Ansible Galaxy 實戰(zhàn)90DaysOfDevOps 第 66 天Ansible Playbooks 進(jìn)階——任務(wù)與處理器拆分、Roles 與 Ansible Galaxy 實戰(zhàn) 本文檔/教程上一篇5分鐘掌握PUBG羅技鼠標(biāo)宏告別壓槍煩惱的終極指南下一篇GitHub Copilot GPT 提示詞全解析AI 編程助手的系統(tǒng)指令設(shè)計、能力矩陣與輸出協(xié)議創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考