Macのセットアップツールを作ってみた

# はじめに
HomebrewやDockerなどのインストールや、zshのカスタマイズを行うツールを作りました。

# 対象
macOS Catalinaを使う人向けです。

# なぜ作ろうと思ったのか
今までは、Macを新しく購入したりクリーンインストールしたりした際に、いつも使っているソフトを手動で一個ずつインストールしたり、設定を行ったりしていました。
この作業は、色んなサイトを見て設定したり、時にはダウンロードしたりと時間を食ってしまい、とても面倒な作業になりがちです。
これを少しでも楽にしようと思い、作ってみました。

# 使いかた
[リポジトリ](https://github.com/MYamashii/SetupMac)からcloneして、以下コマンドを実行してください。

```
$ zsh SetupStart.sh
```
処理内容は後述します。

# どんなことをやっているのか
## 構成
構成内容は以下のとおりです。

```
.
├── README.md
├── SetupStart.sh  // セットアップ開始スクリプト
└── setup
    ├── AnsibleInstall.sh  // Ansibleインストール
    ├── ShellSettings.sh  // zshの設定
    ├── ansible.cfg  
    ├── inventory
    ├── roles
    │   ├── homebrew
    │   │   ├── tasks
    │   │   │   └── main.yml
    │   │   └── vars
    │   │       └── main.yml  // homebrew tap、homebrewを使用してインストールするソフト一覧
    │   ├── homebrew_cask
    │   │   ├── tasks
    │   │   │   └── main.yml
    │   │   └── vars
    │   │       └── main.yml  // homebrew caskを使用してインストールするソフト一覧
    │   └── vscode
    │       ├── tasks
    │       │   └── main.yml  // VSCodeのExtensionインストール
    │       └── vars
    │           └── main.yml  // VSCodeのExtensionリスト
    └── setup.yml
```

## 処理内容
以下の順でインストールや設定を行っています。
1. Ansibleをインストール
2. Ansibleでbrewを使いソフトウェアをインストール
3. Ansibleでbrew caskを使いソフトウェアをインストール
4. zshのカスタマイズ

それぞれ詳細内容を説明します。

1.Ansibleをインストール

```sh:setup/AnsibleInstall.sh
# Install Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Update brew
brew update

# Install ansible
brew install ansible
```

2.Ansibleでbrewを使い以下ソフトウェアをインストール

- npm
- git

```yaml:setup/roles/homebrew/tasks/main.yml
- block:
  - name: homebrew tap
    homebrew_tap:
      name: "{{ item }}"
      state: present
    with_items: "{{ taps }}"

  - name: homebrew install
    homebrew:
      name: "{{ item.name }}"
      state: "{{ item.state }}"
    with_items: "{{ packages }}"

  tags:
    - homebrew
```

```yaml:setup/roles/homebrew/vars/main.yml
taps:
  - homebrew/cask
  - homebrew/cask-versions
  - homebrew/cask-fonts
  - homebrew/core

packages:
  - { name: npm, state: present }
  - { name: git, state: present }
```

3.Ansibleでbrew caskを使い以下ソフトウェアをインストール

- Docker
- Evernote
- Google Chrome 
- Google日本語入力
- Slack
- Visual Studio Code

```yaml:setup/roles/homebrew_cask/tasks/main.yml
- block:
  - name: homebrew cask install
    environment:
      HOMEBREW_CASK_OPTS: --appdir=/Applications
    homebrew_cask:
      name: "{{ item.name }}"
      state: "{{ item.state }}"
    with_items: "{{ packages }}"
  
  tags:
    - homebrew_cask
```

```yaml:setup/roles/homebrew_cask/vars/main.yml
packages:  
  - { name: docker, state: present }
  - { name: evernote, state: present }
  - { name: google-chrome, state: present }
  - { name: google-japanese-ime, state: present }
  - { name: slack, state: present }
  - { name: visual-studio-code, state: present }
```

4.zshのカスタマイズ
ここでは、zshに以下の変更を行っています。

- pureテーマに変更
- 文字コードをUTF-8に変更
- 大文字小文字関係なくターミナル上で補完するよう変更
- コマンド履歴保存件数を1000件に変更
- preztoをダウンロード
- メニュー補完を有効化


```sh:setup/ShellSettings.sh
# Install pure to change terminal theme
mkdir -p "$HOME/.zsh"
git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"

# zshrcに保管機能、プロンプト有効化を書き込み
{
echo "# 文字コードUTF-8に設定"
echo "export LANG=ja_JP.UTF-8"
echo ""
echo "zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'"
echo ""
echo "# history"
echo "HISTFILE=$HOME/.zsh_history"
echo "HISTSIZE=1000"
echo "SAVEHIST=1000"
echo "setopt extended_history"
echo ""
echo "zstyle ':completion:*:default' menu select=1"
echo ""
echo "fpath+=$HOME/.zsh/pure"
echo ""
echo "# プロンプト、補完有効"
echo "autoload -U promptinit compinit"
echo "promptinit"
echo "compinit"
echo ""
echo "prompt pure" } > "$HOME/.zshrc"

# Clone prezto
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
setopt EXTENDED_GLOB

# Change the prompt theme to pure
sed -i '' s/\'sorin\'/\'pure\'/ "${ZDOTDIR:-$HOME}/.zprezto/runcoms/zpreztorc"

# Enable syntax highligting and auto suggestions.
sed -i '' "s/'prompt'/'syntax-highlighting' 'autosuggestions' 'prompt'/" "${ZDOTDIR:-$HOME}/.zprezto/runcoms/zpreztorc"

# Reload
exec $SHELL -l
```

# おわりに
このツールで、今まで時間がかかっていた作業を一気に楽にすることができました。
今後も、より楽にできるようにこのツールをカスタマイズしていきたいです。

# 課題
実際のツールには、Visual Studio Codeの拡張機能をAnsibleで入れています。
ですが、このツールを実行後にVisual Studio Codeを起動してみると、拡張機能がインストールされていません。
ここは調査中ですが推測する限り、AnsibleでVisual Studio Codeを入れたあとに、Visual Studio Codeの初回の起動が必要だと思われます。
この件はどう解決したらいいのか考え中です。


# 参考記事
[お前らのターミナルはダサい](https://qiita.com/kinchiki/items/57e9391128d07819c321)
[AnsibleでMacの環境構築をしてみる](https://rightcode.co.jp/blog/information-technology/ansible-mac-environment-setup)
[Macのセットアップを自動化！３つのポイント](https://qiita.com/7coAim/items/fe8ac542a78f9f985572)
[Ansible で Mac を構成管理するときの勘所](https://qiita.com/kkitta/items/27f8aca89e55b719cb6f)
["AnsibleでMac環境構築するやつ"のテンプレートつくった](https://qiita.com/kohbis/items/c12281805f9f9f59600d)