chezmoi で dotfiles を手軽に柔軟にセキュアに管理する
dotfiles マネージャの chezmoi についてまとめました。
個人的にかなり便利だと思います。
chezmoiとは?
chezmoi は、.vimrc
や、.zshrc
などの dotfiles の管理を効率的に実現するためのツールです。
- シンボリックリンク不要でコマンド 1 つで環境を再現出来る
- template 構文で変数の展開や処理の分岐を書くことで各環境の差分を 1 ファイルで管理できる
- 1password などのパスワードマネージャとの併用でセキュアにファイル管理ができる
という特徴があります。
特に 2 と 3 は通常のシンボリックリンクでの dotfiles 管理だと Shell Scriptをかなり頑張らないと出来ない部分ですが、chezmoi なら手軽に実現できます。
基本操作
イントール
Homebrew でインストール出来ます。
$ brew install chezmoi
chezmoiプロジェクトの初期化
chezmoi で dotfile を管理するために chezmoi 用のプロジェクトディレクトリを作成します。
以下コマンドを実効するとデフォルトで~/.local/share/chezmoi
にディレクトリが作られます。ここが dotfiles の管理元となります。自動的にgit init
も行われます。
$ chezmoi init
dotfilesの追加
add
コマンドで管理対象としたい dotfiles を追加します。
以下コマンドを実効すると~/.local/share/chezmoi
配下にdot_vimrc
ファイルが作成されます。
$ chezmoi add .vimrc
dotfilesの編集
管理対象としたファイルはedit
コマンドで編集できます。
edit コマンドで管理対象のファイルのパスを指定すると~/.local/share/chezmoi
ディレクトリ内のファイルが編集できます。
※ この状態では、元ファイル(以下例だと~/vimrc
)には変更が反映されません。変更を反映するには次で説明するapply
が必要です。
$ chezmoi edit .vimrc
dotfiles変更の適応
dotfiles の変更の適応は、apply
コマンドで行います。
apply
を実効するとchezmoi edit ~/.vimrc
で加えた変更(~/.local/share/chezmoi/dot_vimrc
の変更)が~/.vimrc
に適応されます。
$ chezmoi apply
別PCへのdotfilesの移行
別 PC への dotfiles の移行は GitHub 経由で行います
そのためにまず chezmoi プロジェクトでの変更を commit しリモートリポジトリへ push します。
# chezmoiのプロジェクトへの移動
$ chezmoi cd
# 変更のcommit & push
$ git add .
$ git remote add origin git@github.com:kawamataryo/dotfiles.git
$ git push
そして別 PC にて chezmoi のプロジェクト初期化の際に GitHub のリポジトリを指定します
# 別PCでの操作
$ brew install chezmoi
$ chezmoi init git@github.com:kawamataryo/dotfiles.git
これで~/.local/share/chezmoi
配下に GitHub リポジトリ上のファイルが作成されます。
この状態でapply
コマンドを実行すれば適切なパスに dotfiles が作成されます。
$ chezmoi apply
template機能の利用
dotfiles を管理していると「この記述は個人環境だと必要だけど、職場の環境だと不要だなー」ということがあると思います。そんな要望も chezmoi の template 機能を使えば手軽に実現出来ます。
template 機能は、GO のtemplate記法を使って dotfiles 上に任意の条件分岐や変数の展開を組み込むものです。
template を使う場合は、chezmoi に管理に追加する際に--template
オプションを付与します。
$ chezmoi add --template ~/.zshrc
すでに chezmoi 管理の dotfiles に template 機能を追加する場合はchattr +template
を使います。
$ chezmoi chattr +template ~/.zshrc
これで chezmoi のディレクトリ配下にdot_zshrc.tmpl
というtmpl
拡張子がついたファイルが作成されます。このファイルは template 構文に対応しているので、任意の条件分岐や変数展開を記述できます。
例)PCのhostnameでの出力制御
例えば会社 PC の場合は、rbenv を利用するけど個人 PC では必要なかったとします。
その場合は以下のように.zshrc
ファイル内で PC の hostname を使って分岐できます。
# ...
{{ if (eq .chezmoi.hostname "work-pc") }}
# rbenv
export PATH=~/.rbenv/bin:$PATH
eval "$(rbenv init -)"
{{ end }}
# ...
この状態でchezmoi apply
すると、会社 PC の場合のみ rbenv の記述が.zshrc
に追加されます。
なお.chezmoi
変数から参照できる値は以下コマンドで確認できます。
linux の場合のみなど OS での分岐も可能です。
$ chezmoi data
{
"chezmoi": {
"arch": "amd64",
"fullHostname": "xxxx",
"group": "staff",
"homedir": "xxx",
"hostname": "xxx",
"os": "darwin",
"sourceDir": "xxx",
"username": "xxx"
}
}
1passwordを利用したセキュアな管理
ssh の秘密鍵などセキュアなファイルについても chezmoi と1password-cliなどの外部ツールを組み合わせることで管理できます。
以下 chezmoi と 1password-cli で ssh の秘密鍵を管理する例です。
1password-cli の環境構築は終了している前提で進めます。
1. 管理対象のファイルをtemplateとしてchezmoiに追加
ssh の秘密鍵を template としては chezmoi の管理対象に追加します。
この時点ではまだ chezmoi 上の.ssh/id_rsa.tmpl
に秘密鍵の生データが存在します。
$ chezmoi add --template .ssh/id_rsa
2. 1password-cliでファイルを保存する
秘密鍵を 1password の管理対象に追加します。
その際に戻り値として得られる uuid をメモします。
# 1password-cliにログイン
$ eval $(op my.1password.com メールアドレス)
### 秘密鍵を1passwordの管理対象に追加
$ op create document ~/.ssh/id_rsa --tags chezmoi --title .ssh/id_rsa
{"uuid":"ti2adie9Aixaidae4dahpoh5io","createdAt":"2021-02-01T17:53:49.596484+02:00","updatedAt":"2021-02-01T17:53:49.596484+02:00","vaultUuid":"eith2iequievuthae9Eedaiboh"} # 出力はダミーです
3. chezmoi管理のtemplateファイルを書き換える
先程取得した uuid を使って、chezmoi 管理の.ssh/id_rsa.tmpl
の内容を全て書き換えます。
$ chezmoi edit .ssh/id_rsa
{{- onepasswordDocument "ti2adie9Aixaidae4dahpoh5io" -}}
これで完了です。
この状態で Git 管理して、新しい PC でchezmoi update
& chezmoi apply
すれば 1password からセキュアに対象ファイルを復元できます。
※ その際は新しい PC でも eval $(op my.1password.com メールアドレス)
を行い 1password-cli にログインしておく必要があります。
終わりに
以上「chezmoi で dotfiles を手軽に柔軟にセキュアに管理する」でした。
chezmoi にはここで紹介した機能以外にも便利な機能があります。是非ドキュメントを読んでみてください。
実際に chezmoi を使っている私の dotfiles はこちらです。今後も chezmoi を使って dotfiles を育てていきたいです。
Discussion
こちらのコマンドは
op document create <args>
の順だとうまくいきました