四年後の君へ...〜AnsibleでMacの環境構築を自動化してみた〜

## 概要

この記事は [# ミライトデザイン Advent Calendar 2023](https://qiita.com/advent-calendar/2023/miraito-inc) 16日目の記事です。(@hirodragon さんが間に合わなかったので代わりに書いてます笑 楽しみにしていた方は19日までお待ちください🙏) 

昨日は @Nyokki さんの記事でした。

https://qiita.com/Nyokki/items/eef32cdd47c530cc308d

DBパーティショニングは勉強した時に知識としてはありますが、実際の業務で扱ったことがなかったのでとても参考になりました！いつか仕事で使ってみたいです。

さて、今日の記事のネタですが私のメインPCを [MacBook Pro (13-inch, 2018, Thunderbolt 3ポートx 4)](https://support.apple.com/kb/SP775?locale=ja_JP) から [MacBook Pro (14インチ, M3, Nov 2023)](https://support.apple.com/kb/SP900?locale=ja_JP) に乗り換えました。

前のPCは4年前に買ったので次は4年後に新しいのを買うのだろうということで4年後の私へ環境構築の自動化をクリスマスプレゼントにしたいと思います🎄

本当は書きたい記事がありましたが、思った以上に壮大になってしまったので来年に持ち越します。(そのため緊急で記事を書いています)

あと1週間前の[たくまくんのネタ](https://qiita.com/tkek321/items/f69be943442161019b4b)とモロ被ってます。

## ソースコード

- https://github.com/ucan-lab/ansible-mac/releases/tag/v1.0.0
- https://github.com/ucan-lab/dotfiles/releases/tag/v1.0.0

新しいMacはこれからう使い始めるので本記事の執筆時点のコミットを `v1.0.0` とタグ付けしておきました。

:::note info
参考にしてもらって構わないですが、私のための環境なので不要なツールとか削ってお使いください🙏
:::

## dotfiles について

今回の主題じゃないので説明は軽く済ませます。
`.zshrc` や `.gitconfig` などのファイルを `dotfiles` の名称のリポジトリ名で管理する慣習(?)があります。

https://qiita.com/yutkat/items/c6c7584d9795799ee164

https://zenn.dev/yutakatay/articles/try-dotfiles-01

色んな人の `dotfiles` を参考にして世界に一つだけの `dotfiles` を作ってみてください！

ただ、いきなり全部入れても使いこなせないので、慣れたら少しずつ増やしていくのが良いと思いますネ

## ansible について

https://www.ansible.com

RedHat社が開発しています。
プロビジョニング、構成管理、アプリケーションのデプロイメント、オーケストレーション、その他多くのITプロセスを自動化するツールです。

AnsibleではPlaybookというYAML形式のファイルに一連のタスクを管理していきます。

## ansible-mac 構成

```
.
├── inventory.ini # 環境毎で書き換えるファイル
├── inventory.ini.example
├── playbook.yml
├── requirements.yml
└── roles
   ├── homebrew
   │  └── tasks
   │     └── main.yml
   ├── homebrew_cask
   │  └── tasks
   │     └── main.yml
   └── mac_app_store
      └── tasks
         └── main.yml
```

## dotfiles 構成

```
.
├── .config
│  └── starship.toml
├── .gitconfig
└── .zshrc
```

- dotfiles のGitHubリポジトリは事前に作成しておく必要があります。
## 事前準備

- Xcode CLIのインストール
- [Homebrew](https://brew.sh/ja)のインストール
- [GitHub SSH 接続](https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24) 設定済み
- `dotfiles` リポジトリは準備済み

```
$ xcode-select --install
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

$ brew -v
Homebrew 4.1.25

$ ssh -T github.com
Hi ucan-lab! You've successfully authenticated, but GitHub does not provide shell access.
```

## 実行手順

```
$ cd ansible-mac
```

ansible-mac を fork でも new repository でもいいのでリポジトリ作って、git clone してください。

`inventory.ini` ファイルを作成する

```
$ cp inventory.ini.example inventory.ini
```

`ansible_become_user` と `dotfiles_repo_local_destination` を設定してください。

```
[all:vars]
ansible_become=true
ansible_become_user=your_mac_user_name
dotfiles_repo_local_destination=/path/to/dotfiles
```

`dotfiles` のパスはどこでも大丈夫です。
また、なければcloneされるのでなくてもいいです。

`dotfiles` ディレクトリが存在する場合は、git commit されてないとエラーになるので作業中のファイルは置かないようにしてください。

[Ansible Galaxy](https://galaxy.ansible.com/ui/) からロールをインストールする
Ansible Galaxy は他の人が作ったロールを検索、ダウンロード、共有できる無料のサービスです。

```
$ ansible-galaxy install -r requirements.yml
```

- `dotfiles` のロールを使いたかったのでここでインストールしています。

```
$ ansible-playbook playbook.yml -i inventory.ini -K
```

- `-i` で inventory ファイルを指定
- `-K` でユーザーパスワードを入力する
	- (インストール途中でパスワード入力を求められないという理解で良いか？)

`ansible-playbook` コマンドで `playbook.yml` に書かれたタスクが順次実行されます。
エラーが出なければMacの環境構築完了です。

## 補足

環境構築時にインストールしたツール類をご紹介します。

### Homebrew ツール紹介

https://github.com/ucan-lab/ansible-mac/blob/v1.0.0/roles/homebrew/tasks/main.yml

- [asdf](https://asdf-vm.com)
  - バージョン管理ツール(Node, Ruby等々)
- [bat](https://github.com/sharkdp/bat)
  - `cat` コマンドの代替でハイライトして表示してくれる
- [direnv](https://direnv.net)
  - ディレクトリ毎に環境変数を読み込む
- [eza](https://github.com/eza-community/eza)
  - `ls` コマンドの代替でハイライトして表示してくれる
- [fd](https://github.com/sharkdp/fd)
  - `find` コマンドの代替で高速かつ直感的にファイル検索できる
- [gh](https://docs.github.com/ja/github-cli/github-cli/about-github-cli)
  - GitHub CLI
- [git](https://git-scm.com)
  - Git
- [git-delta](https://dandavison.github.io/delta)
  - `diff` コマンドの代替ツール
  - `git diff`, `git show`, `git blame` などの差分が見やすくなります。
- [go-task](https://taskfile.dev/ja-jp)
  - タスクランナー・ビルドツールです
  - `Taskfile.yml` YAML形式でシンプルにビルドタスクを記述できます。
- [helix](https://helix-editor.com)
  - テキストエディタ
- [jq](https://jqlang.github.io/jq)
  - JSON を整形したり検索したりすることができます。
- [lazygit](https://github.com/jesseduffield/lazygit)
  - GitのTUIツールです。
- [mas](https://github.com/mas-cli/mas)
  - Mac App Store 用のCLIツールです。
  - Homebrewで管理されていないアプリをインストールできます。
- [ripgrep](https://github.com/BurntSushi/ripgrep)
  - `grep` の代替で、デフォルトで `.gitignore` に書かれたファイルを除外してくれたり便利
- [starship](https://starship.rs)
  - クロスシェルプロンプトツール
- [trash-cli](https://github.com/andreafrancia/trash-cli)
  - `rm` の代替で誤って削除した時に元に戻せる
- [zoxide](https://github.com/ajeetdsouza/zoxide)
  - `cd` の代替で絶対パスや相対パスを指定せず、ディレクトリ名の一部だけで利用頻度の高いパスへパパっと移動できる
- [zsh](https://sourceforge.net/p/zsh/code/ci/master/tree)
  - macOS Catalina以降はデフォルトシェルがbashからzshに変更されている
- [zsh-autocomplete](https://github.com/marlonrichert/zsh-autocomplete)
  - zshのリアルタイム先行入力自動補完ツール
- [koki-develop/docker-tags](https://github.com/koki-develop/docker-tags)
  - Docker Hubに登録されているDockerイメージのタグ一覧を取得するコマンド
  - 公式にコマンドが用意されていないので重宝しています

### Homebrew Cask ツール紹介

https://github.com/ucan-lab/ansible-mac/blob/v1.0.0/roles/homebrew_cask/tasks/main.yml

- [1password](https://1password.com/jp)
  - パスワード管理ツール 
- [discord](https://discord.com)
  - チャットツール
- [firefox](https://www.mozilla.org/ja/firefox)
  - ブラウザ
- [google-chrome](https://www.google.com/intl/ja_jp/chrome)
  - ブラウザ
- [iina](https://iina.io)
  - 動画再生ツール。QuickTimePlayerだと5秒前後にスキップができなかったり使いづらい
- [notion](https://www.notion.so/ja-jp)
  - Notion
- [obsidian](https://obsidian.md)
  - メモアプリ
- [orbstack](https://orbstack.dev)
  - Docker for Macの代替
- [phpstorm](https://www.jetbrains.com/ja-jp/phpstorm)
  - PHP統合開発環境。PHP開発者は必須。有償アプリ
- [postman](https://www.postman.com)
  - HTTPリクエストツール
- [pushplaylabs-sidekick](https://www.meetsidekick.com/ja)
  - ブラウザ
- [raycast](https://www.raycast.com)
  - ランチャー
  - https://zenn.dev/lclco/articles/45d2a49650ebf9
  - SpotlightやAlfredのようなもの
- [sequel-ace](https://sequel-ace.com)
  - MySQL GUIクライアントツール。Sequel Proの後継。
- [slack](https://slack.com/intl/ja-jp)
  - Slack
- [rectangle](https://rectangleapp.com)
  - ウィンドウリサイズツール
  - [spectacle](https://github.com/eczarny/spectacle) の後継
- [the-unarchiver](https://theunarchiver.com)
  - ファイル展開ツール
- [transmit](https://panic.com/jp/transmit)
  - FTPツール。有償アプリ
- [visual-studio-code](https://code.visualstudio.com)
  - エディタ
- [warp](https://www.warp.dev)
  - ターミナル
- [zoom](https://zoom.us/ja)
  - ミーティングアプリ
- [font-fira-code](https://fonts.google.com/specimen/Fira+Code)
  - プログラミング用フォント
- [iandol/adobe-fonts/font-source-code-pro](https://github.com/adobe-fonts/source-code-pro)

### Mac App Store ツール紹介

https://github.com/ucan-lab/ansible-mac/blob/v1.0.0/roles/mac_app_store/tasks/main.yml

- [Xcode](https://developer.apple.com/jp/xcode)
  - iOS開発する人は必須
- [LINE](https://line.me/ja)
  - 友達いる人は必須

## 感想

Ansibleを初めて使いましたが、
コマンド1回叩けばあとは待つだけで良いのでとても便利でした。
Xcodeなどダウンロード時間かかるものとかもまとめてインストールできるのは嬉しいです。

Macのシステム設定もAnsibleから設定できるそうですが、なぜか反映されなかったので一旦保留にしてます。