Mac OSXの環境構築を半自動化した
そろそろ大学の講義に資料閲覧用としてMacBookPro(非Retina)持って行きたいなぁと思いつつも,5年くらい使い続けている年季物なのでこれを機にクリーンインストールしました.
ついでに,Git,Homebrew,Ansibleを組み合わせて環境構築を(半)自動化しました.
一応,今回作成した設定ファイルやシェルスクリプトなどはGitHubにあげておきます.
Ansibleとは
Ansibleとは,RedHat社が開発している環境構築ツールです.設定ファイルは構文が明解なYAMLで書くので,初心者にもとっつきやすいです.
さくらのナレッジさんの記事による説明がわかりやすいです.
前提
OSX El Capitanをクリーンインストールした直後のMacを想定しています.
10.11.4で動作したことは確認しました.
Mac環境構築の(半)自動化手順
Xcodeのインストール
次のコマンドでXcodeをインストールします.
1 |
$ sudo xcodebuild -license |
Homebrewのインストール
公式が推奨(?)しているワンラインでインストール
1 |
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \ |
Ansibleのインストール
brew
でインストール
1 |
$ brew install ansible |
Ansibleの設定
まずは作業用のディレクトリを作成します.今回ディレクトリ名はmac-provisioningとしました.
1 2 |
$ mkdir mac-provisioning $ cd mac-provisioning |
次に,環境構築対象ホスト指定ファイル(hosts)を作成します.今回はリモートで構築とかはしないので,localhostだけです.
1 2 |
$ cat hosts localhost |
プロビジョニングファイルを作成します.作成の際はこちらのサイトを参考にさせて頂きました.
2016/9/19追記
HomebrewにおけるHomebrew Caskのパッケージ名がbrew-caskからcaskに変更になったっぽいので,修正してあります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
- hosts: localhost connection: local gather_facts: no sudo: no vars: homebrew_taps: - homebrew/binary - homebrew/dupes - homebrew/science - caskroom/cask homebrew_packages: - { name: openssl } - { name: openssl, state: linked, install_options: force } - { name: python } - { name: ansible } - { name: git } - { name: zsh, install_options: disable-etcdir } - { name: wget } - { name: curl } - { name: cmake } - { name: autoconf } - { name: automake } - { name: tree } - { name: nkf } - { name: tig } - { name: rbenv } - { name: ruby-build } - { name: mysql } - { name: sqlite } - { name: boost } - { name: erlang } - { name: elixir } - { name: gcc } - { name: imagemagick } - { name: libjpeg } - { name: libpng } - { name: libtiff } - { name: libtool } - { name: opencv } - { name: pkg-config } - { name: postgresql } - { name: qt5 } - { name: readline } - { name: sl } - { name: tbb } - { name: xz } - { name: lua } - { name: vim, install_options: with-lua } - { name: git-cal } - { name: peco } - { name: httperf } - { name: autobench } homebrew_cask_packages: - { name: iterm2 } - { name: google-chrome } - { name: chrome-remote-desktop-host } - { name: google-japanese-ime } - { name: adobe-reader } - { name: java } - { name: skype } - { name: slack } - { name: karabiner } - { name: dash } - { name: skitch } - { name: atom } - { name: virtualbox } - { name: mactex } - { name: dropbox } - { name: evernote } - { name: bettertouchtool } - { name: microsoft-office } - { name: xquartz } - { name: inkscape } - { name: appcleaner } - { name: github-desktop } - { name: lyrics-master } - { name: sequel-pro } - { name: cyberduck } - { name: wireshark } - { name: vlc } - { name: skim } - { name: gimp } - { name: steam } - { name: alcatraz } tasks: - name: add tap repositories of homebrew homebrew_tap: tap={{ item }} state=present with_items: homebrew_taps - name: update homebrew homebrew: update_homebrew=yes # brew - name: install brew packages homebrew: > name={{ item.name }} state={{ item.state | default('latest') }} install_options={{ item.install_options | default() | join(',') if item.install_options is not string else item.install_options }} with_items: homebrew_packages register: brew_result - name: create directory for brew package information file: path=brew_info state=directory - name: save brew package information shell: brew info {{ item }} > brew_info/{{ item }} with_items: brew_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list # cask - name: install homebrew-cask homebrew: name=cask state=latest - name: install cask packages homebrew_cask: name={{ item.name }} state={{ item.state|default('installed') }} with_items: homebrew_cask_packages register: cask_result - name: create directory for cask package information file: path=cask_info state=directory - name: save cask package information shell: brew cask info {{ item }} > cask_info/{{ item }} with_items: cask_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list |
Ansibleの実行
インストールされたアプリケーションのシンボリックリンクを貼るディレクトリを/Applications以下に固定するよう指定してから,Ansibleを実行します(2回目以降はこの工程だけでOK).
1 2 |
$ HOMEBREW_CASK_OPTS="--appdir=/Applications" $ ansible-playbook -i hosts localhost.yml |
先ほどのlocalhost.ymlの内容によってはかなり時間がかかりますので気をつけてください.ちなみに,-vv
オプションや-vvv
オプションもつけるとより詳細なログが得られます(詳細はman ansible-playbook
).
ゆるふわワンライナー
せっかくなのでGitHubにあげてワンライン化しちゃいましょう.
1 |
$ curl -fsL https://raw.githubusercontent.com/kagemiku/mac-provisioning/master/install.sh | sh |
中身はこんな感じです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/bin/sh echo "cloning mac-provisioning repository..." git clone https://github.com/kagemiku/mac-provisioning.git mac-provisioning \ && cd mac-provisioning \ && echo "success" \ || { echo "failure"; exit 1; } echo "installing dotfiles..." git clone https://github.com/kagemiku/dotfiles.git ~/dotfiles \ && ~/dotfiles/install.sh \ && source ~/.bash_profile \ && echo "success" \ || { echo "failure"; exit 1; } echo "installing homebrew..." ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \ && echo "success" \ || { echo "failure"; exit 1; } echo "installing ansible..." brew install python \ && brew install ansible \ && echo "success" \ || { echo "failure"; exit 1; } echo "executing ansible-playbook..." cd ansible \ && ansible-playbook -i hosts localhost.yml \ && cd - \ && echo "success" \ || { echo "failure"; exit 1; } echo "installing zplug..." git clone https://github.com/b4b4r07/zplug ~/.zplug \ && chsh -s /bin/zsh \ && echo "success" \ || { echo "failure"; exit 1; } exit 0 |
あんまり普段シェルスクリプトを書かないので,お作法的にはかなり汚いと思います.まずそうな記述あったらコメントやpull-req等で教えていただけると幸いです.
やってることとしては,
- Mac構築用リポジトリを
git clone
- 自家製dotfilesリポジトリを
git clone
した後,展開 - Homebrewを公式推奨のワンラインでインストール
- AnsibleをHomebrew経由でインストール
ansible-playbook
を実行してHomebrew/Homebrew Caskの各パッケージをインストール- zplugをインストール
- ログインシェルをzshに変更
って感じです.
これからしたいこと
defaults
コマンド使えばキーボードとかの設定もできるっぽいのでそれも自動化しちゃいたい- gitのconfigとかiTermのカラーリングとか諸々も自動化しちゃいたい
- フォント周りも自動化しちゃいたい
- 設定ファイルを整理したい
参考サイト
- Mac の開発環境構築を自動化する (2015 年初旬編)
- Mac OSXの設定をAnsibleで9割以上自動化する
最近のコメント