file
目的: 通常ファイルが目的の内容・所有者・モードで存在すること、 または存在しないことを保証する。
- id: motd type: file with: path: /etc/motd content: "managed by sinter\n" mode: "0644" owner: root group: root| パラメータ | 必須 | 型 | デフォルト | 説明 |
|---|---|---|---|---|
path |
はい | string(絶対パス) | — | 管理対象ファイルのパス。 |
state |
いいえ | string | present |
present または absent。 |
content |
いいえ | string、または { secret: <path> } |
— | リテラルな内容、または暗号化されたシークレット(sinter secrets を参照)。source とは排他。 |
source |
いいえ | string | — | path にコピーするコントローラ側ファイル。相対パスはレシピファイルのディレクトリから解決されます。content とは排他。 |
owner |
いいえ | string | — | 所有者名。 |
group |
いいえ | string | — | グループ名。 |
mode |
いいえ | string | — | 引用符付きの 4 桁 8 進数。例: "0644"。 |
期待される動作
Section titled “期待される動作”present: ファイルを作成または更新します。内容は rename によって アトミックに公開されます。owner/group/modeが省略された 場合、既存のメタデータは保持されます。absent: 対象が通常ファイルであれば削除します。他のオブジェクト種別 (ディレクトリ、シンボリックリンク、デバイス)をファイルとして 削除することは拒否されます。- 親ディレクトリはあらかじめ存在し、信頼境界チェックを通過する必要が あります。パス中の予期しないシンボリックリンクは拒否されます。
- ファイルが systemd マネージャの入力(ユニットファイル、drop-in、
alias/mask/
.wants/.requiresリンク、system.conf)を実際に変更すると、 それを必要とする次のサービスまたはハンドラの前、および成功した apply の 最後に、Sinter がsystemctl daemon-reloadを自動的に実行します。 serviceを参照して ください。
シークレットの内容
Section titled “シークレットの内容”- id: api_key type: file with: path: /etc/app/api.key content: { secret: secrets/api.key.age } owner: root group: rootファイルのバイト列は、レシピのテキストではなく、リポジトリ内の暗号化された
age ファイルから取られます。ファイルは
sinter secrets encrypt で作ります。要点は次のとおりです。
完全な契約(identity の探索、パスフレーズ、制限)は
sinter secrets にあります。
- 参照。 その参照を含むレシピファイルのディレクトリ(include されたレシピならそのレシピ
自身のディレクトリ)を基準とする、静的な相対パスで、作業ディレクトリは基準に
なりません。拒否されるもの: 絶対パス、
.・..・空の要素、バックスラッシュ、制御文字、{{ }}補間、そのディレクトリ以下のシンボリックリンク、通常ファイルではない対象、厳密に{ secret: <path> }ではない値。contentとsourceは引き続き排他です。参照を 受け付けるのはfile.contentとuser.password_hashだけです。 validateは、参照と、ファイルが正しい age ファイルであることだけを確認します。 復号はせず、鍵も要りません。plan、apply、auditはシークレットをメモリ上で復号し、ターゲットと SHA-256 で 比較し、正確なバイト列として公開します(バイナリ、NUL バイト、末尾改行がない 状態も保たれます。最大 16 MiB)。コントローラ上に平文の一時ファイルは作られず、 内容はコマンドラインではなく標準入力でターゲットに届きます。- 常に sensitive です(
sensitive:の指定に関わらず)。内容の diff は伏せられ、診断も 伏せられ、新規ファイルの既定モードは0600です(既存ファイルは、宣言しない限り メタデータを保持します)。 - 鍵がなければ変更しない(フェイルクローズ)。 identity が使えない(または
パスフレーズを入力できない)場合、
planは失敗し(終了コード 4)、applyはそのリソースを 失敗させて実行を止め、apply が部分的なファイルを書くことはありません。auditは ターゲットにファイルが存在すればERROR、なければDRIFTを報告します。state: absentは鍵を必要としません。原因は 標準エラーに 1 度だけ出力され、レポート自体は伏せられたままです。何かが変わる前に 鍵の不在を知るため、先にplanを実行してください。 - 制限。 1 つのシークレットは 16 MiB まで。書き込みは 300 秒のコマンド期限内に完了する 必要があります(制限を参照)。MCP のマニフェスト系ツールは シークレット参照を拒否します(Core MCP を参照)。
完全に冪等です — すでに一致している content、mode、所有者に対して 変更は行われません。
失敗時の動作
Section titled “失敗時の動作”- 安全でない親パスや予期しないシンボリックリンク → 変更前に失敗。
- Sinter が保持できない非対応のセキュリティメタデータ(ACL/xattr/ SELinux コンテキスト)は、暗黙の喪失ではなく拒否となります。
- diff 出力は内容の変更を表示しますが、リソースまたは内容が
sensitive の場合は
redactedと表示されます。 - 鍵が使えない
content: { secret: … }は、変更前に失敗します (シークレットの内容を参照)。
プラットフォームに関する補足
Section titled “プラットフォームに関する補足”すべての対応ターゲットに適用されます。/tmp のような誰でも書き込める
ディレクトリ配下のパスは信頼境界チェックで失敗します。