小ネタ集です。
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
モジュールに name
と action
を渡します。 name
のコマンドが見つからないときだけ、 action
を実行しますが、存在するときは no change になります。
以上です! 簡単ですがやはりAnsibleを使っているというだけで大きな安心感が得られるので是非。