2016年くらい(?)に流行った、Macの開発環境構築を Ansible で自動化するお話。
新しい Mac を手に入れたときオレオレ環境を再現する用途がほとんどだと思います。
クラウドにインスタンスを立ててリモート開発環境で快適に。というのが主流になりつつある昨今需要は減っているかもしれません。
それでも
- このアプリ入ってないの?(ハイッテヘンヨ!)
- この vscode 拡張のこの設定は必須でしょ。(シランモン!)
- 必要なツールどっかの wiki にあるよ。(ドコヤネン!)
というのは(たぶん)起こっているはず。
そんなお困りごとを解決できればいいなと思い、テンプレートを作成しました。
基本的にはメンテするのは1つの yml ファイルだけでよい作りになっています。
※ 今回「全部シェルでええやん」はご勘弁くださいmm
できるもの
https://github.com/kohbis/mac-ansible/tree/template
Ansibleとは
- 構成管理/オーケストレーション/デプロイメント ツール
- RedHat 社が開発
- エージェントレス
- 処理を playbook(yaml 形式)で管理
参考
構成
今回は最小限の構成で、そこからカスタマイズできるテンプレートにしています。
エディタは 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 tools
と homebrew
をインストールし、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]
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 list --cask | 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: ''
state: present
with_items: ''
- name: homebrew packages install
homebrew:
name: ''
state: 'present'
with_items: ''
tags:
- homebrew
homebrew_cask
task/main.yml
GUI アプリもインストールできるのが、homebrew のいいところだと思います。
インストール先は /Applications
を明示しておきます。
- block:
- name: homebrew cask packages install
homebrew_cask: name= state=installed
environment:
HOMEBREW_CASK_OPTS: "--appdir=/Applications"
with_items: ''
tags:
- homebrew_cask
dotfiles
task/main.yml
templates からホームディレクトリにコピーします。 個人用には随時アップデートしたくなると思うので、別リポジトリで管理してシンボリックリンクをはるのがおすすめです。
- block:
########
# copy #
########
- name: copy dotfiles
template:
src: template
dest: ~/
with_items: ''
#################
# symbolic link #
#################
# - name: checkout dotfiles
# git:
# repo: https://github.com/{your_repository}/dotfiles.git
# dest: ~/dotfiles
# - name: create symlinks
# file:
# src: ~/dotfiles/
# dest: ~/
# state: link
# force: yes
# with_items: ''
tags:
- dotfiles
templates/.bash_profile
.bash_profile
は初期のままで大丈夫でしょう。
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
templates/.bashrc
特に prompt 表示や alias を共有できるのは便利です。
# alias ls='ls -G'
templates/.vimrc
vim の 沼 設定も移行できます。
" set number
vscode
task/main.yml
library ディレクトリは、先んじて作成しておきます。
vscode だと管理したい設定ファイルは、setting.json
と keybinding.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 "
with_items: ''
tags:
- vscode
task/settings.json
json の中身はコメントアウトしています。 vscode 本体や拡張機能の詳細な設定、コード規約(後者は各 project で管理したいところですが)などを共有できると何かと便利です。
{
// "extensions.ignoreRecommendations": true,
// "editor.minimap.enabled": false,
}
task/keybindings.json
keybinding は個人の趣向があるので、あまり必要ないかもしれませんね。
[
// { "key": "cmd+shift+k", "command": "workbench.action.terminal.focusNext" },
// { "key": "cmd+shift+j", "command": "workbench.action.terminal.focusPrevious" },
]
最後に
このポスト以外にも、できることはまだまだあります。
GitHub で mac-ansible
等で検索すれば、先人たちの恩恵を受けられます。
https://github.com/search?q=mac-ansible
mas-cli を用いれば AppStore のアプリインストールも可能です。
一応筆者の ansible-playbook の URL を貼っておきます。 https://github.com/kohbis/mac-ansible (完全自分用で master を更新しまくっているのでご参考までに)
新しい Mac を渡されて、ある程度のセットアップまではできるのは本当にありがたいですね。
結局みんな好きずきにカスタマイズするでしょうけど笑。