AnsibleでMacの開発環境構築にチャレンジしてみた

2018.11.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

会社から新しいMacが支給されました。
せっかく新しいおもちゃを手に入れたのに普通にインストールするのもどうなんだろうと思い
今後新しいPCに移行した時などのメンテナンス性を考え、本記事では構成管理ツールのAnsibleを使って環境構築にチャレンジします!
Macのセットアップは久しぶりです。今はMacのセットアップにAnsibleを使うというのも一般的みたいですね。

はじめに

ちなみに支給されたMacのスペックはざっと以下のような感じです。

  • Mac Book Pro (13-inch, 2018, Four Thunderbolt 3 Ports)
  • macOS High Sierra 10.13 / メモリ 16GB

Ansibleをインストール

さっそく始めていきます。 Terminalも開きつつ下記を実施。

  1. Xcodeをインストール
  2. $ sudo easy_install pip
  3. $ sudo pip install ansible
  4. $ sudo pip install ansible --upgrade
  5. ansible.cfg を設置
    $ sudo mkdir /etc/ansible
    $ sudo curl -L https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg -o /etc/ansible/ansible.cfg

    Ansible入りましたー。

Ansibleの設定ファイル作成と実行

Homebrewのインストール

Ansibleの前に先にHomebrewを入れてしまいます。公式サイトに従い実施。

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

Playbookファイル

AnsibleのPlaybookファイルをYAML形式のファイルで作成します。
いったん、下記のような内容のファイルになりました。

  • main.yml
---
- name: Mac Setup
  # https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html#local-playbooks
  hosts: 127.0.0.1
  connection: local
  # https://docs.ansible.com/ansible/latest/user_guide/become.html#id1
  # become: yes
  vars:
    brew_taps:
      - homebrew/core
      - caskroom/cask
    brew_cask_apps:
      - alfred
      - clipy
      - docker
      - firefox
      - google-chrome
      - google-japanese-ime
      - google-hangouts
      - iterm2
      - licecap
      - snip
      - visual-studio-code
    brew_packages:
      - autoconf
      - awscli
      - bash-completion
      - docker-compose
      - docker-machine
      - doxygen
      - git
      - git-lfs
      - jq
      - nmap
      - openssl
      - ssh-copy-id
      - tig
      - tree
      - wget
      - zsh
      - zsh-syntax-highlighting

  # pre_tasks:
    ## https://brew.sh/
    # - name: Install Homebrew
    #   command: '/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"'

  tasks:
    # https://docs.ansible.com/ansible/2.7/modules/homebrew_tap_module.html
    - name: Homebrew tap
      homebrew_tap:
        name: "{{ item }}"
        state: "present"
      with_items: "{{ brew_taps }}"

    # https://docs.ansible.com/ansible/2.7/modules/homebrew_cask_module.html
    - name: Install Homebrew Cask Packages
      homebrew_cask:
        name: "{{ item }}"
        state: "present"
        install_options: "appdir=/Applications"
        accept_external_apps: yes
      with_items: "{{ brew_cask_apps }}"

    # https://docs.ansible.com/ansible/2.7/modules/homebrew_module.html
    - name: Update Homebrew
      homebrew:
        update_homebrew: yes

    - name: Install Homebrew Packages
      homebrew:
        name: "{{ brew_packages }}"
        state: "present"

Inventoryファイル

ローカル環境への適用なのでインベントリのファイルは下記の内容で作成しています。

  • inventory
[localhost]
127.0.0.1

実行

上記で最低限必要なファイルが揃った状態です。Githubの方にもあげています
準備が整ったので下記のコマンドで実行します。

$ ansible-playbook main.yml -i inventory

ちなみに

Homebrewのモジュールの実行時に警告メッセージが出ていました。
実は最初古い書き方で実行していたため下記のメッセージが出ていまして
推奨される書き方に変更したという経緯があります。

[DEPRECATION WARNING]: Invoking "homebrew" only once while using a loop via 
squash_actions is deprecated. Instead of using a loop to supply multiple items 
and specifying `name: {{ item }}`, please use `name: u'{{ brew_packages }}'` 
and remove the loop. This feature will be removed in version 2.11. Deprecation 
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

公式サイトのココ とかココ をみると、「with_」で指定すると指定した項目毎にモジュール呼び出しが発生してしまうので 「リストパラメータ」として渡して最適化をするということのようです。   

https://github.com/ansible/ansible/issues/31367

It seems like this PR ( #16966 ) put homebrew into the squash_actions list, but forgot to add homebrew_cask.

ただ上記のissueをみる感じ、Homebrew_caskモジュールの方は対応中のステータスっぽいでしょうか。
Homebrewのモジュールを使っている箇所だけ下記のように変更しました。

  • 旧)
    - name: Install Homebrew Packages
      homebrew:
        name: "{{ item }}"
        state: "present"
      with_items: "{{ brew_packages }}"
  • 新)
    - name: Install Homebrew Packages
      homebrew:
        name: "{{ brew_packages }}"
        state: "present"

まとめ

AnsibleはHomebrewのモジュールも用意されていてMacの環境構築がとても楽にできそうな印象でした。
新しいPCに移行する時のことを考えるともう少しAnsibleで環境構築を自動化しておきたいものです。