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等もテンプレートを参考にしていただければと思います。

.
├── 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を押したり、パスワードを入力。

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

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

setting.sh

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

#!/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ディレクトリの指定のみ。

[defaults]
inventory = ./inventory

localhost.yml

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

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

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

inventory

localhost

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

[localhost]
127.0.0.1

group_vars

localhost.yml

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

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はよしなに)

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

roles

homebrew

task/main.yml

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

- 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/main.yml

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

- 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/main.yml

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

- 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

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

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

# alias ls='ls -G'

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

" set number

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

vscode

task/main.yml

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

- 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の中身はコメントアウトしています。

{
// "extensions.ignoreRecommendations": true,
// "editor.minimap.enabled": false,
}

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

[
// { "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でMacAppStoreのアプリをインストールすることも可能です。

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

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

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