Pyinfra:使用Python自動化基礎設施

banq發表於2024-05-02


pyinfra 使用 Python 自動化基礎設施。它速度很快,可以從一臺伺服器擴充套件到數千臺伺服器。非常適合臨時命令執行、服務部署、配置管理等。

這就是為什麼你應該嘗試 pyinfra:

  • 以可預測的效能對數千個目標進行超快速執行。
  • 使用實時 stdin/stdout/stderr 輸出進行即時除錯-vvv( )。
  • 冪等操作,可在進行更改之前啟用差異和試執行。
  • 可擴充套件整個 Python 包生態系統。
  • 針對具有 shell 訪問許可權的任何內容進行無代理執行。
  • 與 Docker、Terraform、Vagrant 等聯結器整合。

與 Ansible 相比有什麼優勢?
Ansible 是一個用 Python 編寫的成熟且最流行的無代理配置管理工具。

  • 當處理“if-this-then-that-else-that”。由於 Ansible純粹是宣告性的,Ansible 在這方面很糟糕。
  • Pyinfra 可以在命令模式下使用,這將使 if-else 的使用變得輕而易舉
  • Pyinfra效能比 Ansible 更好:https://docs.pyinfra.com/en/next/performance.html

網友討論:
1、我目前使用 Ansible 來設定本地和遠端主機。我對此非常滿意,並且很高興 Pyinfra 打算支援 Ansible 聯結器。
我對 Ansible 的主要抱怨是 YAML 規範。 Ansible 選擇將任務規範和任務執行分開。 Pyinfra 選擇直接暴露 Python 層,而不是使用稍微醜陋的魔法函式/變數。我更喜歡這種方法,因為它允許標準的 Pythonic 控制流,而不是使用新的(可以說是醜陋且維護起來更麻煩)語法。

2、Ansible 的最大問題是 YAML,用迴圈做任何事情都是可怕的,並且每次嘗試破壞巢狀變數型別都需要在 StackOverflow 上發帖。
幾年前,我發現了一個庫,可以讓您在原始 Python 中使用 Ansible 的任務,避免了使用 Ansible Python API 巨大麻煩。然而我再也找不到它了。但 PyInfra 看起來很棒。
僅此一點就是我開始研究 pyinfra 的全部原因,YAML 中的迴圈是邪惡的。

3、我剛剛開始使用 Pyinfra 來處理一堆伺服器,與 Ansible 相比,它真是令人耳目一新。我將所有伺服器作業系統安裝移至 Fedora CoreOS,該作業系統在作業系統中不附帶 Python,並且由於 Pyinfra 在主機節點上不需要 Python,我可以批次啟動任務來執行伺服器操作。太好了。我迫不及待地想看看 Pyinfra 專案的走向。

順便說一句,為了讓 Ansible 在 Fedora CoreOS 上執行,我想到的最棘手的事情之一是繫結掛載一個包含 python 3 的容器 rootfs,然後將其符號連結到正確的位置。如果你願意的話,你當然可以使用 rpm-ostree 新增 Python,但我當時想避免分層包。我並不為此感到自豪。但它奏效了。
https://github.com/forem/selfhost/blob/main/playbooks/templa...


4、我認為 Puppet 在這個領域達到了最佳點。它的預設值是一系列冪等的“這是應該如何配置”語句,但它可以以其更高階的能力用作完整的程式語言,並且可以合理擴充套件(在 Puppet-lang 和 Ruby 中)以支援特定的自定義應用程式。
我還認為事實/清單/應用分離有利於良好的可測試基礎程式碼和有用的空執行輸出。
我總是很驚訝 Puppet 並沒有變得更受歡迎。
也許是因為 Ruby 語言? 與 Python 不同,Ruby 在運維領域基本上是一種死語言。

5、我現在最喜歡的部署服務的方式完美結合:

  •  使用 PyInfra 在遠端主機上設定 Docker 和 Tailscale 以及任何其他設定。開啟 Tailnet 的 Docker 埠。
  •  使用 Terraform 的 Docker 提供程式從您的開發計算機或 CI/CD 工具在這些主機上設定和管理容器。 Tailscale 允許不同機器上的容器進行私下通訊,或者您可以開啟一個到網路的埠。

這使得設定如此易於使用且有彈性。過去我會使用 Kubernetes,但我逐漸意識到這對於我所做的任何事情來說都太過分了,而且除錯起來也更加困難。

6、ansible 的痛點:儲存狀態並稍後檢查,使用 Pyinfra 協調伺服器之間的狀態非常輕鬆,因為您編寫了 Python 程式碼來執行這些檢查。

7、對於基礎設施來說,Python 似乎是一個非常糟糕的選擇。

  • - Python 不容易構建到可移植的二進位制檔案中
  • - 軟體包生態系統很難以可重複的方式使用
  • - 該語言並不是真正型別化的 - 型別為基礎設施和指令碼增加了巨大的價值,因為它們不太可能進行單元測試
  • - 缺少“let”或“var”關鍵字使簡單的程式設計錯誤更有可能發生(同樣,此程式碼不太可能經過單元測試)


 

相關文章