dotfilesのためのがんばらないAnsible


小ネタ集です。

Ansibleを使って環境構築をコマンド一発でできるようにしよう!でもAnsibleを学習するのは大変、そもそもやりたいことはインフラではないし……というあなたに役立つかもしれない知識たち。

サンプルとして、自分のdotfilesを置いておきます。 https://github.com/eihigh/dotfiles/tree/master/ansible

inventoryを使わない

ssh接続(あとpython)さえあればリモートホストが幾つあっても一発で構築できるのがAnsibleの魅力。だけどdotfilesでは今ある環境さえ構築できればそれでいい。

というわけでホストは localhost に固定してしまいましょう。

---
- name: My Playbook
  hosts: localhost
  connection: local
  tasks:
    - include: tasks.yml

こいつを

ansible-playbook path/to/playbook.yml

と叩けばOK。 -i オプションのことは忘れましょう。

但し環境自体にAnsibleが必要になるのでそこはなんとかしてインストールする必要あり。自分の場合はpythonもないまっさらな環境を使いたかったので、pythonとsshを入れてリモートホストに設定するくらいなら最初から自身にAnsibleを入れても変わらないじゃん、という発想で運用しています。

タスクをまとめる

ロールとかなんとかで汎用性をもたせられるのもAnsibleの魅力ですが、dotfilesの環境構築なんてどうせ大したことはしないので、1ファイルにまとめてしまいましょう。

上記の起点となるplaybookから tasks.yml を呼び出す形にするとインデントを減らせて綺麗に収まるかと思います。自分はこのような内容にまとめています。 https://github.com/eihigh/dotfiles/blob/master/ansible/tasks.yml

同じ発想で vars.yml も1ファイルにまとめていて、結果として以下のようなディレクトリ構成になっています。

ansible/
|-- setup.yml ... 起点となるplaybook
|-- tasks.yml ... タスクをまとめたyaml
|-- vars.yml ... 変数をまとめたyaml
`-- library/ ... 自作モジュール置き場
    `-- executable.sh

PATHに所定のコマンドがないときだけインストール

dotfilesだとありがちだと思いますが、(自分の探した限りだと)デフォルトでは見つからなかった機能。もしよろしければお使いください。 https://github.com/eihigh/dotfiles/blob/master/ansible/library/executable.sh

使い方は、

executable:
  ghq: cd /tmp; go get -u github.com/motemen/ghq
  gopls: cd /tmp; go get -u golang.org/x/tools/cmd/gopls
  lazygit: cd /tmp; go get -u github.com/jesseduffield/lazygit
  goimports: cd /tmp; go get -u golang.org/x/tools/cmd/goimports
  pt: cd /tmp; go get -u github.com/monochromegane/the_platinum_searcher/...
  eslint: sudo npm install -g eslint
  typescript: sudo npm install -g typescript

のようにコマンド名とインストールスクリプトをvarsに用意したあと、

- name: Install executables
  executable:
    name: "{{ item.key }}"
    action: "{{ item.value }}"
  with_dict: "{{ executable }}"

のように executable モジュールに nameaction を渡します。 name のコマンドが見つからないときだけ、 action を実行しますが、存在するときは no change になります。


以上です! 簡単ですがやはりAnsibleを使っているというだけで大きな安心感が得られるので是非。