🤖

Ansibleで開発環境の構築を自動化する

2023/09/18に公開

モチベーション

これをみて「かっこいい~!」ってなったから。
https://kisqragi.hatenablog.com/entry/2020/02/17/224129

普段私が使っているNeovimやTmux,Zshなどでは「dotfile」と呼ばれる、ファイル名が「.(dot)」から始まる設定ファイルが存在する(neovimでは.vimrc、tmuxは.tmux.confなど)。こういったファイルを共有することで他のマシンで作業するときも大体の設定は引き継ぐことが出来るが、一部、外部のライブラリに依存しているものが入っているときは正しく起動できなかったりする。

そういったときに、上の人が作っているようなのワンライナーでインストールできるスクリプトを作っておくと、どの環境でも簡単に必要なライブラリなどのインストールなども行える(もちろん、dotfileを適切な場所へ配置するのもこのスクリプトで出来る)。

Ansible

上記のインストールスクリプトを作っている人はシェルスクリプトで書いていたが、私はAnsibleを使ってローカルの開発環境をやってみた。理由としては、シェルスクリプトを書くのが結構しんどいというのと、冪等性を考えるのがめんどくさかった(Ansibleで担保できると思うから楽)から。(あと、Ansibleを使ったことがないので使ってみたかったというのもあります。)

Ansibleとは

AnsibleはIT機器の管理を効率化・自動化するオープンソースの構成管理ツールです。Ansibleを使うことでIT機器の煩雑な設定作業が自動化されるため、管理者の負担を大幅に軽減できます。また自動化によって、ヒューマンエラーの削減を実現できる点もメリットです。

https://www.kagoya.jp/howto/it-glossary/develop/ansible

作ったもの

dotfilesと書いてあるが、dotfile群だけではなく、
環境構築を自動化するAnsibleのコードも入っている。
https://github.com/IwasakiYuuki/dotfiles

Ansibleでは、ロールという単位で環境を構築することができ、今回は一つのロールで一つのツールのインストール・セットアップを担当する。

ロール

Common

やっていること

  • XDGの各ファイル作成
  • 後述のツールに必要なものをインストール(言語、ビルド環境、ag、etc...)
main.yaml
- 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の配置
main.yaml
- 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の配置
main.yaml
- 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