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などでバージョン管理もできます。
コードとして落としておくととてもメリットがあるしとても便利ですね!