"AnsibleでMac環境構築するやつ"のテンプレートつくった

2016年くらい（?）に流行った、Macの開発環境構築をAnsibleで自動化するお話。
新しいMacを手に入れたときにオレオレ環境を再現する用途がほとんどだと思います。

クラウドにインスタンスを立ててリモート開発環境で快適に。
というのが主流になりつつある昨今需要は減っているかもしれません。
それでも、

* このアプリ入ってないの？（ハイッテヘンヨ！）
* このvscode拡張のこの設定は必須でしょ。（シランモン！）
* 必要なツールどっかのwikiにあるよ。（ドコヤネン。。。）

というのは（たぶん）起こっているはず。

そんなお困りごとを解決できればいいなと思い、テンプレートを作成しました。
基本的にはメンテするのは一つのymlファイルだけでよい作りになっています。

※ 今回「全部シェルでええやん」はご勘弁ください。。。

## できるもの

https://github.com/kohbis/mac-ansible/tree/template
"説明トカイラナイヨ！"という方は、こちらだけお収めください。

## Ansibleとは

* 構成管理/オーケストレーション/デプロイメント ツール
* RedHat社が開発
* エージェントレス
* 処理をplaybook（yaml形式）で管理

> [参考]
・Ansibleをはじめる人に。
https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c
・Ansible実践入門
https://dev.classmethod.jp/server-side/ansible/practice_ansible/

## 構成

今回は最小限の構成で、そこからカスタマイズできるテンプレートにしています。
エディタはVSCodeとVimを対象にしていますが、基本は変わらないのでAtom等もテンプレートを参考にしていただければと思います。

```bash
.
├── README.md
├── ansible.cfg
├── group_vars
│   └── localhost.yml #メンテナンス対象
├── inventory
│   └── localhost
├── localhost.yml #playbook
└── roles
    ├── dotfiles
    │   ├── tasks
    │   │   └── main.yml
    │   └── template
    │       ├── template.bash_profile #必要であれば編集
    │       ├── template.bashrc #必要であれば編集
    │       └── template.vimrc #必要であれば編集
    ├── homebrew
    │   └── tasks
    │       └── main.yml
    ├── homebrew_cask
    │   └── tasks
    │       └── main.yml
    └── vscode
        ├── tasks
        │   └── main.yml
        └── templates
            ├── keybindings.json #必要であれば編集
            └── settings.json #必要であれば編集
```

作業は

* `README.md`の通り、シェルをダウンロードして実行。
* 時々Enterを押したり、パスワードを入力。

だけです。
アプリによってパスワードが必要になったりするので完全な自動化ができないのが何とも言えないところですね。
「できるよ！！」という方いらっしゃいましたらご教授いただければありがたいです。

```sh:README.md
curl -O https://raw.githubusercontent.com/kohbis/mac-ansible/template/setting.sh
chmod 755 ./setting.sh
sh ./setting.sh
```

## setting.sh

Macではお決まりの`command line tools`と`homebrew`をインストールし、`ansible-playbook`を実行します。
`ANSIBLE_PATH` は適当なディレクトリに変更して問題ありません。

```sh:setting.sh
#!/bin/bash

ANSIBLE_PATH=~/workspace/settings/mac-ansible

## command line tools
xcode-select --install

## install homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

## install ansible
brew install ansible

## clone repo
git clone -b template https://github.com/kohbis/mac-ansible.git ${ANSIBLE_PATH}

## ansible
cd ${ANSIBLE_PATH}
ansible-playbook -i inventory/localhost localhost.yml # --tags "タグ名" 指定可能
``` 


## ansible.cfg

inventoryディレクトリの指定のみ。

```ini:ansible.cfg
[defaults]
inventory = ./inventory
```

## localhost.yml

使用する`playbook`です。
`roles`に定義した`task/main.yml`の処理が実行されます

実行したくない場合は、`roles`から記載を消せばよいです。

```yml:localhost.yml
- hosts: localhost
  connection: local
  gather_facts: no
  become: no
  roles:
    - homebrew
    - homebrew_cask
    - dotfiles
    - vscode
```

## inventory

### localhost

自分自身を対象にするのでローカルホストを指定します。

```conf:localhost
[localhost]
127.0.0.1
```

### group_vars

#### localhost.yml

homebrewやvscode拡張機能などの一覧を管理します。
必要、推奨アプリを初期段階でインストールできるので、後世の人々が苦労せずに済みますね。

```yml:localhost.yml
homebrew_taps:
  - homebrew/cask
  - homebrew/core
homebrew_packages:
  - name: ansible
  - name: awscli
  ## (中略) ##
  - name: vim
  - name: wget
homebrew_cask_packages:
  - name: appcleaner
  - name: cyberduck
  ## (中略) ##
  - name: station
  - name: visual-studio-code
dot_files:
  - .bash_profile
  - .bashrc
  - .vimrc
code_extensions:
  - vscode-icons-team.vscode-icons
```

できるだけ削ったつもりですが、それでも多くなってしまいました。。。

今使用しているMacからリストを作りたい場合は、こちらのコマンドをご利用ください。
(dot_filesはよしなに)

```bash
echo "homebrew_taps:" && brew tap | awk '{print "  - "$1}'
echo "homebrew_packages:" &&  brew list | awk '{print "  - name: "$1}'
echo "homebrew_cask_packages:" && brew list --cask | awk '{print "  - name: "$1}'
echo "code_extensions:" && code --list-extensions | awk '{print "  - "$1}'
```

## roles


### homebrew

#### task

最初に`brew tap`してformulaを追加するようにしておきます。

```yml:mail.yml
- block:

  - name: homebrew update
    homebrew:
      update_homebrew: yes

  - name: homebrew tap
    homebrew_tap:
      name: '{{ item }}'
      state: present
    with_items: '{{ homebrew_taps }}'

  - name: homebrew packages install
    homebrew:
      name: '{{ item.name }}'
      state: '{{ item.state | default("present") }}'
    with_items: '{{ homebrew_packages }}'

  tags:
    - homebrew
```

### homebrew_cask

#### task

GUIアプリもインストールできるのが、homebrewのいいところだと思います。
インストール先は`/Applications`を明示しておきます。

```yml:mail.yml
- block:

  - name: homebrew cask packages install
    homebrew_cask: name={{ item.name }} state=installed
    environment:
      HOMEBREW_CASK_OPTS: "--appdir=/Applications"
    with_items: '{{ homebrew_cask_packages }}'

  tags:
    - homebrew_cask
```

### dotfiles

#### task

templatesからホームディレクトリにコピーします。
個人用には随時アップデートしたくなると思うので、別リポジトリで管理してシンボリックリンクをはるのがおすすめです。

```yml:mail.yml
- block:

  ########
  # copy #
  ########
  - name: copy dotfiles
    template:
      src: template{{ item }}
      dest: ~/{{ item }}
    with_items: '{{ dot_files }}'

  #################
  # symbolic link #
  #################
  # - name: checkout dotfiles
  #   git:
  #     repo: https://github.com/{your_repository}/dotfiles.git
  #     dest: ~/dotfiles

  # - name: create symlinks
  #   file:
  #     src: ~/dotfiles/{{ item }}
  #     dest: ~/{{ item }}
  #     state: link
  #     force: yes
  #   with_items: '{{ dot_files }}'

  tags:
    - dotfiles
```

#### template

```bash:template.bash_profile
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
```

`.bash_profile` は初期のままで大丈夫でしょう。

```bash:template.bashrc
# alias ls='ls -G'
```

特にprompt表示やaliasを共有できるのは便利です。

```vim:template.vimrc
" set number
```

vimの~~沼~~設定も移行できます。

### vscode

#### task

libraryディレクトリは、先んじて作成しておきます。
vscodeだと管理したい設定ファイルは、`setting.json` と `keybinding.json` くらいでしょうか。
個人的には `~/Library/Application Support/Code/User/snippets/` も管理できるのでおすすめです。

```yml:mail.yml
- block:

  - name: visual studio code library directory
    file:
      path="~/Library/Application Support/Code/User"
      state=directory

  - name: visual studio code basic setting
    template:
      src: settings.json
      dest: "~/Library/Application Support/Code/User"
      mode: 0644

  - name: visual studio code keybindings
    template:
      src: keybindings.json
      dest: "~/Library/Application Support/Code/User"
      mode: 0644

  - name: visual studio code install extension
    raw: "code --install-extension {{ item }}"
    with_items: '{{ code_extensions }}'

  tags:
    - vscode
```

#### template

jsonの中身はコメントアウトしています。

```text:setting.json
{
    // "extensions.ignoreRecommendations": true,
    // "editor.minimap.enabled": false,
}
```

VSCode本体や拡張機能の詳細な設定、コード規約（後者は各projectで管理したいところですが）などを共有できると何かと便利です。

```text:keybinding.json
[
    // { "key": "cmd+shift+k", "command": "workbench.action.terminal.focusNext" },
    // { "key": "cmd+shift+j", "command": "workbench.action.terminal.focusPrevious" },
]
```

keybindingは個人の趣向があるので、あまり必要ないかもしれませんね。

## 最後に

本投稿では紹介していないけれど、できることはまだまだあります。
GitHubで `mac-ansible` 等で検索すれば、先人たちの恩恵を受けられます。
https://github.com/search?q=mac-ansible

[mas-cli](https://github.com/mas-cli/mas)でMacAppStoreのアプリをインストールすることも可能です。

一応筆者の ansible-plyabook のURLを貼っておきます。
https://github.com/kohbis/mac-ansible
（完全自分用でmasterを更新しまくっているのでご参考までに）

新しいMacを渡されて、ある程度のセットアップまではできるのは本当にありがたいですね。

結局みんな好きずきにカスタマイズするでしょうけど笑。