Ansibleで開発環境の構築を自動化する
モチベーション
これをみて「かっこいい~!」ってなったから。
普段私が使っているNeovimやTmux,Zshなどでは「dotfile」と呼ばれる、ファイル名が「.(dot)」から始まる設定ファイルが存在する(neovimでは.vimrc、tmuxは.tmux.confなど)。こういったファイルを共有することで他のマシンで作業するときも大体の設定は引き継ぐことが出来るが、一部、外部のライブラリに依存しているものが入っているときは正しく起動できなかったりする。
そういったときに、上の人が作っているようなのワンライナーでインストールできるスクリプトを作っておくと、どの環境でも簡単に必要なライブラリなどのインストールなども行える(もちろん、dotfileを適切な場所へ配置するのもこのスクリプトで出来る)。
Ansible
上記のインストールスクリプトを作っている人はシェルスクリプトで書いていたが、私はAnsibleを使ってローカルの開発環境をやってみた。理由としては、シェルスクリプトを書くのが結構しんどいというのと、冪等性を考えるのがめんどくさかった(Ansibleで担保できると思うから楽)から。(あと、Ansibleを使ったことがないので使ってみたかったというのもあります。)
Ansibleとは
AnsibleはIT機器の管理を効率化・自動化するオープンソースの構成管理ツールです。Ansibleを使うことでIT機器の煩雑な設定作業が自動化されるため、管理者の負担を大幅に軽減できます。また自動化によって、ヒューマンエラーの削減を実現できる点もメリットです。
作ったもの
dotfilesと書いてあるが、dotfile群だけではなく、
環境構築を自動化するAnsibleのコードも入っている。
Ansibleでは、ロールという単位で環境を構築することができ、今回は一つのロールで一つのツールのインストール・セットアップを担当する。
ロール
Common
やっていること
- XDGの各ファイル作成
- 後述のツールに必要なものをインストール(言語、ビルド環境、ag、etc...)
- name: "Create XDG dir"
file:
path: "{{ item }}"
state: "directory"
with_items:
- "{{ xdg_cache_home }}"
- "{{ xdg_config_home }}"
- "{{ xdg_data_home }}"
- "{{ xdg_state_home }}"
- "{{ xdg_bin_home }}"
- name: "Install build tools"
apt:
name: "build-essential"
state: "present"
- name: "Install searcher"
apt:
name: "silversearcher-ag"
state: "present"
- name: "Language: Go (1/3)"
get_url:
url: "https://go.dev/dl/go1.21.1.linux-amd64.tar.gz"
dest: "/tmp/go1.21.1.linux-amd64.tar.gz"
- name: "Language: Go (2/3)"
unarchive:
src: "/tmp/go1.21.1.linux-amd64.tar.gz"
dest: "{{ xdg_config_home }}"
- name: "Language: Go (3/3)"
file:
src: "{{ xdg_config_home }}/go/bin/go"
dest: "{{ xdg_bin_home }}/go"
state: "link"
roles/common/
└── tasks
└── main.yaml
Neovim
やっていること
- Neovimインストール(現在Unstableである0.9.0)
- dotfilesの配置
- name: "Get neovim source code"
get_url:
url: "{{ source_url }}"
dest: "{{ xdg_data_home }}/nvim"
mode: "744"
- name: "Extract the appimage"
shell: |
(cd {{ xdg_data_home }} && ./nvim --appimage-extract)
rm -rf {{ xdg_data_home }}/nvim
- name: "Create link to binary file"
file:
src: "{{ xdg_data_home }}/squashfs-root/usr/bin/nvim"
dest: "{{ xdg_bin_home }}/nvim"
state: "link"
- name: "Copy neovim setting directory"
copy:
src: "nvim/"
dest: "{{ xdg_config_home }}/nvim"
- name: "Install Dependencies"
pip:
name: "pynvim"
roles/neovim/
├── files
│ └── nvim -> ../../../nvim # Neovimの設定ファイルへのリンク
├── tasks
│ └── main.yaml
└── vars
└── main.yaml
Zsh
やっていること
- Zshインストール(apt)
- dotfilesの配置
- name: "Install zsh"
apt:
name: "zsh"
state: "present"
- name: "Copy zsh env file to home dir"
copy:
src: "zsh/{{ item }}"
dest: "{{ lookup('env', 'HOME') }}/{{ item }}"
with_items:
- .zshenv
- name: "Create zsh config dir"
file:
path: "{{ xdg_config_home }}/zsh"
state: "directory"
- name: "Copy zsh setting files to config dir"
copy:
src: "zsh/{{ item }}"
dest: "{{ xdg_config_home }}/zsh/{{ item }}"
with_items:
- .zshrc
- name: "Change default shell"
shell: "chsh -s /usr/bin/zsh"
roles/zsh/
├── files
│ └── zsh -> ../../../zsh # Zshの設定ファイルへのリンク
└── tasks
└── main.yaml
(tmuxの分はまだ作れてない)
実行
sudo -E ansible-playbook -i localhost, -c local setup.yaml
(sudo -Eにするのは、ルートユーザではなくログインユーザでディレクトリを作って欲しいから)
PLAY [localhost] *****************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************
ok: [localhost]
TASK [common : Create XDG dir] ***************************************************************************************************************************************************************************************
ok: [localhost] => (item=/home/<username>/.cache)
ok: [localhost] => (item=/home/<username>/.config)
ok: [localhost] => (item=$HOME/.local/share)
ok: [localhost] => (item=/home/<username>/.local/state)
ok: [localhost] => (item=$HOME/.local/bin)
TASK [common : Install build tools] **********************************************************************************************************************************************************************************
ok: [localhost]
TASK [common : Install searcher]
...
Discussion