Pyinfra:使用Python自动化基础设施


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”关键字使简单的编程错误更有可能发生(同样,此代码不太可能经过单元测试)