ハクソク

世界を動かす技術を、日本語で。

PyInfra 3.8.0

概要

  • 3.8.0リリースで多くのバグ修正と機能改善を実施
  • semver(セマンティックバージョニング)への完全移行
  • セキュリティ強化やコマンド注入防止のための改良
  • 新機能追加:Docker、GPG、AIエージェントなどのサポート拡充
  • ドキュメントとCIの改善で開発体験向上

3.8.0リリース:主な変更点

  • semver(セマンティックバージョニング)への完全移行
    • バージョン番号が「3.8.0」のように「.0」付きに統一
  • contributorsへの感謝メッセージ

コア機能・APIの改善

  • api.command: make_formatted_string_commandの不要なスペース追加バグ修正
  • api: ClickからコアAPIを分離、出力関数のプラグイン化
  • operations: ユーザー入力のクォート拡張によるコマンドインジェクション防止
  • facts.selinux.FileContext: SELinuxコンテキスト欠如時の処理追加
  • facts.systemd: user manager未使用時のsystemd情報取得の安定化
  • facts.apt.AptSources: deb822フォーマットサポート追加
  • operations.files: diff出力の拡張、ダウンロード帯域幅制限(limit_rate)追加、unarchive操作追加
  • facts.server: ポート情報(Ports fact)、AuthorizedKeys追加、user_authorized_keysの冪等性確保
  • facts.choco: ChocoPackagesの無効なshell_executable削除
  • operations.git.repo: depthサポート追加、最新時のpull抑止
  • operations.docker: 追加パラメータ・カスタムコマンド・compose/build/login/logout操作追加
  • operations.selinux.port: sepolicyコマンド欠如時のラベル検出修正
  • operations.server.reboot: SSHセッション切断時のaskpassクリーンアップ対応
  • facts.docker: version/container/image/network詳細情報追加
  • facts.crontab: crontab(5)の環境変数構文完全対応
  • operations.files.download: 既存ファイルのmode/user/group整合
  • facts.{yum,dnf,zypper}: 各リポジトリエントリにfilenameフィールド追加
  • operations.server: BSD rc.dをsysvinitより先にdispatch
  • facts+operations: GpgKeyrings factとgpg.*操作追加、uvサポート、server.Processes fact・server.kill操作追加
  • dependencies/paramiko: paramiko v4対応、DSSキーサポート削除
  • operations.server.mount: 既にマウント済みデバイスの検出修正
  • arguments: dzdoによる特権昇格サポート追加(CLIオプション・設定含む)
  • zfs: zfs/zpoolコマンド未検出時は空dict返却
  • facts,operations: shlex.quoteからStringCommand+QuoteStringへの移行

コネクタ・互換性

  • connectors.ssh: SSH configファイルのコメント解析修正、ProxyJump経由のConnectTimeout対応
  • connectors: macOS+Python 3.13対応のためgevent.subprocess利用、askpass生成エラー表示
  • progress: スピナーの早期終了
  • security: コマンド構築時の未信頼値クォート強化
  • ci: デフォルトPythonを3.14へアップグレード

ドキュメント・メタ・CI

  • docs: OpenWrtのapk切替注意、operation引数リストの余計なカンマ修正、キーワード専用引数の記載追加、docsビルドをCIに追加
  • docs: template変数利用の明確化、Pythonバージョン要件更新、モジュール単位のfact/operationドキュメント生成
  • docs: group_data/はfile-inventory専用の明示
  • fix: group dataからimport除外、factsドキュメント生成スクリプトのラベル追加

その他の新機能・改善

  • meta,api: fact/operationモジュールの遅延ロード
  • fix: FunctionCommandのタイムアウト対応
  • feat: config.INHERIT_ENVでローカルプロセスの環境変数を全opに継承
  • AIエージェント: AIコーディングエージェント利用サポート追加
  • PRレビュー: PRレビュー用スキル追加
  • facts: requires_commandガードセンチネル・check_preconditions()フック追加
  • facts.zfs: ZfsDatasets用check_preconditions追加・コマンドメソッド更新
  • operations/facts: apt.keyの近代化(非推奨apt-keyの置換)
  • chore: Claudeの型ヒントを最新化
  • apt: apt.packagesにpurgeオプション追加
  • fix: TmpDirシェルスクリプトにセミコロン追加(sh -c互換性)
  • fix: server.sysctl値の比較正規化

このリリースは全体的な品質向上セキュリティ強化新機能の追加が主な特徴。今後もsemver準拠での安定したリリースが継続予定。

Hackerたちの意見

開示: PyInfraのコアコントリビューターです。3.8.0をリリースしました。PyInfraはエージェントレスのインフラ自動化ツールです。AnsibleやSalt、Chefと同じ仕事の内容です。ホストにSSHで接続して、望む状態を記述すると、それを比較して収束させます。エージェントも中央サーバーもデーモンもなし。違いは、あなたの「プレイブック」がただのPythonであること。YAMLのコスプレをしたPythonではなく、Helmチャートの中にあるYAMLの中に隠されたJinjaでもない。実際のPythonです。例えば、以下のように書きます。 ```python from pyinfra.operations import apt, files, server apt.packages(packages=["nginx"], update=True) files.template(src="nginx.conf.j2", dest="/etc/nginx/nginx.conf") server.service(service="nginx", running=True, enabled=True) ``` 冪等性のある操作。ホストから集めた情報を使って、普通の`if`文で分岐します。実際のループ、実際のインポート、リアルなデバッガ、リアルな型ヒント。エディタが引数を自動補完するのは、なんと、ただの関数シグネチャだからです。YAMLについて。素晴らしいフォーマットです。約11分間だけ。次に誰かが`if`が必要になり、文字列の中に`{% if %}`が入って、リストの中にマップの中に入ります。誰かがノルウェーの国コードとして`no`を入力すると、`False`として本番環境に出荷されます。誰かがタブでインデントすると、パーサーがどこで死んだのかも言わずに終了します。おめでとう、プログラミング言語を再発明しました。下手に。正直なところ、コードが欲しかったと認めて、コードを書くのが正しい選択です。PyInfraはその11分間をスキップして、すぐにコードに入ります。リリースノートはリンクにあります。質問があれば喜んでお答えします。インフラはコードとして、YAMLとしてではありません。
ちょっとお知らせだけど、ここでのコメントがフラグされてたよ。多分、何人かの人が君の(現在の)書き方をLLMっぽいと思ったんじゃないかな。
そうなんだよね。でも、Claude CodeやCodexがこのAnsibleのことをやってるから、全然問題ないし、参考にできる例もたくさんあるんだよね。パターンが確立されると、かなりスムーズになるし。Opus 4.5の時が大きな転機だったな。夏中ずっと自動化にハマってた。Opus 4.0の時は、もう歯を抜くみたいに大変だったけど、4.5が出た時は本当に素晴らしかった。
問題は、実際には「普通のif文」と分岐しただけのPythonじゃないってことだね。https://docs.pyinfra.com/en/3.x/deploy-process.html#checking...
これありがとう!過去25年間に自分なりのバージョンを何度も実装してきたから、これがいつも自分のコードの見た目だった。Salt、CFEngine、Chef、Puppet、Make、Bash、そしてこのアプローチの手作りのバージョンをたくさん使ってきた。ついに諦めて、Ansibleの quirksに向き合うことにしたんだ。コミュニティのサポートが必要だったからね。今はAIツールがあるから、コミュニティモジュールの堀が本当に堀なのか疑問に思ってる。自分のAnsibleコードをこれに移植することを真剣に考えてみるつもり。変化の後はもっと幸せになれると思う。コミュニティモジュールとの統合や構築の計画はある?例えば、完璧じゃなくても、PyInfraからAnsibleやSaltのモジュールを呼び出せるようになれば、ギャップを埋める一つの方法になると思う。
> Infrastructure as Code, not infrastructure as YAML. その通りだね。プログラミング言語や環境が、次に何をタイプするかを正確に予測できるのに、何十年もかけてきたのがすごいと思う。表現力が豊かで、一貫性を保ちながら直感的で、人間にとって理解しやすいものがあって、無限のライブラリや世界とつながる方法があるのに、そんな複雑なインフラを構成するために何を使ってるんだろう?また別のマークアップ言語だよ!
これ、自分でも試してみるべきだけど、実は自分でも作ったんだ。https://github.com/mattbillenstein/salty Saltstackの精神で、Makoテンプレートを含むフルPythonで作ったよ。主に冪等なファイル管理とシェルコマンドを使って、サービスを再起動するようなことをするための非常にシンプルなオペレーターのセットがある。これで、10秒未満で少数のマシンに小さな変更を素早くデプロイできるんだ。
誰かこれとAnsibleを使ったことがあって、好きなところと嫌いなところを簡単に比較してくれませんか?
前の職場では、CI/CDパイプラインの一部としてAWS AMIを作成するために、moleculeを使ってAnsibleのプレイブックをテストしていました。うまくいって、UNIX系のことをテストするにはテストキッチンよりも扱いやすかったです(サービスが実行中かどうか、ファイルの権限が正しいか、ファイルに$TEXTが含まれているかなど)。大きなLinuxのアップグレード、例えばUbuntuがupstartからsystemdに移行するときにとても役立ちました。また、壊れやすい結果を持つエッジケースを捉えるのにも良いです(特にAnsibleがRed Hatの買収後に大きな変更を経たとき)。嫌いなところは?pyenvと少し格闘しなければならなかったことです。
自宅のラボ用にAnsibleからPyinfraに切り替え、仕事ではAnsibleを使い続けています。一番の違いは、Pyinfraが単純にPythonコードであることです。必要な方法でシステムを制御するのがとても簡単です。Ansibleでも同じことができると思いますが、どうやってやるのかがあまり明確ではないことが多いです。これにより、Pyinfraでは物事がどのように、なぜそのように機能するのかがはっきりしている一方で、Ansibleでは多くのロールファイルを掘り下げて、どこで変数が注入されているのかを探さなければならなくなります。
PyinfraはAnsibleがあるべき姿です。YAML、テンプレート、そして無理やり組み込まれた制御フローのプリミティブの混ざったものではなく、ストレートなPythonです。
簡単なログ収集装置(Elasticsearch + ダッシュボード + その他のツールみたいな)を作るためにAnsibleを使ったけど、YAML内のPythonコードスニペットを扱うのがすごく難しかった。Pyinfraに切り替えたら、まるで別世界だったよ。Pythonコードを書けば、関数やクラスに整理できて、好きなようにインスタンス化できる。再利用可能な設定ができるし、botoを呼び出してターゲットサーバーのリストを取得したり、タグでフィルタリングしたりもできる。制限は全くなくて、DSL(またはYAML)じゃなくて、本物のPythonだからね。
Ansibleには、AWS Lambdaのようなクラウドリソースを扱うモジュールも含まれてるよ。
前にAnsibleを試したけど、嫌いだった。このアイデアは天才的だね。
PyInfraをしばらく使っていて、簡単な自動化(システムの更新、特定の統計のチェック)に使っていますが、大ファンです。Ansibleと比べて、ドキュメントや構文、使い方のパターンがずっと扱いやすいと感じました。好みの問題かもしれませんが、Ansibleのドキュメントを読むのはいつも苦労していました。バグにも遭遇しましたが、あるマシンがエラーを引き起こして再起動時に出力が乱れることがあったけど、どうやらこのリリースで対処されたみたいです。もし役に立つなら、最初にPyInfraを探ったときに作った動画があります: https://www.youtube.com/watch?v=S-_0RiFnKEs
うまくいってよかったね。AnsibleとPyInfraのドキュメントのギャップは、好みの問題じゃないんだ。YAMLにJinja、さらにカスタムDSLを使うのは、タイプヒント付きの普通のPythonよりも脳の負担が大きいからさ。ソースをgrepして普通のコードみたいに読めるようになると、戻るのが辛く感じるよね。再起動バグについてだけど、もし再発したら、OSやコネクタ(ssh/local/docker)、生の出力を含むGitHubの問題を立てるとすごく助かると思う。3.x系では接続処理や出力バッファリングがかなり整理されたから、もう修正されてる可能性もあるよ。動画ありがとう、見てみるね。ハンズオンのイントロコンテンツは、プロジェクトにもっと必要なものだよ。
Ansibleを何年も使ってきたけど、Pyinfraは似たような概念があるのでとても親しみやすいです。インベントリや、files.put、server.shellのような一般的な操作があって、今のところすごく気に入っていますし、かなり速いです。
これ、2000-2005年のノーテルのコマンドコンソールを思い出す!僕はノーテルのパスポートデバイスがたくさんある通信会社で働いてたんだ(フレームリレーって知ってる人いる?)。ノーテルからシスコにネットワークを切り替え始めたんだけど、シスコはtelnet(後にSSH)を使ってたのに、ノーテルの人たちは切り替えたがらなかったんだ。ノーテルのネットワーク管理システム(ノーテルNMS)にはすごく面白い機能があって、コマンドコンソールを開いてパスポートデバイスに接続できたり、デバイスグループ(または全ネットワーク)に接続して同じコマンドを全デバイスで実行できたりしたんだ。これでネットワーク内の各デバイスのバージョンを監査したり、アクセスリストを一括で変更したりするのに便利だったよ。
大学でフレームリレーとかの講義は受けたけど、実際に触ったことは一度もないよ(:
https://testinfra.readthedocs.io/en/latest/に適応し始めたんだけど、検証側から見るとスタイルが似てるね。他の会社でSalt、Ansible、Chefを使ったことがあるけど、これらのツールと比べてUXの観点からもすごく良さそうだよ。
PyInfraがまだアクティブに開発されてるのを見て嬉しいよ。今はPyInfraを使ってないけど、以前は約100台のMac Proを管理するために使ってた。これらのマシンは以前はChefで部分的に管理されてたけど、あまり効果がなかったんだ。PyInfraはその仕事にぴったりのツールだと思ったよ。必要な操作があまりなかったけど、macOS管理タスクに特化した新しい操作を書くのは簡単だった。最近、Packerと組み合わせてEC2 Mac AMIを作るために再度見てみたけど、今回はpydoitにしたんだ。
Pyinfraのクリエイターです。みんなの優しい言葉、本当にありがとう!自分や他のメンテナンスチームにとってすごく意味があるよ。みんなの愛を感じてる。
本当に欲しいのは、Ansibleかこれみたいなもので、 - 不必要にネットワーク越しにコードを送らないこと。 - 何らかの「実行最適化ツール」があること。例えば、データベースのクエリプランナー/オプティマイザーみたいな感じ。良い例としては、pandasの動きとは違って、polarsフレームワークのクエリプランナーがある。もしforループを使って、各ループのイテレーションで同じディレクトリにファイルをコピーするなら、オプティマイザーがそれをキャッチして、一つの圧縮されたtarファイルを送るべきだと思う。