こんにちは。ダタク @iQeeeda です。
複数のマシンを使っていると、.zshrc や .gitconfig がだんだんバラバラになっていきます。
僕は Mac 2 台と Linux サーバを行き来するので、この「環境ごとに設定が違う」問題がずっと地味なストレスでした。
これを解決してくれたのが chezmoi という dotfiles マネージャです。
今は 1 つのリポジトリで全マシンの設定が一致しています。快適です。
で、あるとき思いました。
「/etc とか、ホームの外にある設定ファイルはどうするの?」と。
結論: chezmoi はホーム専用ツール
先に結論です。
- chezmoi は dotfiles(ホーム配下の設定ファイル)を Git で管理するツール
- ただし守備範囲は ホームディレクトリ専用。公式が「システム構成管理ツールではない」と明言している
/etcなどホーム外はrun_スクリプトで symlink やコピーして橋渡しする (sudoで権限昇格)- 本気でシステム全体を管理するなら Ansible などの構成管理ツールが適任 (chezmoi から呼び出せる)
今回は「chezmoi の基本」と「ホーム外のファイルをどう扱うか」を解説します。
まず基本から、そのあと本題のホーム外の話に進みます。
chezmoi とは
chezmoi は、.zshrc のような dotfiles を 1 つの Git リポジトリで管理するためのツールです。
読み方は「シェムワ」。フランス語の「chez moi (我が家)」から来ています。
似たことは symlink を手で張っても実現できます。
chezmoi が便利なのは、そこに テンプレート機能が乗っていることです。
たとえば「会社の Mac では git のメールアドレスを変える」みたいなマシンごとの差分を、1 つのソースから出し分けられます。
symlink 運用だと詰まりがちなこの部分を、きれいに吸収してくれます。
chezmoi の基本的な使い方
使い方はシンプルです。
まず管理を始めて、既存のファイルを取り込みます。
# 管理を始める(ソースは ~/.local/share/chezmoi に作られる)
chezmoi init
# 今ある設定ファイルを chezmoi の管理下に取り込む
chezmoi add ~/.zshrc chezmoi add した .zshrc は、ソース側では dot_zshrc という名前で保存されます。
あとは編集して、差分を確認してから反映するだけです。
# ソース側を編集する
chezmoi edit ~/.zshrc
# 差分を確認してからホームに反映する
chezmoi diff
chezmoi apply ソースは普通の Git リポジトリなので、chezmoi cd で移動して git commit & push しておきます。
別のマシンでは、これを一発で展開できます。
# GitHub の dotfiles リポジトリから一発で展開する
chezmoi init --apply [GitHub ユーザ名] 新しい Mac を触りはじめるとき、この 1 行で環境が再現できるのはちょっと感動します。
chezmoi が対象にしないもの
ここからが本題です。/etc のような、ホームの外にある設定ファイルは chezmoi で管理できるのか。
まず公式ドキュメントのスタンスがはっきりしています。
chezmoi は「ホームディレクトリを対象に設計されていて、フルのシステム構成管理ツールではない」と明言しています。
公式 FAQ の答えも「技術的にはできる。ただし強く非推奨」でした。
理由はシンプルで、chezmoi の宛先 (destination) がデフォルトで $HOME だからです。~ の下の世界に最適化された道具、というわけですね。
run_ スクリプトでホーム外に橋渡しする
とはいえ、どうしてもホーム外を触りたい場面はあります。
そのための逃げ道が run_ スクリプトです。
run_ で始まるスクリプトは chezmoi apply のたびに実行されます。
これを使って、ホーム外へ次のように受け渡します。
- ホームで管理しているファイルから、システム側へ symlink を張る
- ホームのファイルを
/etcなどへコピーする chezmoi execute-templateの出力を、権限を上げて別の場所へ書き出す
権限が要る操作には sudo を挟みます。
たとえば、こんな 1 枚のスクリプトです。
# chezmoi のソースで管理している設定を /etc に配る
sudo cp "$(chezmoi source-path)/etc/myservice.conf" /etc/myservice.conf ※ 宛先そのものを変えたいときは、グローバルフラグ --destination (短縮 -D) や設定の destDir を使う手もあります。ただしこれはホーム外運用というより、テスト用に別ディレクトリへ apply したいときに使うのが自然だと思います。
/etc を本気で管理するなら別ツール
ここまで書いておいてなんですが。/etc を継続的にバージョン管理したいなら、最初からそれ専用の道具を使うほうが理にかなっています。
- etckeeper —
/etcを git で追跡する定番ツール - Ansible / Chef / Puppet などの構成管理ツール (chezmoi の
run_から呼び出すこともできる)
chezmoi の流儀のまま root 所有のファイルを触りたい人向けには、 chezetc という拡張もあります。
外部のファイルを取り込むだけなら .chezmoiexternal も便利です。
リモートのファイルやアーカイブを、ソースの一部のように扱えます。
ツールには向き不向きがあります。
chezmoi はホームを気持ちよく揃えるための道具で、/etc はあくまでおまけ。
そこを割り切ると、構成はだいぶスッキリします。
まだコメントはありません