🏠

chezmoi で dotfiles を手軽に柔軟にセキュアに管理する

2021/02/17に公開

dotfiles マネージャの chezmoi についてまとめました。
個人的にかなり便利だと思います。

chezmoiとは?

chezmoi は、.vimrc や、.zshrc などの dotfiles の管理を効率的に実現するためのツールです。

https://github.com/twpayne/chezmoi

  1. シンボリックリンク不要でコマンド 1 つで環境を再現出来る
  2. template 構文で変数の展開や処理の分岐を書くことで各環境の差分を 1 ファイルで管理できる
  3. 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
.ssh/id_rsa
{{- onepasswordDocument "ti2adie9Aixaidae4dahpoh5io" -}}

これで完了です。
この状態で Git 管理して、新しい PC でchezmoi update & chezmoi applyすれば 1password からセキュアに対象ファイルを復元できます。
※ その際は新しい PC でも eval $(op my.1password.com メールアドレス) を行い 1password-cli にログインしておく必要があります。

終わりに

以上「chezmoi で dotfiles を手軽に柔軟にセキュアに管理する」でした。
chezmoi にはここで紹介した機能以外にも便利な機能があります。是非ドキュメントを読んでみてください。

https://github.com/twpayne/chezmoi

実際に chezmoi を使っている私の dotfiles はこちらです。今後も chezmoi を使って dotfiles を育てていきたいです。

https://github.com/kawamataryo/dotfiles

参考

Discussion