Bash
Ansible 與定制解決方案
我有大約十幾個執行 Linux 的工作站,我需要一個系統來以某種方式使它們保持同步(安裝相同的軟體、相同的配置、相同的使用者……)並且還允許我及時改進它們(想想配置更改、驅動程序更新、新軟體…)。訣竅是,有時,其中一些會離線,僅在數週甚至數月後才重新啟動,有時會添加新的工作站並需要從頭開始配置。
我正在研究使用Ansible,它看起來很棒,但對於我的案例,它有兩個缺點:
- 它沒有自動更新功能(當一個盒子在長時間不活動後啟動時,我需要在控制器站上手動執行劇本)
- 經過多年的生產,劇本會變得很長。必須在只錯過一些更新的工作站上執行它是非常低效的。即使所有任務都是冪等的,它們中的每一個都必須被發送到工作站以查看它是否被執行。將劇本分成更小的部分也不理想,因為它需要跟踪執行的內容和位置。
我正在考慮的替代方法是擁有一個腳本儲存庫並使用GNU Make來執行它們。Make用於從源更新目標,它基本上在源文件上執行命令以產生輸出(例如,將 C 程序編譯為二進製文件)。如果我將腳本視為源,那麼像這樣的 Makefile 就可以完成這項工作:
TASKS= \ install_apps \ start_services \ add_users TARGETS=$(TASKS:=.done) all: $(TARGETS) %.done: %.sh echo "running $<" ./$< touch $@
當其中一個工作站啟動時,它可以自動提取腳本 repo 並執行make。有了這個系統,任務只執行一次,並按照它們列出的順序。
問題
- 你認為我列出的缺點是錯誤的嗎?也許有一種方法/解決方法可以使用Ansible實現我的目標
- 您認為我提出的替代方案有任何問題嗎?請記住,上面的 Makefile 已簡化,尚未準備好生產。
第一個缺點,Ansible 是一個基於推送的系統,可以通過使用ansible-pull來緩解。
ansible-pull
從 VCS 儲存庫中提取劇本並為本地主機執行它們
ansible-pull
可以由 cron 或啟動腳本觸發。長期執行的劇本的第二個缺點是真實的。Ansible 不是市場上最快的配置管理系統。然而,使用mitogen可以減少 Ansible 的執行時間,並且相對容易實現條件來跳過劇本的部分內容以加快播放速度,如下所示:
- name: Register a variable ansible.builtin.shell: cat /etc/motd register: motd_contents - name: Use the variable in conditional statement to run long running play include: otherplays.yaml when: motd_contents.stdout.find('hi') != -1
如果您在編寫劇本時考慮到執行時間,它可以與普通 bash 一樣快。
一般來說,Ansible 提供了很多有用的工具來配置系統。Ansible 中可能沒有任何東西不能使用類似的東西來
Make
實現Bash
。Ansible 相對於 Bash 的優勢在於,很多人發現它更易於使用並且程式碼更具可讀性。