<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Podman on 万屋猫Labs</title><link>https://yn-labs.com/tags/podman/</link><description>Recent content in Podman on 万屋猫Labs</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 15 Jun 2026 10:00:00 +0900</lastBuildDate><atom:link href="https://yn-labs.com/tags/podman/index.xml" rel="self" type="application/rss+xml"/><item><title>homelab を Ansible でコード化する — fail-closed な多層防御インフラ</title><link>https://yn-labs.com/posts/ansible-homelab-iac/</link><pubDate>Mon, 15 Jun 2026 10:00:00 +0900</pubDate><guid>https://yn-labs.com/posts/ansible-homelab-iac/</guid><description>&lt;h2 id="自宅サーバを丸ごとコードにした話"&gt;自宅サーバを丸ごとコードにした話&lt;/h2&gt;
&lt;p&gt;自宅サーバ（homelab）で AI エージェント基盤を動かすために、コンテナランタイム、ネットワーク分離、暗号化DNS、カーネル緩和、監査ログまで一通り手で組んだ。動くには動いたのだが、ひとつ不安が残った。OS を入れ直したとき、同じものをもう一度作れる自信が無かったのだ。どこをどう直したか、どのセキュリティ設定を入れ忘れているか、結局は頭の中にしか無い。&lt;/p&gt;
&lt;p&gt;それで、構築手順そのものを Ansible に落とした。最終的に9ロール・約3,900行になった。手順をコードにしただけではなくて、「危険な設定なら構築を止める」ところまで踏み込んでいる。空の許可リストや古い Podman で進もうとすると、playbook が走り出す前に &lt;code&gt;assert&lt;/code&gt; が落とす。&lt;/p&gt;
&lt;p&gt;この記事では、その構成（rootless Podman + Quadlet による多層防御 homelab）を抜粋して紹介する。実環境のホスト名・IP・ユーザ名・トークン・コンポーネント名のたぐいは伏せるか一般化し、コードも要点を示す抜粋にしてある。固有名が絡むところは変数名やファイル名を一般化し、汎用的で機微に関わらないところは実物に近い形で残した。&lt;/p&gt;
&lt;h3 id="数字で見た中身"&gt;数字で見た中身&lt;/h3&gt;
&lt;p&gt;実環境の中身は出せないので、代わりにコードの規模で示す。以下はこの Ansible 構成を実測した値だ。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指標&lt;/th&gt;
 &lt;th&gt;値&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Ansible ロール数&lt;/td&gt;
 &lt;td&gt;9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;roles/*/tasks/main.yml&lt;/code&gt; 総行数&lt;/td&gt;
 &lt;td&gt;3,898&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;fail-closed な &lt;code&gt;assert&lt;/code&gt; 箇所&lt;/td&gt;
 &lt;td&gt;13&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;分離ネットワーク（内部用 / 外部egress用）&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Quadlet コンテナユニット&lt;/td&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="全体構成"&gt;全体構成&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────┐ ansible-playbook ┌──────────────────────────────┐
│ 司令ホスト │ ───── over SSH ─────▶ │ 本番ホスト (target) │
│ (operator) │ apply --tags … │ │
└─────────────┘ │ ┌────────────────────────┐ │
 │ │ bootstrap: OS/pkg/UFW │ │
 │ │ /DoT/helpers │ │
 │ ├────────────────────────┤ │
 │ │ podman 5.x rootless │ │
 │ │ + cgroup v2 + Quadlet │ │
 │ ├──────────┬─────────────┤ │
 internal-net ◀─────────────────────┼──│ policy / │ notification │ │
 （サービス間） │ │ LLM 系 │ / relay │ │
 外部 API ◀──────────────────────────┼──│ gateway │ │ │
 │ ├──────────┴─────────────┤ │
 │ │ audit: ログ収集+署名付死活 │ │
 │ └────────────────────────┘ │
 └──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;役割は9つのロールに分けている（名前は一般化したもの）。&lt;/p&gt;</description></item></channel></rss>