My RSS Reader

Description about Blog Author


chezmoiでdotfilesを管理する

コンピュータの初期セットアップって面倒ですよね。この手間を省くためにdotfilesを使ってる方も多いのではないでしょうか。dotfilesと言っても管理方法は人それぞれで、ツールを使ってる方もいれば自分なりのやり方で実践してる人もいるかと思います。私はalias dotfiles='git --git-dir ~/.dotfiles --work-tree ~'をSHELLの設定に入れているので、dotfiles add /path/to/filedotfiles commit -m 'update' -aみたいなのでちまちま管理しています。

これでも十分といえば十分なのですが、設定ファイルってプレーンテキストなのでGitHubなどにコミットするには少し慎重になりますよね。機密情報が載ってないかなど心配になります。

そこで今回は安全にdotfilesを管理できるchezmoiを紹介します。

chezmoi

www.chezmoi.io

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を使う方法はこちら で詳しく説明されています。

やることだけ簡単に説明すると

  1. ageでキーを発行
  2. 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を紹介しました。私はまだそこまで深く触っていないのでよくわかっていませんが、公式のユーザーガイドを見ているとなかなか興味深い機能が紹介されていました。かなり便利なのかもしれません。

[source]