インフラ保守はやらないけど、受託開発で作った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でも作れる。設定ファイルなどのテンプレートエンジンはRubyのLiquidやPHPのTwigと同じ文法のJinja2、ということでRuby党員でも非常に親しみやすいと思う。
Chefが便利っぽいのに使いこなしきれないという人は試してみる価値あり。
練習がてら、構築する機会の多いCentOS6にNginx+Passenger+PostgreSQL環境を作るPlaybookを作ってみました。まだこなれていない感じだけど徐々に調整していきます。