chezmoiでdotfilesを管理する
コンピュータの初期セットアップって面倒ですよね。この手間を省くためにdotfilesを使ってる方も多いのではないでしょうか。dotfilesと言っても管理方法は人それぞれで、ツールを使ってる方もいれば自分なりのやり方で実践してる人もいるかと思います。私はalias dotfiles='git --git-dir ~/.dotfiles --work-tree ~'
をSHELLの設定に入れているので、dotfiles add /path/to/file
、dotfiles commit -m 'update' -a
みたいなのでちまちま管理しています。
これでも十分といえば十分なのですが、設定ファイルってプレーンテキストなのでGitHubなどにコミットするには少し慎重になりますよね。機密情報が載ってないかなど心配になります。
そこで今回は安全にdotfilesを管理できるchezmoiを紹介します。
chezmoi
dotfilesを安全に管理するためのツールです。マルチプラットフォームに対応しているため、Linux、macOS、Windowsどこでも同じように管理できます。
執筆時点ではGitHub Topicsの「#dotfiles-manager」で1番人気でした。
インストール
公式ドキュメントのInstallを参考にしてください。
私の環境はMacなのでbrew install chezmoi
しました。
管理してみる
$ chezmoi init
初回は「init」サブコマンドでdotfilesを管理するためのリポジトリを作成します。
引数なしで実行した場合は~/.local/share/chezmoi
にローカルリポジトリが作成されます。
既にリモートリポジトリを持っている場合はinitの後ろにリモートリポジトリのURLを指定します。すると~/.local/share/chezmoi
にリポジトリがクローンされます。
$ chezmoi init git@github.com:/dotfiles.git
またはURLを省略してGitHubのユーザー名を指定するだけでもクローンできます。
$ chezmoi init
この場合https://github.com/<github-username>/dotfiles
リポジトリがクローンされます。SSHのURLでクローンしたい場合は--ssh
オプションをつけましょう。
リポジトリ名がdotfilesではない場合は<github-username>/<repo-name>
で指定します。
$ chezmoi add
ファイルをchezmoiの管理対象に加えます。
例えば~/.bashrc
を管理対象にする場合は下記の通りです。
$ chezmoi add ~/.bashrc
こうすることで~/.local/share/chezmoi/dot_bashrc
というファイルが作られます。
このファイルをホームディレクトリにコピーすることで設定を反映します。
では機密情報が含まれたファイルがaddされたらどうなるでしょうか。
$ chezmoi add ~/.aws/credentials
すると・・・
{“level”:“trace”,“time”:“2024-12-18T12:02:56+09:00”,“message”:“skipping generic-api-key finding (aws_access_key_id = REDACTED), aws-access-token rule takes precedence (REDACTED)”} chezmoi: /Users/ttanaka/.aws/credentials:2: Identified a pattern that may indicate AWS credentials, risking unauthorized cloud resource access and data breaches on AWS platforms.
AWSの認証情報っぽいよ?と言われました。確かにこのファイルにはAWSの認証情報が入っています。
リポジトリにファイルが作られてしまっているので、これをこのままにしておくのは危険です。削除しておきましょう。削除のサブコマンドはforget
です。
$ chezmoi forget ~/.aws/credentials Remove /Users/ttanaka/.local/share/chezmoi/private_dot_aws/private_credentials? yes/no/all/quit
y
を入力と~/.aws/credentials
はリポジトリから削除されます。
chezmoiはファイルの暗号化にも対応しています。暗号化ツールはageとgpgに対応しています。
Linuxから使うならgpgの方が楽かもしれませんが、今回はセットアップが簡単なageを使ってみます。
インストールはREADMEのInstallationを参考にしてください。
chezmoiからageを使う方法はこちら で詳しく説明されています。
やることだけ簡単に説明すると
- ageでキーを発行
- chezmoi.tomlでキーを指定する
実際の設定は下記の通り
$ age-keygen -o ~/.chezmoi-encrypt-key.txt Public key:
$ install -Ddm0700 ~/.config/chezmoi $ cat «EOF > ~/.config/chezmoi/chezmoi.toml encryption = “age” [age] identity = “/home/user/.chezmoi-encrypt-key.txt” recipient = “” EOF
暗号化鍵を~/.chezmoi-encrypt-key.txt
と指定しましたが、これは好きなものに変更しても大丈夫です。
ここまでエラーが出なければ設定は完了です。chezmoiのリポジトリにファイルを追加する時に--encrypt
オプションを使用するとファイルを暗号化できます。
$ chezmoi add ~/.zshrc –encrypt
追加できました。暗号化されているか確認してみます。
$ ls ~/.local/share/chezmoi
encrypted_dot_zshrc.age
$ cat ~/.local/share/chezmoi/encrypted_dot_zshrc.age —–BEGIN AGE ENCRYPTED FILE—– … —–END AGE ENCRYPTED FILE—–
暗号化されてそうです。今回追加されたファイルはdot_
プレフィックスではなくencrypted_dot_
プレフィックスになっています。また、拡張が.age
になっているのでageで暗号化されたことがわかります。これでリモートリポジトリと同期するのも安心ですね。
鍵をなくすと復号化できなくなってしまうので、間違って削除しないように注意してください。バックアップをとっておいてもいいかもしれません。
$ chezmoi edit
設定ファイルを修正するにはeditコマンドを使用しようします。
$ chezmoi edit ~/.zshrc
編集が完了したら差分を見てみましょう。chezmoi diff
コマンドを実行します。
$ chezmoi diff
diff –git a/.zshrc b/.zshrc
index 219edb84090d0aa6d97a6006ada84585cb44387f..377ef1576345655bbd791678cbcf0236e222db54 100644
— a/.zshrc
+++ b/.zshrc
@@ -5,7 +5,7 @@ zmodload zsh/zprof; zprof
fi
HISTFILE=~/.zsh_history -HISTSIZE=10000 +HISTSIZE=100000 SAVEHIST=0
typeset -U PATH path
今回はHISTSIZEを1桁増やしたので、これであっています。
ではホームディレクトリのファイルがどうなったのか確認します。
$ grep ‘^HISTSIZE’ ~/.zshrc HISTSIZE=10000
おかしいですね。HISTSIZEの桁が変わっていません。それもそのはず、editコマンドはchezmoiリポジトリのファイルを修正するコマンドです。編集後、即座に反映したい場合はeditコマンドに--apply
オプションを指定します。
$ chezmoi apply
変更したファイルをホームディレクトリに反映します。
$ chezmoi apply
これで全ての変更をホームディレクトリに反映できます。
$ grep ‘^HISTSIZE’ ~/.zshrc HISTSIZE=100000
一部のファイルを反映したい場合はapplyコマンドにファイルを指定します。
$ chezmoi apply ~/.zshrc
$ chezmoi git
ここまでではリポジトリにファイルが作成されただけで、git addもgit commitもされていません。このままではリモートリポジトリとも同期できないので、gitで管理していきます。リポジトリに簡単に移動するにはchezmoi cd
コマンドを実行してください。リポジトリに簡単に移動できます。
$ chezmoi git add .
$ chezmoi git status On branch main
No commits yet
Changes to be committed: (use “git rm –cached …” to unstage) new file: encrypted_dot_zshrc.age
Untracked files not listed (use -u option to show untracked files)
$ chezmoi git – commit -m ‘add encrypted zshrc’ encrypted_dot_zshrc.age [main (root-commit) 94f804f] add encrypted zshrc 1 file changed, 137 insertions(+) create mode 100644 encrypted_dot_zshrc.age
$ chezmoi git log commit 94f804f162b695b7be788b159b382ab98fb502ac Author: 田中智明 ttanaka@virtualtech.jp Date: Wed Dec 18 14:27:08 2024 +0900
add encrypted zshrc
chezmoi git commit
だけgitとcommitの間に–をつけました。これはcommitのオプションがchezmoiに取られないように、gitサブコマンドの後ろに--
をつけて、これ以上のオプションのパースを停止します。gitのサブコマンドでオプションを指定する場合には必要な対応です。
ここまでできれば後はpushすることでリモートリポジトリと同期できます。
$ chezmoi update
リモートリポジトリと同期している場合は、リモートリポジトリの方が新しくなってる場合があります。他のマシンからコミットした場合ですね。そういう場合はchezmoi update
コマンドでローカルのリポジトリを更新します。このままではまだホームディレクトリに反映されていないので、updateコマンドを実行する時に--apply
オプションをつけておくか、別途chezmoi apply
コマンドを実行してください。
まとめ
今回は簡単にchezmoiを紹介しました。私はまだそこまで深く触っていないのでよくわかっていませんが、公式のユーザーガイドを見ているとなかなか興味深い機能が紹介されていました。かなり便利なのかもしれません。