kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

dotfilesの管理をrcmからchezmoiに移行した

こちらで導入していたrcmからchezmoiに移行しました。

kkkw.hatenablog.jp

chezmoiにした決め手

  • golang製なのでどこでも動かせる
  • template機能がgolangなので個人的にわかりやすい
  • bitwardenなどのパスワードマネージャーと組み合わせられる

インストール

mac

$ brew install chezmoi

ubuntu

$ sudo snap install chezmoi --classic

コマンド

# 管理対象の一覧
$ chezmoi managed
# 既存のファイルをchezmoi管理にする
$ chezmoi add ~/.zshrc
# 既存のファイルをテンプレートとして追加する
$ chezmoi add --template ~/.zshrc
# すでに管理下に置かれているファイルをテンプレートとして扱うよう変更する
$ chezmoi chattr +template ~/.zshrc
# 編集
$ chezmoi edit ~/.zshrc
# 適用(ドライラン)
$ chezmoi apply --dry-run --verbose
# 適用
$ chezmoi apply
# ファイル指定で適用
$ chezmoi apply ~/.zshrc
# リポジトリに移動
$ chezmoi cd
# templateで使える変数の確認
$ chezmoi data
# gitリポジトリの(他マシンでの)変更を取り込む
$ chezmoi update
# templateのテスト
$ cat foo.tmpl | chezmoi execute-template
# templateのテスト2
$ chezmoi cat ~/foo.yml

apply

chezmoiはdotfileを直接編集するのではなく、元ファイルを編集し、それを反映するスタイルです。 編集するファイルは、 ~/.local/share/chezmoi にあります。 編集したものを反映するためのコマンドがapplyです。

add

chezmoiの管理対象にファイルを追加したい時に使います。

cd

chezmoiは管理対象のファイルを ~/.local/share/chezmoi に集めてそこをgit管理します。 chezmoi git というサブコマンドがあるので、移動しなくてもgit管理はできますが、直接git操作したい時に対象ディレクトリに移動します。

execute-template

私した文字列をtemplateとして実行した結果を表示します。 $ chezmoi execute-template '{{ .chezmoi.hostname }}' と実行するとhostnameが表示されます。 templateのデバッグをする際に必須です。

rcmからの移行

初期化

chezmoi で dotfile を管理するためのディレクトリを作成します。 以下コマンドで ~/.local/share/chezmoiディレクトリが作られます。ここが実体になります。自動的にgit initも行われます。

$ chezmoi init

私はrcmで管理していたリポジトリがあるのでリモートリポジトリの設定をしました。

$ git remote add origin git@github.com:kkkw/dotfiles.git

管理ファイルの追加

初期化したら管理したいファイルを追加していきます。 rcmは ~/dotfiles に実体を持って、各ファイルはシンボリックリンクです。 chezmoiにシンボリックリンクを追加する場合は add--follow オプションを使います。 下記を実行すると、~/.local/share/chezmoi にdot_zshrcというファイルが作成されます。

$ chezmoi add --follow ~/.zshrc

管理ファイルの編集

chezmoi edit ~/.zshrc でファイルを編集することができますが、 ~/.local/share/chezmoi を直接編集しても大丈夫です。 また、管理ファイルとして追加した後にtemplate機能を使いたい時は以下のコマンドでtemplate化します。 template化すると、dot_zshrcがdot_zshrc.tmplになります。

$ chezmoi chattr +template ~/.zshrc

template化した後は、 chezmoi data , chezmoi execute-template, chezmoi apply --dry-run ~/.zshrc を使ってデバッグしていきます。

bitwardenを使いたい場合

bitwarden-cliのインストール

mac

$ brew install bitwarden-cli

ubuntu

$ sudo snap install bw

templateの書き方

前提として、対象ファイルはtemplate化されている必要があります。 例えば、bitwardenにAPI_TOKENというアイテムが登録されていたとして、そのnotesにある値を使いたい場合は下記のようにします。

export API_TOKEN={{ (bitwarden "item" "API_TOKEN").notes | trim }}

bitwardenのカスタムフィールドを使っている場合は、別の関数を使います。 下記の場合はtokenという名前のカスタムフィールドの値を持ってきてます。

{{ (bitwardenFields "item" "API_TOKEN").token.value | trim }}

環境変数の設定

applyやexecute-templateをする前に下記でBW_SESSIONを設定しておきます。 ただし、私が実行したところ下記を設定していてもmacではマスターパスワードを毎回聞かれました。

$ export BW_SESSION=$(bw {login,unlock} --raw)

適応

管理対象にしたいファイルを全て追加した後にapplyします。 applyを実行した時にすでにシンボリックリンクがあるので、上書きの確認が出るので all-overwrite します。

別PCへの反映

別PCへ反映したい場合は、そちらでもchezmoiをインストールして、初期化、適応すれば終わりです。 下記コマンドで初期化、適応できます。

$ chezmoi init --apply git@github.com:kkkw/dotfiles.git

リポジトリgithubにあり、リポジトリ名が、dotfilesである場合は、ユーザー名の指定だけでinitできます。 --ssh オプションをつけないと、リモートリポジトリがhttpsで設定されます。

$ chezmoi init --apply --ssh kkkw

ちょっと分かりづらかったこと

マシンによって作りたくないファイル

macでは不要だけどubuntuでは欲しいファイル(.ubuntu-rc)というのがあったとしてそれをどう表現するのかがわかりませんでした。 結果としては、 .chezmoiignore というファイルを作ってその中で条件分岐で管理します。 ignoreファイルなので、不要な環境の時にそのファイル名が表示されるように管理します。

上記の例では、macでは.ubuntu-rcを作りたくない、ubuntuでは.ubuntu-rcを作りたい。 dot_ubuntu-rcとして元ファイルは作っておきます。 その上で、 .chezmoiignore に下記のように記載します。

{{ if eq .chezmoi.os "darwin" }}
.ubuntu-rc
{{- end }}