Ansible初心者がLAMP環境の構築を自動化する方法


Ansible初心者がLAMP環境の構築を自動化する方法

こんにちは。上京したてのエンジニア・まろです。東京がそれほど凍狂でなかったことにすごくほっとしています。漫画の読み過ぎでしょうか。

さて、開発では以下のようなことがよくありますよね。

  • WindowsとMacでなんか違う
  • ローカルで動いたのに本番で動かない
  • Webサーバの複数台構築で、毎回環境構築をするのが面倒
  • 構築のドキュメント作成

これらは“ふわっとしているけども悩ましい”ことばかりです。そこで、上記のような悩みを解決してくれる「Ansible」を使い、本番と同じシステムを仮想環境に構築してみます。
さらにそれをファイルとして持つことで、本番環境構築時に同じ環境をコマンドで複数台立ち上げて効率化をしてみようと思います。

今回は、はじめてのAnsibleということで、ローカル環境の構築をやってみたいと思います。

Ansibleとは

END THE DRUDGERY

「END THE DRUDGERY」を掲げ、サーバ構築を自動化し面倒な作業から開放されよう、という楽しげなオープンソースです。
ロゴがかっこいいですね。

用意するもの

  • MacOS X
  • Vagrant
  • VirtualBox

Ansibleで構築を操作するサーバを管理側(Mac)、Ansibleで作るLAMP環境を構築側(VirtualBox)として、早速動かしてみます。

Vagrantのインストールと仮想マシンのセットアップ

さくっといきますね。

Vagrant、VirtualBoxのインストール

どちらも公式サイトからdmgをダウンロードし、インストーラーに従ってインストールすればOKです。

VirtualBoxは、環境設定のネットワークからホストオンリーネットワーク、vboxnet0を選択し、アダプターのIPv4アドレスを確認しておきましょう。このネットワーク上に仮想マシンを構築します。確認できたら、そのままOKを押して設定を終了します。

  • Vagrant
  • Vagrant

 

boxの立ち上げと、Vagrantfileから仮想マシンの起動

$ cd ~
$ mkdir ansible
$ cd ansible
$ vagrant init chef/centos-6.5

これでcentOS立ち上げの元となるVagrantfileを取得します。
Vagrantfileが生成されているので、これを編集します。

#config.vm.box = "chef/centos-6.5" #ここをコメントして、下記を追加
  config.vm.define "web" do |node|
    node.vm.box = "chef/centos-6.5"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.59.34"
  end

構築側のcentOSを起動します。少し待ちます。

$ vagrant up

管理側でのAnsibleセットアップ

まずはAnsibleをインストールします。

$ brew install ansible

これまた簡単ですね。
鍵の作成と登録で、構築側へログインできるようになります。

$ cd ~
$ ssh-keygen -t rsa
$ cat .ssh/id_rsa.pub | ssh vagrant@192.168.59.34 "cat >> .ssh/authorized_keys"
$ echo "[web]" > hosts
$ echo "192.168.59.34" > hosts
$ ssh vagrant@192.168.59.34

vagrantのパスワードは初期値でvagrantですので、それを入力し、sshでログインしてみます。

$ ansible web -i hosts -m ping -u vagrant #-iは対象サーバの記述したファイル -m はモジュールファイル -u はユーザ名
#このような以下の返答があればansibleでの接続は成功です。
#エラーの場合は~/.ssh/configやchmod 600してみましょう。
192.168.59.34 | success >> {
    "changed": false,
    "ping": "pong"
}

playbookでの構成管理と実行

ここからが本番です。playbookという、サーバで何をするかを書いたレシピのようなものを作成し、実行していきます。

$ vi playbook.yml
#以下のうように書いていきます
- hosts: web
  user: vagrant
  sudo: yes
  vars:
        mysql_root_pw: "3bcdj2caS2"
  tasks:
    - name: Install basepackage
      yum: name={{ item }} state=present
      with_items:
        - wget
        - ntp
        - vim
    - name: SELinux Disable
      command: setenforce 0
      ignore_errors: True
    - name: Edit selinux config
      command: sed -i -e "s/^SELINUX=enforing/SELINUX=disabled/g" /etc/selinux/config
    - name: stop iptabes
      service: name=iptables state=stopped
    - name: Install apache
      yum: name=httpd state=latest
      notify:
        - restart apache
    - name: Install php
      yum: name={{ item }} state=present
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
        - php-gd
      notify:
        - restart apache
    - name: Install mysql
      yum: name=mysql-server state=installed
      notify:
        - mysql setup
        - mysql set password
  handlers:
    - name: restart apache
      service: name=httpd state=restarted enabled=yes
    - name: mysql setup
      service: name=mysqld state=started enabled=yes
    - name: mysql set password
      command: mysqladmin -u root password "{{ mysql_root_pw }}"

コマンドを上記のように、
name:で何をするか、yumやcommand、serviceで動作を指定、といったように非常にシンプルに記述できます。

遂に実行のときです!

$ ansible-playbook playbook.yml

動いてます。

ansible_running

完了後、http://192.168.59.34/にアクセスしてapacheの起動を確認してみましょう。

ansible_complete

できました!

DBはどうでしょう.

$ ssh vagrant@192.168.59.34
$ mysql -u root -p
mysql>

動いてます!

まとめ

Ansibleの特徴は、構築側にsshで接続さえできれば何も用意する必要がない、というところにあります。

ひとまずplaybookを作成すれば、この構成を本番環境で作成するときにもplaybookから構築ができるので、サーバ台数が多いほど効率化できるのではないでしょうか。

開発環境の共有にも大いに役立ちそうです。playbookの書き方については、より良い書き方ができるようになれば、と思います。

それでは。

この記事を書いた人

まろ
まろ フロントエンドエンジニア 2014年入社
フロントエンドエンジニアのまろCです。
コンセプト設計中心でものづくりしています。