Bash

Ansible 與定制解決方案

  • October 30, 2020

我有大約十幾個執行 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 的優勢在於,很多人發現它更易於使用並且程式碼更具可讀性。

引用自:https://serverfault.com/questions/1040627