加速 Ansible

加速 Ansible
眾所周知,使用預設設定 Ansible 無法很快完成其工作。 在本文中,我將指出這樣做的幾個原因,並提供有用的最小設置,這些設置很可能實際上會提高專案的速度。

這裡和下面我們討論 Ansible 2.9.x,它以您最喜歡的方式安裝在新建立的 virtualenv 中。

安裝後,在你的劇本旁邊建立一個「ansible.cfg」檔案 - 這個位置將允許你將這些設定與項目一起傳輸,而且它們會自動載入。

流水線

有些人可能已經聽說過需要使用管道,即不將模組複製到目標系統的檔案系統,而是將 Base64 包裝的 zip 檔案直接傳輸到 Python 解釋器的 stdin,但其他人可能沒有,但事實仍然是一個事實: 這個設定 仍然被低估。 不幸的是,一些流行的 Linux 發行版默認情況下配置 sudo 的效果不是很好 - 因此該命令需要 tty(終端),因此 Ansible 預設為禁用這個非常有用的設定。

pipelining = True

收集事實

您是否知道,在預設設定下,每次播放的 Ansible 都會啟動參與其中的所有主機的事實收集? 一般來說,如果您不知道,現在您知道了。 為了防止這種情況發生,您需要啟用用於收集事實的明確請求模式(明確)或智慧模式。 其中,只會從以前的遊戲中沒有遇到的那些主機中收集事實。
UPD。 複印時,您必須選擇這些設定之一。

gathering = smart|explicit

重複使用 ssh 連接

如果您曾經在偵錯模式下執行 Ansible(「v」選項,重複一到九次),您可能已經注意到 ssh 連線不斷建立和斷開。 所以,這裡也有一些微妙之處。

您可以避免同時在兩個層級重新建立 ssh 連線的步驟:直接在 ssh 用戶端中以及從管理器將檔案傳輸到託管主機時。
要重複使用開啟的 ssh 連接,只需將必要的金鑰傳遞給 ssh 用戶端即可。 然後它會開始做以下事情:當第一次建立ssh連接時,它會額外創建一個所謂的控制套接字,在後續安裝時,它會檢查這個套接字是否存在,如果成功,則重用該套接字現有的 ssh 連線。 為了讓這一切有意義,讓我們設定非活動狀態下保持連線的時間。 您可以閱讀更多內容 ssh 文件,在 Ansible 的上下文中,我們只需使用「轉送」必要的選項到 ssh 用戶端。

ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"

要在將檔案傳輸到託管主機時重複使用已開啟的 ssh 連接,只需指定另一個未知設定 ssh_tranfer_method 即可。 關於這個主題的文檔非常 小氣 並且具有誤導性,因為這個選項效果很好! 但讀書 源代碼 讓您了解到底會發生什麼:dd 指令將在託管主機上啟動,直接處理所需的檔案。

transfer_method = piped

順便說一下,在“develop”分支中也存在這個設置 哪兒也不去.

不怕刀,就怕叉

另一個有用的設定是叉子。 它決定將同時連接到主機並執行任務的工作進程的數量。 由於 Python 作為一種語言的特殊性,使用的是進程,而不是線程,因為 Ansible 仍然支援 Python 2.7 - 沒有 asyncio,這裡沒有必要引入異步行為! 預設情況下 Ansible 運行 工人,但如果詢問正確,它將啟動更多:

forks = 20

我只是立即警告您,這裡可能存在一些與控制機上的可用內存量相關的困難。 換句話說,你當然可以設定forks=100500,但是誰說這樣就可以呢?

把它們放在一起

因此,對於 ansible.cfg(ini 格式),必要的設定可能如下所示:

[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped

如果您想隱藏健康人的正常 YaML 庫存中的所有內容,那麼它可能看起來像這樣:

---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m

不幸的是,這不適用於設定「gathering = smart/explicit」和「forks = 20」:它們的 YaML 等效項不存在。 我們要麼在 ansible.cfg 中設定它們,要麼透過環境變數 ANSIBLE_GATHERING 和 ANSIBLE_FORKS 傳遞它們。

關於絲拓素
- 關於 Mitogen 的內容在哪裡? - 親愛的讀者,你有權利詢問。 這篇文章中沒有任何地方。 但是,如果你真的準備好閱讀它的程式碼並弄清楚為什麼你的劇本在Mitogen 中崩潰,但在普通Ansible 中運行良好,或者為什麼同一個劇本之前運行良好,但在更新後開始做奇怪的事情- 好吧,Mitogen可能是你的工具。 應用它、理解它、寫文章——我會饒有興趣地閱讀它。

為什麼我個人不使用 Mitogen? 因為 Gladiolus 只有在任務非常簡單且一切都很好的情況下才有效。 然而,如果你向左或向右轉動一點——就是這樣,我們已經到了:作為回應,一些模糊的例外向你飛來,為了完成這幅圖,所缺少的是常用短語“謝謝大家” ,每個人都是自由的。” 總的來說,我只是不想浪費時間去尋找下一次「地下敲門聲」的原因。

其中一些設定是在閱讀過程中發現的 源代碼 連接插件的名稱不言自明「ssh.py」。 我分享閱讀的結果,希望它能激勵其他人查看原始程式碼、閱讀它們、檢查實現、與文件進行比較 - 畢竟,所有這些遲早會給你帶來積極的結果。 祝你好運!

只有註冊用戶才能參與調查。 登入, 請。

您使用以下哪些 Ansible 設定來加速您的專案?

  • 69,6%流水線=true32

  • 34,8%聚集=智能/顯式16

  • 52,2%ssh_args =“-o ControlMaster=auto -o ControlPersist=...”24

  • 17,4%傳輸方法=管道8

  • 63,0%叉子 = XXX29

  • 6,5%這些都不是,只有 Mitogen3

  • 8,7%Mitogen + 我會記下這些設定中的哪一個4

46 位用戶投票。 21 位用戶棄權。

想了解更多關於 Ansible 的內容嗎?

  • 78,3%是的,當然54

  • 21,7%是的,我只是想要更多硬核的東西!15

  • 0,0%不,這不是沒有必要的0

  • 0,0%不,這很複雜!!!0

69 位用戶投票。 7 名用戶棄權。

來源: www.habr.com

添加評論