2015 年 1 月 2 日

Ansibleを使ってウェブアプリ開発環境を構築する

Ansibleを使ってウェブアプリ開発環境を構築する

今までChef Soloを使ってプロビジョニングしていましたが、Chef Solo(Chef Zeroへ移行)も廃止となるようなので、この機会にAnsibleも試してみることにしました。

AnsibleはゲストOSへクライアントをインストールする必要もなく、yamlで記述したPlaybook(Chefのrecipeに相当)を元にプロビジョニングします。

ChefのRecipeはRubyのDSLやERBで記述するので、一緒に使うVagrantやCapistranoと同じ形式で統一的に記述できていましたが、Ansibleを使うと、YAML,jinja2テンプレートによる記述を混在させることになります。

しかし、YAMLもjinja2も難しいというわけではないし、Chefも使いこなしていたわけではないので、Ansibleの方が適しているのかなと、少しドキュメントを読み始めました。

Best Practicesあたりを初めてみたときは、簡単とはいえ、やはり新たなファイル構造を覚えるのは面倒だなと感じました。

しかし、少し具体的なPlaybookを書いてみると、割とすんなり理解できるようになりました。

これからAnsibleを試してみようという方に参考になればと、簡単な開発サーバ(PHP+MySQL+Apache)を構築するplaybookを書いてみました。

今後は、デプロイもCapistranoではなく、Ansibleでできそうなので、デプロイにも試してみたいと思います。

環境

  • OS: OSX 10.9.5
  • Python: 2.7.5
  • Ansible: 1.8.2

AnsibleはHomeBrewでインストールしました。

$ brew install ansible

構築するサーバ環境

以下のソフトウェアを一つのVMへインストールします。CentoOS6.5は、VagrantでVM(VirtualBox)にインストールしておきます。

参考にVagrantファイルの内容を載せておきます。

Vagrantファイル

Vagrant.configure(2) do |config|

  config.vm.box = "centos65"
  config.vm.box_url = "https://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140504.box"

  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "public_network", ip: "192.168.207.50"
  config.vm.synced_folder "./webroot", "/webroot", :nfs => true

  config.vm.provider "virtualbox" do |vb|
    vb.name = "centos65-ansible"
  end
end

Ansibleを使って、Vagrantで構成したCentOS6.5に以下のソフトウェアをインストールします。

本来ならwwwサーバ、DBサーバなどロール(役割)ごとにPlaybookをわけて書くのですが、今回は簡単に、開発サーバというロールの中にWWWサーバ、DBサーバも含めることにします。

  • PHP5.4
  • MySQL5.5
  • Apache2.2

構成はBest Practicesに沿って作成していますが、不必要なものは省いています。

ref. Ansible Best Practices

Playbookのディレクトリ構成

provision/
  development # インベントリファイル
  site.yml    # マスタプレイブック
  develop.yml # developサーバのプレイブック
  roles/
    develop/
      files/
        httpd-develop.conf # httpdのコンフィグレーションファイル
      handers/
        main.yml  # httpd,iptablesのリスタートハンドラ
      tasks/
        main.yml # メインタスク
        repo.yml # epel,remiリポジトリの追加
        php.yml  # phpのインストール
        mysql.yml # mysqlのインストール
        httpd.yml # httpdのインストール

PlaybookはGithubにおいてますので、詳しくはそちらを参照してください。

https://github.com/notice/ansible-develop-centos6

インベントリーファイル

AnsibleのPlaybookを実行されるサーバを記述します。

まず、サーバのホスト名またはIPアドレスをインベントリーファイルに記述します。

Vagrantで構成したサーバにはcentosという名前をつけてありますが、IPアドレスでもかまいません。

最初の[server]という記述で、複数のサーバをserverグループでまとめています。今回は一つだけなので、特に必要なわけではありません。

---
# file: development
[server]
centos

Playbookの実行

後は、Playbookを実行するだけです。以下のコマンドを実行します。
-iでインベントリファイルを指定し、最後にマスタプレイブックを指定します。

$ ansible-playbook -i development site.yml

dryrunさせたいときは、--checkを付加します。

$ ansible-playbook -i development site.yml --check

タグでタスクを選択して実行することもできます。次の例は、httpdだけインストールできます。

$ ansible-playbook -i development site.yml --tags httpd

これで簡単なウェブ開発環境ができました。まずは自分で簡単な構成を書いてみると理解が進みますね。