簡単!! AnsibleでMacのローカル環境を構築する

記事タイトルとURLをコピーする

3月にサーバーワークスにJoinした、たかえす です。初ブログですがよろしくお願いします! 前職でも使っていたAnsibleについて書いていきます。

はじめに

PCを買い換える時などローカル環境の状態や設定情報がどうなっているか分からなくて、買い替え後にセットアップするのが大変!ということは「あるある」かなと思います。そんなときにAnsibleなどのプロビジョニングツールを使ってドキュメント化し、自動化しておくととても便利です。事始めということで、Macのソフトウェアパッケージの管理方法を紹介します。

前提条件

パッケージ管理のツールとして以下のものを利用します。

  • Homebrew
    • Macではよく利用される主にCUI関連のパッケージ管理
  • Homebrew Cask
    • GUI関連のツールのパッケージ管理

事前準備

Homebrewのインストール

公式サイトにもありますが、以下のコマンドを実行します。

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

python と ansible をインストール

python と ansible は動かすために必要なので手動でインストールしておきます。

$ brew insatll python
$ brew install ansible

Ansible Playbookによる自動化

ansible-playbook を実行するには インベントリプレイブック を用意します。

インベントリ(inventory)

実行対象のホスト等を記述しているファイルです。 今回は自分のホストのみを対象とするので以下のように localhost とだけ記述したファイルを用意します。 ファイル名はなんでも良いのですが、ここでは hosts とします。

localhost

プレイブック(playbook)

実行タスクを記述したプレイブックのYAMLファイルを作成します。サンプルですが以下のように記述します。 ファイル名はなんでも良いですが、ここでは packages.yml とします。

- hosts: localhost
  connection: local

  vars:
    homebrew_taps:
      - caskroom/cask
      - caskroom/versions
      - homebrew/dupes
      - homebrew/versions
      - homebrew/boneyard
      - homebrew/binary

    homebrew_cask_packages:
      - name: alfred
      - name: appcleaner
      - name: virtualbox
      - name: vagrant
      - name: atom
      - name: bartender
      - name: blisk
      - name: google-chrome
      - name: firefox
      - name: slack

    homebrew_packages:
      - name: awscli
      - name: ansible
      - name: direnv
      - name: fzf
      - name: git
      - name: python
      - name: python3
      - name: terraform
      - name: the_silver_searcher
      - name: tig
      - name: tmux
      - name: zsh

  tasks:
    - name: homebrew update
      homebrew:
        update_homebrew: yes

    - name: homebrew tap
      homebrew_tap:
        name: '{{ item }}'
        state: present
      with_items: '{{ homebrew_taps }}'

    - name: homebrew cask packages install
      homebrew_cask: name={{ item.name }} state=installed
      # ※1 GUIツールをインストールする場所を `/Application` に固定
      environment:
        HOMEBREW_CASK_OPTS: "--appdir=/Applications"
      with_items: '{{ homebrew_cask_packages }}'

    - name: homebrew packages install
      homebrew:
        name: '{{ item.name }}'
        state: '{{ item.state | default("present") }}'
      with_items: '{{ homebrew_packages }}'

プレイブック(playbook)の中身の解説

  • hosts: インベントリに指定したホストを記述します、このホストに対して実行する的なイメージ
  • connection: ローカルに対して実行させたいので local を指定します、通常はsshで接続されます
  • vars: 変数を設定します、ここではインストールしたいパッケージ等を設定しています
  • tasks: 以下のタスクを定義しています
    • homebrewのアップデート
    • tapを設定
    • homebrew caskでGUIツールをインストール
    • homebrew でCUIツールをインストール

※1 homebrew cask でインストールするGUIのツールを /Application 以下にインストールするようにしている理由は、各ツールのバージョン更新はAnsible上では管理せず、各ツールのアップデートの仕組みを利用したいためです。

実行

インベントリファイル hosts とプレイブック packages.yml が存在する前提で次のコマンドで実行します。

$ ansible-playbook -i hosts package.yml

指定した homebrew や homebrew cask のパッケージが自動でインストールされると思います。

おわりに

今回はパッケージソフトウェアだけを管理しましたが、shellモジュールなどを使うことでパッケージ管理以外も自動化することが可能です。ちなみにその他のLinux系のディストリビューションやWindows関連のモジュールも用意されているのでMac以外でも同様に利用できると思います。とてもたくさんのモジュールがあるので、ご参考に。

Ansibleなどのプロビジョニングツールを使って自動化することの最大のポイントは、設定情報などを ドキュメント化 できるという点です。サーバー構築などでもこのようなツールを導入することで何がインストールされどのような設定になっているのかがサーバにログインして調べなくても把握可能で、レビューもやりやすくなります。さらにgithubなどでバージョン管理もできます。
コードとして落としておくととてもメリットがあるしとても便利ですね!