[meta] Update OS X Ansible role
Add a bootstrap role to update `~/.dotfiles` and run `sudo` once (so that
Homebrew's internal `sudo` calls work).

Also allow for running Ansible from a remote computer onto the target
Mac.
change
commit d07e57d664f424b94a8cdec1c8573669909d0129
author Alpha Chen <alpha.chen@gmail.com>
date
parent 1fb47141
diff --git a/README.md b/README.md
index 875b50ce..29718f24 100644
--- a/README.md
+++ b/README.md
@@ -3,11 +3,34 @@ A new beginning for what used to be my
 appears to be the conventional name of these types of repos nowadays.
 
 This uses [Ansible](https://github.com/ansible/ansible) to provision new
-machines and [stow](http://www.gnu.org/software/stow/) for managing conf
-files that can be symlinked.
+machines.
 
 # Usage
 
+There are two ways to go about using this - either locally or remotely. The main
+difference is that OS X application settings are only copied over when running
+this on a remote machine.
+
+Either way, we start with installing Xcode:
+
+``` shell
+xcode-select --install
+open 'https://itunes.apple.com/us/app/xcode/id497799835?mt=12'
+sudo xcodebuild -license
+```
+
+**After running Ansible**, the bootstrap `~/.dotfiles` directory can be removed
+and replaced with a symlink to the canonical repo location on Dropbox and SSH
+keys can be populated with the included script:
+
+``` shell
+rm -rf ~/.dotfiles
+ln -s ~/Dropbox/dotfiles ~/.dotfiles
+ruby ~/.dotfiles/ansible/scripts/setup_ssh_keys.rb
+```
+
+## Local
+
 ``` shell
 # Install Homebrew
 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
@@ -18,20 +41,23 @@ brew install ansible
 # Clone dotfiles
 git clone --recursive https://github.com/kejadlen/dotfiles.git ~/.dotfiles
 
-# Xcode
-open 'https://itunes.apple.com/us/app/xcode/id497799835?mt=12'
-sudo xcodebuild -license
-
 # Run Ansible
 cd ~/.dotfiles/ansible && ansible-playbook main.yml --ask-sudo-pass
 rm -f ~/*.retry
+```
 
-# Post-Dropbox syncing
-rm -rf ~/.dotfiles
-ln -s ~/Dropbox/dotfiles ~/.dotfiles
-ruby ~/.dotfiles/ansible/scripts/setup_ssh_keys.rb
+## Remote
+
+On the remote machine, SSH access must first be enabled (under System
+Preferences -> Sharing) and the Xcode Command Line Tools need to be installed
+(`xcode-select --install`).
+
+``` shell
+cd ~/.dotfiles/ansible && ansible-playbook main.yml --ask-pass --ask-sudo-pass
 ```
 
+# Misc
+
 To update submodules:
 
 ``` shell
diff --git a/ansible/main.yml b/ansible/main.yml
index fe8bef38..d5214b4f 100644
--- a/ansible/main.yml
+++ b/ansible/main.yml
@@ -1,5 +1,5 @@
-- hosts: local
-  connection: local
+- hosts: all
   roles:
+    - bootstrap
     - osx
-    - dotfiles
+    # - dotfiles
diff --git a/ansible/roles/bootstrap/tasks/main.yml b/ansible/roles/bootstrap/tasks/main.yml
new file mode 100644
index 00000000..b53acfe0
--- /dev/null
+++ b/ansible/roles/bootstrap/tasks/main.yml
@@ -0,0 +1,9 @@
+---
+- git:
+    repo: https://github.com/kejadlen/dotfiles.git
+    recursive: yes
+    dest: ~/.dotfiles
+    force: no
+- name: no-op so that sudo works in Homebrew later
+  ping:
+  sudo: True
diff --git a/ansible/roles/dotfiles/tasks/dotfiles.yml b/ansible/roles/dotfiles/tasks/dotfiles.yml
index 1f252e58..e9411991 100644
--- a/ansible/roles/dotfiles/tasks/dotfiles.yml
+++ b/ansible/roles/dotfiles/tasks/dotfiles.yml
@@ -7,12 +7,6 @@
     - stow
   sudo: True
   when: ansible_os_family == "Debian"
-- git:
-    repo: https://github.com/kejadlen/dotfiles.git
-    depth: 1
-    dest: ~/.dotfiles
-    recursive: yes
-    force: no
 - command: >
     chdir={{ ansible_env.HOME }}/.dotfiles
     stow --stow --target={{ ansible_env.HOME }} {{ item }}
diff --git a/ansible/roles/osx/tasks/bootstrap.yml b/ansible/roles/osx/tasks/bootstrap.yml
new file mode 100644
index 00000000..a634b645
--- /dev/null
+++ b/ansible/roles/osx/tasks/bootstrap.yml
@@ -0,0 +1,10 @@
+---
+- name: ensure that Xcode is installed
+  command: command -v xcodebuild
+
+- stat: path=/usr/local/bin/brew
+  register: brew
+  ignore_errors: True
+- name: install homebrew
+  shell: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+  when: brew.stat.exists == False
diff --git a/ansible/roles/osx/tasks/casks.yml b/ansible/roles/osx/tasks/casks.yml
index 7859ae41..d63eb068 100644
--- a/ansible/roles/osx/tasks/casks.yml
+++ b/ansible/roles/osx/tasks/casks.yml
@@ -1,11 +1,11 @@
 ---
 - include_vars: casks.yml
+
 - file: path={{ ansible_env.HOME }}/Applications state=directory
+
 # - homebrew: name=caskroom/cask/brew-cask state=upgraded
 - homebrew_tap: name=caskroom/cask state=present
 - homebrew: name=brew-cask state=present
+
 - homebrew_cask: name={{ item }} state=installed
   with_items: casks
-- command: defaults write {{ item }}
-  with_items:
-    - com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool false
diff --git a/ansible/roles/osx/tasks/defaults.yml b/ansible/roles/osx/tasks/defaults.yml
index 30068279..5e011756 100644
--- a/ansible/roles/osx/tasks/defaults.yml
+++ b/ansible/roles/osx/tasks/defaults.yml
@@ -1,9 +1,9 @@
 ---
 - include_vars: defaults.yml
-# - command: defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -int 1
-#   sudo: True
+
 - command: defaults write {{ item }}
   with_items: osx_defaults
+
 - command: defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -bool true # tap to click
 # - command: defaults write {{ item }} dontAutoLoad -array
 #     /System/Library/CoreServices/Menu Extras/TimeMachine.menu
@@ -15,6 +15,7 @@
 #     - Set :DesktopViewSettings:IconViewSettings:arrangeBy grid
 #     - Set :FK_StandardViewSettings:IconViewSettings:arrangeBy grid
 #     - Set :StandardViewSettings:IconViewSettings:arrangeBy grid
+
 - command: killall {{ item }}
   with_items:
     - Finder
diff --git a/ansible/roles/osx/tasks/dock.yml b/ansible/roles/osx/tasks/dock.yml
index c545683c..ce20fbdc 100644
--- a/ansible/roles/osx/tasks/dock.yml
+++ b/ansible/roles/osx/tasks/dock.yml
@@ -1,7 +1,7 @@
 ---
 - homebrew: name=dockutil state=present
-- command: dockutil --remove all
-- command: dockutil --add ~/Downloads --view list
+- command: /usr/local/bin/dockutil --remove all
+- command: /usr/local/bin/dockutil --add ~/Downloads --view list
                                       --display stack
                                       --sort datemodified
 - homebrew: name=dockutil state=absent
diff --git a/ansible/roles/osx/tasks/fonts.yml b/ansible/roles/osx/tasks/fonts.yml
index 9679213f..ed3bc52c 100644
--- a/ansible/roles/osx/tasks/fonts.yml
+++ b/ansible/roles/osx/tasks/fonts.yml
@@ -1,5 +1,7 @@
 ---
 - include_vars: fonts.yml
+
 - homebrew_tap: tap=caskroom/fonts state=present
+
 - homebrew_cask: name={{ item }} state=installed
   with_items: fonts
diff --git a/ansible/roles/osx/tasks/formulae.yml b/ansible/roles/osx/tasks/formulae.yml
index a720eccf..397dbf18 100644
--- a/ansible/roles/osx/tasks/formulae.yml
+++ b/ansible/roles/osx/tasks/formulae.yml
@@ -1,6 +1,8 @@
 ---
 - include_vars: formulae.yml
-- homebrew: name={{ item }} state=present
+- homebrew:
+    name: "{{ item.name }}"
+    install_options: "{{ item.install_options | default(omit) }}"
+    state: present
   with_items: formulae
-- homebrew: name=macvim install_options=override-system-vim state=present
-- command: brew linkapps
+- command: /usr/local/bin/brew linkapps
diff --git a/ansible/roles/osx/tasks/main.yml b/ansible/roles/osx/tasks/main.yml
index 18258254..ba3b6888 100644
--- a/ansible/roles/osx/tasks/main.yml
+++ b/ansible/roles/osx/tasks/main.yml
@@ -1,11 +1,14 @@
 ---
-- homebrew: update_homebrew=yes
+- include: bootstrap.yml
 - include: formulae.yml
 - include: dock.yml
 - include: casks.yml
 - include: fonts.yml
 - include: defaults.yml
-- file: path=~/Library/KeyBindings state=directory
-- copy: src=.tmux.conf.local dest=~/.tmux.conf.local
-- copy: src=DefaultKeyBinding.dict dest=~/Library/KeyBindings/DefaultKeyBinding.dict
-- command: open ~/.dotfiles/Alpha.terminal
+
+# - copy: src=.tmux.conf.local dest=~/.tmux.conf.local
+
+# - file: path=~/Library/KeyBindings state=directory
+# - copy: src=DefaultKeyBinding.dict dest=~/Library/KeyBindings/DefaultKeyBinding.dict
+
+# - command: open ~/.dotfiles/Alpha.terminal
diff --git a/ansible/roles/osx/vars/casks.yml b/ansible/roles/osx/vars/casks.yml
index da903e52..88b11f7b 100644
--- a/ansible/roles/osx/vars/casks.yml
+++ b/ansible/roles/osx/vars/casks.yml
@@ -1,5 +1,6 @@
 ---
 casks:
+  - 1password
   - adium
   - alfred
   - bittorrent-sync
@@ -11,7 +12,6 @@ casks:
   - google-chrome
   - mailbox
   - moom
-  - onepassword
   - plug
   - qlmarkdown
   - qlstephen
diff --git a/ansible/roles/osx/vars/defaults.yml b/ansible/roles/osx/vars/defaults.yml
index f7e1fcaf..185e35e3 100644
--- a/ansible/roles/osx/vars/defaults.yml
+++ b/ansible/roles/osx/vars/defaults.yml
@@ -1,5 +1,8 @@
 ---
-osx_defaults: # named osx_defaults since there's an Ansible conflict w/defaults
+osx_defaults:
+  # This is named `osx_defaults` since there's an Ansible conflict when this key
+  # is named just `defaults`.
+
   - -g NSDisableAutomaticTermination -bool true # Don't quit idle applications
 
   - NSGlobalDomain AppleFontSmoothing -int 2 # subpixel rendering on non-Apple LCDs
@@ -19,9 +22,6 @@ osx_defaults: # named osx_defaults since there's an Ansible conflict w/defaults
   - com.apple.dock mineffect -string scale # minimize windows using the scale effect
   - com.apple.dock mru-spaces -bool false # don't rearrange spaces
   - com.apple.dock orientation -string left
-  # - com.apple.dock pinning -string start # don't center the dock
-  # - com.apple.dock showhidden -bool true # translucent icons for hidden apps
-  # - com.apple.dock workspaces-auto-swoosh -bool false # don't switch to a space w/open windows for the app
   - com.apple.dock wvous-bl-corner -int 10 # set the bottom left hot corner to sleep the display
   - com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
   - com.apple.driver.AppleBluetoothMultitouch.trackpad DragLock -int 1
@@ -30,17 +30,9 @@ osx_defaults: # named osx_defaults since there's an Ansible conflict w/defaults
   - com.apple.finder FXEnableExtensionChangeWarning -bool false # don't ask when changing file extension
   - com.apple.finder FXPreferredViewStyle -string Nlsv # default to list view
   - com.apple.finder QLEnableTextSelection -bool true # enable text selection in QuickLook
-  # - com.apple.finder ShowPathbar -bool true # show path bar
-  # - com.apple.finder ShowStatusBar -bool true # show status bar
   - com.apple.finder _FXShowPosixPathInTitle -bool true # show full path in Finder
-  # - com.apple.gamed Disabled -bool true
-  # - com.apple.iTunes NSUserKeyEquivalents -dict-add "Target Search Field" "@F" # remap cmd+f to find in iTunes
-  # - com.apple.iTunes invertStoreLinks -bool true
   - com.apple.screencapture disable-shadow -bool true # no window shadows when capturing windows
   - com.apple.screencapture location ~/Downloads
   - com.apple.screensaver askForPassword -int 1
-  # - com.apple.systemuiserver menuExtras -array
-  #   "/System/Library/CoreServices/Menu Extras/AirPort.menu"
-  #   "/System/Library/CoreServices/Menu Extras/Volume.menu"
-  #   "/System/Library/CoreServices/Menu Extras/Clock.menu"
-  # - com.apple.terminal StringEncodings -array 4 # UTF-8 in Terminal
+
+  - com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool false
diff --git a/ansible/roles/osx/vars/formulae.yml b/ansible/roles/osx/vars/formulae.yml
index db632bf7..1b49fa1d 100644
--- a/ansible/roles/osx/vars/formulae.yml
+++ b/ansible/roles/osx/vars/formulae.yml
@@ -1,16 +1,16 @@
 ---
 formulae:
-  - chruby
-  - ctags
-  - direnv
-  - fasd
-  - git
-  - hub
-  # - macvim # Needs install_options=override-system-vim
-  - ruby-install
-  - reattach-to-user-namespace
-  - the_silver_searcher
-  - tmux
-  - tree
-  - youtube-dl
-  - zsh
+  - name: chruby
+  - name: ctags
+  - name: direnv
+  - name: fasd
+  - name: git
+  - name: macvim
+    install_options: override-system-vim
+  - name: ruby-install
+  - name: reattach-to-user-namespace
+  - name: the_silver_searcher
+  - name: tmux
+  - name: tree
+  - name: youtube-dl
+  - name: zsh