Mac用開発環境設定をできるだけ自動化してみる

先日、MacBook Pro 13インチ Early 2015 を購入したついでに、AnsibleとHomebrewを使って開発ツールやアプリのインストールをできるだけ自動化してみたので、その備忘録を残します。

Xcodeのインストール

何はともあれXcodeが必要なのでターミナルでインストール。

sudo xcodebuild -license

下記を言われた後にダイアログが出たのでインストール。

xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.

一応バージョン確認。

xcodebuild -version

エラーを吐かれる。

error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

とりあえず下記を実行。

xcode-select --install

インストールはされてる模様。

error: command line tools are already installed, use "Software Update" to install updates

パスを確認。

xcode-select -print-path
/Library/Developer/CommandLineTools

よくわからないのでApp Storeから手動でインストール。
しばらく待つ。3時間ほど。

もう一度バージョン確認。

xcodebuild -version
Xcode 8.1
Build version 8B62

もう一度パスを確認。

xcode-select -print-path
/Applications/Xcode.app/Contents/Developer

通っているパスが変わっている。設定が上書きされている模様。
ま、いいや。

Homebrewのインストール

とりあえずMacにデフォルトでインストール済みのrubyを使って…

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

確認

brew doctor
-bash: brew: command not found

パスを通す必要がある模様

その前に不可視ファイルを見えるようにしなければ。

defaults write com.apple.finder AppleShowAllFiles TRUE

Finderを再起動

killall Finder

これで不可視ファイルが見える。
.bash_profileをユーザーディレ直下に作成して下記を記述。

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

もう一度確認

brew doctor
-bash: brew: command not found

パスが通らない。

…と、ここで、usr/local/Homebrewを確認してみるとディレ内が空な事に気づく。
ググるとXcodeの使用許諾にagreeしないとHomebrewがインストールできないことがわかる。

Xcodeを開いてagree。閉じる。

もう一度Homebrewインストールをしてみる。

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

もう一度確認

brew doctor
Your system is ready to brew.

usr/local/Homebrewにファイルが存在するし、Homebrewがインストールできたようだ。

Ansibleのインストール

目的はこれだった。

brew install ansible

確認

ansible --version
ansible 2.2.0.0
config file = 
configured module search path = Default w/o overrides

インストールできた模様。

pythonのインストール

一応、入れておく。

brew install python

確認

python -V
Python 2.7.12

OK。小文字の -vで実行すると、よくわからないことになる。

Homebrew Caskのインストール

プロビジョニングファイルの作成の前にGUIアプリ管理用のCaskをインストール。先に入れておけばインストールしたいアプリのnameを調べられるので。

brew install caskroom/cask/brew-cask

Homebrew Caskオプションの設定を.bash_profileに追記

export HOMEBREW_CASK_OPTS="--appdir=/Applications"

PATH設定の反映

source ~/.bash_profile

プロビジョニングファイルの作成

設定ファイル格納ディレを下記の名前でユーザーディレ直下に作成

mac-provisioning-ansible

cdしてファイル作成していく。

inventoryファイルの作成

echo 'localhost' > hosts

(hostsファイルを作成して’localhost’を記述の意味)

playbookファイルの作成

ファイル名はlocalhost.ymlにしておく。

Macの開発環境構築をAnsibleで自動化する | QUARTETCOM TECH BLOGを参考にさせてもらって、homebrewをアップデートするだけの記述をしてみる。

- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  tasks:
    # homebrewをアップデート
    - name update homebrew
    homebrew: update_homebrew=yes

実行してみる。

ansible-playbook -i hosts -vv localhost.yml

動いたけどWARNINGが出る。

[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and 
make sure become_method is 'sudo' (default).
This feature will be removed in a 
future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.

Ansible ver1.9からはsudoをbecomeにすればいいらしい。
記述を変更し、もう一度実行するとWARNINGは出なくなった。
さらにググると書き方そのものがver1.9から色々と変わっていることがわかり、このあと、先人のGitHubを漁ることになる。

nodebrewのインストール

playbookファイルに記述して、nodebrewを自動インストールする前に試しに手動インストールしてみる。

brew install nodebrew

.bash_profileに下記を追記。

export PATH=$HOME/.nodebrew/current/bin:$PATH

nodejs安定版のインストール

A.インストール

nodebrew install-binary stable

ディレクトリが無い、と怒られる。

B.ホーム直下にディレクトリ作成

$ mkdir ~/.nodebrew
$ mkdir ~/.nodebrew/src

srcディレを.nodebrewディレ内に作る必要あり。

再度実行。

nodebrew install-binary stable

インストールできたようなので、nodeのバージョンを確認。

nodebrew ls
v7.1.0
current: none

C.使用するnodeのバージョンを指定。

nodebrew use v7.1.0

nodeが使えるようになっているか確認するため使用中のバージョンを確認。

node -v
v7.1.0

npmも確認。

npm -v
3.10.9

このあと、ディレクトリ作成B以外のAとCを自動化することにした。

2016.12.23追記

Bを自動化するため、[ansible]ディレクトリ作成はfileモジュールで! – ADACHIN SERVER Labを参考にnodebrew/tasks/main.ymlに下記を追加しました(ディレクトリリスト変数はlocalhost.ymlに)。

- name: nodebrewインストール用ディレクトリの存在チェック
  stat:
    path: "{{ home_dir }}/{{ nodebrew_dir }}"
  register: nb_directory_created
- name: nodebrewインストール用ディレクトリ作成
  file: 
    path: "{{ home_dir }}/{{ item.name }}"
    state: directory
    mode: 0755
  when: not nb_directory_created.stat.exists
  with_items: "{{ nodebrew_dir }}"

rbenvのインストール

こちらも自動インストールはせず、まずは手動で。

brew install rbenv

.bash_profileに下記を追記。

eval "$(rbenv init -)”

eval “$(rbenv init -)”は、$RBENV_ROOT/shimsをPATHに追加するために必要。

現時点でインストールされるべきrubyの安定版バージョンを調べる。
rbenvでRubyの最新安定版をインストールするワンライナー | mawatari.jpを参考にさせていただいた。

rbenv install -l | grep -v - | tail -1
2.3.3

rubyインストールについてはこのあと、自動化のためのplaybookを作成し、そのまま走らせてみた。
うまくいった。

rbenvのデフォルトルートディレクトリを確認

rbenv root
/Users/(ユーザー名)/.rbenv

使用中のrubyのバージョンを確認(ruby -v でもいい)

rbenv version
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

ツール類のインストール

よく使うツールを手動インストール

Grunt

sudo npm install -g grunt-cli

Bower

npm install -g bower

このあと、playbookに追加し、テストで走らせる。gemの処理も追加した。

実行コマンドのMakefile化

2016.12.22追記

https://github.com/takuan-osho/macbook-provisioning/blob/master/Makefileを参考にさせていただきました。

playbook:
    @ansible-playbook -i hosts -vv localhost.yml
    @echo
    @echo "Provisioning finished."

現時点のlocalhost.yml

- hosts: localhost
  connection: local
  gather_facts: no           
  become: no
  environment:
    HOMEBREW_CASK_OPTS: "--appdir=/Applications"
  roles:
    - homebrew
    - homebrew-cask
    - ruby-build
    - nodebrew
  vars:
    homebrew_taps:
      - homebrew/binary
      - homebrew/dupes
      - caskroom/cask
    homebrew_packages:
      - { name: openssl }
      - { name: openssl, state: linked, install_options: force }
      - { name: python }
      - { name: ansible }
      - { name: git }
      - { name: nodebrew }
      - { name: readline }
      - { name: rbenv }
      - { name: ruby-build }
      - { name: imagemagick }
    homebrew_cask_packages:
      - { name: iterm2 }
      - { name: firefox }
      - { name: google-chrome }
      - { name: java }
      - { name: skype }
      - { name: alfred2 }
      - { name: sublime-text2 }
      - { name: evernote }
      - { name: dropbox }
      - { name: filezilla }
      - { name: vagrant }
      - { name: virtualbox }
      - { name: kindle }
      - { name: libreoffice }
    rbenv_global_gems:
      - compass
    npm_global_packages_user:
      - grunt-cli
      - bower

見渡しを良くするために、あえてインストールする開発ツールやアプリはlocalhost.ymlに入れてみた。
role分けは、いきなり行ったわけではなく作りながら行った。

nodebrewやrbenvの処理は下記をかなり参考(というかほぼコピー)にさせていただいた。
https://github.com/djyugg/ansible-role-nodebrew/blob/master/tasks/main.yml
https://github.com/hnakamur/ansible-role-osx-rbenv/blob/master/tasks/main.yml

完全自動化までは、ほど遠い。

…というわけで一旦GitHubに上げてます。
https://github.com/skrd/mac-provisioning-ansible

Author

  • Shinichi Kuroda - 黒田晋一
  • 香川県高松市 - Takamatsu-shi, Kagawa, Japan.
  • Mail - info@studiobusstop.com