/etc配下のファイルもmise.tomlで管理したい

【mise】mise bootstrapで開発機のセットアップを宣言的に管理する で紹介したmise bootstrapのうち、/etc配下の設定ファイルやディレクトリの配置だけを担当するのがmise bootstrap filesである。[bootstrap.files][bootstrap.directories]に書いた内容を、実際のファイルシステムの状態に反映する。

このコマンドはroot権限でシステムのファイルを直接書き換えるため、検証はDockerの使い捨てコンテナで行った。

基本: contentでファイルを作成する

contentにファイルの中身を書くと、指定したパスにそのままファイルが作成される。

[bootstrap.files]
"/etc/motd" = { content = "Welcome!\n" }
$ mise bootstrap files apply -y
mise system files: applied 1 change(s)

mode/owner/groupでパーミッションと所有者を指定する

modeでパーミッション、owner/groupで所有ユーザー・グループを指定できる。

[bootstrap.files]
"/etc/motd" = { content = "Welcome!\n", mode = "0644", owner = "root", group = "root" }

指定しなかった場合、パーミッションはファイルが0644、ディレクトリが0755という固定値になり、所有者はrootになる。umaskの設定には影響されない。

sourceで既存ファイルからコピーする

contentの代わりにsourceを指定すると、既存のファイルパスからコピーして配置できる。

[bootstrap.files]
"/etc/myapp.conf" = { source = "./config/production.conf" }

contentsourceはどちらか一方が必須で、どちらも指定しない場合はpresent files require source or contentというエラーになる。また、配置先の親ディレクトリが存在しない場合は自動作成されずmanaged file parent does not existというエラーになるため、/etc/myapp/config.ymlのように既存ディレクトリの配下にないパスを指定する場合は、次のセクションで紹介する[bootstrap.directories]にも親ディレクトリを追加しておく必要がある。

ディレクトリも同様に作成できる

[bootstrap.directories]で、ディレクトリの作成とパーミッションを管理できる。

[bootstrap.directories]
"/opt/myapp" = { mode = "0755" }

stateでファイルを削除する

state = "absent"を指定すると、そのファイルが存在する場合に削除する。

[bootstrap.files]
"/etc/legacy-config.conf" = { state = "absent" }

過去に配置した設定ファイルが不要になった場合、mise.tomlからエントリを消すだけでなくstate = "absent"を指定することで、実際のファイルシステムからも削除できる。

mise bootstrap files statusで状態を確認する

mise bootstrap files statusで、[bootstrap.files]/[bootstrap.directories]の各項目が現在どういう状態かを確認できる。

$ mise bootstrap files status
create  directory:/opt/myapp  absent  directory mode 0755  /work/project/mise.toml
create  file:/etc/motd        absent  file mode 0644       /work/project/mise.toml

applyを実行した後に確認すると、状態がunchangedに変わる。

$ mise bootstrap files status
unchanged  directory:/opt/myapp  directory mode 0755 uid 0 gid 0  directory mode 0755  /work/project/mise.toml
unchanged  file:/etc/motd        file mode 0644 uid 0 gid 0       file mode 0644       /work/project/mise.toml

–dry-runでプレビューする

mise bootstrap files apply --dry-runで、実際には変更せず何が起こるかだけを表示できる。

$ mise bootstrap files apply --dry-run
would create directory /opt/myapp
would write file /etc/motd

実際にrootでファイルシステムを変更する前に、意図した変更内容になっているか確認できる。