こんにちは。上京したてのエンジニア・まろです。東京がそれほど凍狂でなかったことにすごくほっとしています。漫画の読み過ぎでしょうか。
さて、開発では以下のようなことがよくありますよね。
- WindowsとMacでなんか違う
- ローカルで動いたのに本番で動かない
- Webサーバの複数台構築で、毎回環境構築をするのが面倒
- 構築のドキュメント作成
これらは“ふわっとしているけども悩ましい”ことばかりです。そこで、上記のような悩みを解決してくれる「Ansible」を使い、本番と同じシステムを仮想環境に構築してみます。
さらにそれをファイルとして持つことで、本番環境構築時に同じ環境をコマンドで複数台立ち上げて効率化をしてみようと思います。
今回は、はじめてのAnsibleということで、ローカル環境の構築をやってみたいと思います。
Ansibleとは
「END THE DRUDGERY」を掲げ、サーバ構築を自動化し面倒な作業から開放されよう、という楽しげなオープンソースです。
ロゴがかっこいいですね。
用意するもの
- MacOS X
- Vagrant
- VirtualBox
Ansibleで構築を操作するサーバを管理側(Mac)、Ansibleで作るLAMP環境を構築側(VirtualBox)として、早速動かしてみます。
Vagrantのインストールと仮想マシンのセットアップ
さくっといきますね。
Vagrant、VirtualBoxのインストール
どちらも公式サイトからdmgをダウンロードし、インストーラーに従ってインストールすればOKです。
VirtualBoxは、環境設定のネットワークからホストオンリーネットワーク、vboxnet0を選択し、アダプターのIPv4アドレスを確認しておきましょう。このネットワーク上に仮想マシンを構築します。確認できたら、そのままOKを押して設定を終了します。
- Vagrant
http://www.vagrantup.com/downloads
- 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
動いてます。
完了後、http://192.168.59.34/にアクセスしてapacheの起動を確認してみましょう。
できました!
DBはどうでしょう.
$ ssh vagrant@192.168.59.34 $ mysql -u root -p mysql>
動いてます!
まとめ
Ansibleの特徴は、構築側にsshで接続さえできれば何も用意する必要がない、というところにあります。
ひとまずplaybookを作成すれば、この構成を本番環境で作成するときにもplaybookから構築ができるので、サーバ台数が多いほど効率化できるのではないでしょうか。
開発環境の共有にも大いに役立ちそうです。playbookの書き方については、より良い書き方ができるようになれば、と思います。
それでは。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。