BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

サーバ構成管理ツールAnsibleで楽々構築

インフラ保守はやらないけど、受託開発で作ったWebアプリをサーバにデプロイして納品とすることは多いので、定型的なWeb+DB構成のサーバセットアップ作業を自動化したい。そんな気持ちでChefを触っていたのだけど、そんなしょぼい用途にはちょっと大げさな感じがありました。

今回Chefの代替としてAnsibleを試してみたところ、どうやら自分の用途にはこっちのほうが合っていそう。

Ansibleはまず準備が楽(クライアントがMacならbrew ansibleするだけ)だし、最小構成では対象ホストを列挙したInventoryと、設定手順を記述したPlaybook(Chefでいうところのレシピ)という2つのYAMLファイルを作るだけで良いので、最初のファイル構成や独自のDSLを理解するところでいきなりつまづきがちなChefに比べてかなり敷居が低く感じる。

例えばPostgreSQLサーバを公式Yumリポジトリからインストールして設定ファイルを配置するPlaybookはこんな感じでしょうか。

- hosts: db-servers
  sudo: yes
  vars:
   - postgresql_rpm: http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
  tasks:
    - name: Install PostgreSQL official yum repository
      yum: name={{ postgresql_rpm }} state=present
    - name: Install PostgreSQL server packages
      yum: name={{ item }} state=present
      with_items:
        - postgresql93
        - postgresql93-server
    - name: Initialize PostgreSQL database
      shell: service postgresql-9.3 initdb
             creates=/var/lib/pgsql/9.3/data/postgresql.conf
    - name: Install PostgreSQL config file
      template: src=postgresql.conf.j2
                dest=/var/lib/pgsql/9.3/data/postgresql.conf
                owner=postgres group=postgres mode=0600
    - name: Install PostgreSQL auth config file
      template: src=pg_hba.conf.j2
                dest=/var/lib/pgsql/9.3/data/pg_hba.conf
                owner=postgres group=postgres mode=0600
    - name: Start PostgreSQL
      service: name=postgresql-9.3 state=started enabled=yes

Playbookは再利用しやすいように分割したり、条件分岐やループなどを入れることもできる。そうやって細かく作り込んでいくと、結局は労力もボリュームもChefレシピと大差ないものになるんだけど、ミニマムではシンプルだという敷居の低さは大きいと思う。用途によってはそんなに作り込んだPlaybookは必要ないと思うので。

ChefはRuby製。AnsibleはPython製ということで、Ruby党の自分はChefをひいきしてしまうところだけど、AnsibleはPython製と言ってもこのように設定ファイルはすべてRubyで馴染みの深いYAMLで書くし、追加モジュールはRubyでも作れる。設定ファイルなどのテンプレートエンジンはRubyLiquidPHPTwigと同じ文法のJinja2、ということでRuby党員でも非常に親しみやすいと思う。

Chefが便利っぽいのに使いこなしきれないという人は試してみる価値あり。

練習がてら、構築する機会の多いCentOS6にNginx+Passenger+PostgreSQL環境を作るPlaybookを作ってみました。まだこなれていない感じだけど徐々に調整していきます。

github.com/miyamae/ansible-playbooks