概要
仮想環境構築ツールVagrantと、構成管理ツールAnsibleを使ってローカル環境にWebアプリケーションサーバ2台、ロードバランサ1台を構築し、なんちゃって負荷分散構成を作った時のメモ書きです。
環境はMacを想定しています。他の環境を使用する場合は適宜読み替えて実行してください。
サンプルソースは以下のURLから参照してください。
https://github.com/yuizho/ansible_vagrant_balancer_sample
事前準備
Ansibleのインストール
OS X用パッケージマネージャHomeBrewを使用してAnsibleをインストールする
HomeBrewをまだ導入していない場合、以下のURLを参考に。
http://brew.sh/index_ja.html
$ brew install ansible
Vagrantのインストール
VagranとVirtualBoxのdmgファイルを公式サイトからダウンロードし、メッセージにしたがってインストールする。
https://www.virtualbox.org/wiki/Downloads
https://www.vagrantup.com/downloads.html
HomeBrewを使用する場合、HomeBerwを拡張下Caskを導入すればインストール可能とのこと。
http://qiita.com/moomoo-ya/items/30f9ffdb7dd34caf9ec0
Vagrantのセットアップ
Vagrantの初期化
以下のURLからOSのBoxファイルを選択し、VagrantへBoxを追加する。
その状態でinitコマンドを実行するとVagrantの初期化処理が実行され、Vagrantfileが生成される。
$ vagrant box add centos6.7_minimal https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
$ vagrant init centos6.7_minimal
Vagrantfileの設定
Vagrantfileにサーバ3台分の設定を記述する。
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "centos6.7_minimal"
# appサーバ1
config.vm.define :node1 do |node|
node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
node.vm.network :forwarded_port, guest: 80, host: 8001, id: "http"
node.vm.network :private_network, ip: "192.168.33.11"
end
# appサーバ2
config.vm.define :node2 do |node|
node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
node.vm.network :forwarded_port, guest: 80, host: 8002, id: "http"
node.vm.network :private_network, ip: "192.168.33.12"
end
# balancer
config.vm.define :node3 do |node|
node.vm.network :forwarded_port, guest: 22, host: 2003, id: "ssh"
node.vm.network :forwarded_port, guest: 80, host: 8003, id: "http"
node.vm.network :private_network, ip: "192.168.33.13"
end
end
Vagrantの起動
Vagrantの起動コマンドを実行して、各サーバを起動する。
$ vagrant up
Vagrantのsshコマンドで、各サーバへのログインも可能。
# サーバ名を指定して、sshでログイン
$ vagrant ssh node1
どうやら普通にsftpも使えるみたい。
ファイル転送ツールでVagrantの仮想マシンにアクセスする
# node1のサーバに対してsftpを実行
$ sftp vagrant@192.168.33.11
Ansibleのセットアップ
Inventoryファイルの作成
Vagrantで作成したサーバに対して、Inventoryファイル(hosts)の設定を行う。
Ansible公式ドキュメント Inventory
app, balancerのurlとssh秘密鍵をそれぞれ設定し、すべてのサーバに共通の設定(sshのport, username)については[all:vars]セクション内に設定する。
[app]
192.168.33.11 ansible_ssh_private_key_file=.vagrant/machines/node1/virtualbox/private_key
192.168.33.12 ansible_ssh_private_key_file=.vagrant/machines/node2/virtualbox/private_key
[balancer]
192.168.33.13 ansible_ssh_private_key_file=.vagrant/machines/node3/virtualbox/private_key
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=vagrant
Ansibleを介したコマンドの実行
Inventryファイル(hosts)を指定して、すべてのファイルに対してpingコマンドを実行し、疎通確認を行う。
$ ansible -i hosts all -m ping
Playbookの作成
appサーバのPlaybook
appサーバ(Inventoryで[app]セクションに指定されたサーバ)に対して、以下の設定を行っている。
- デプロイ用のフォルダをサーバにコピー
- デプロイしたhtmlファイルの中身を書き換え(デプロイ先のサーバを特定するために、{{inventory_hostname}}変数が表示されるよう値を置き換えている)
- httpサーバを起動(asyncオプションを使用して半永久的に起動している)
Ansible忘備録 -起動したはずのプロセスが死んでいる-
---
- hosts: app
sudo: yes
remote_user: vagrant
tasks:
- name: アプリファイルをコピー
copy: src=./web dest=/home/vagrant/
- name: index.htmlのホスト名を設定
lineinfile:
dest: /home/vagrant/web/index.html
regexp: '<li><strong>hostname:</strong> </li>'
line: '<li><strong>hostname:</strong> {{inventory_hostname}}</li>'
- name: SimpleHTTPServerを起動
command: python simpleserver.py 80 & chdir=/home/vagrant/web/
register: launch_app
# 超長い時間を指定して半永久的に起動
async: 999999999999999
poll: 0
なお、今回はテスト用にPythonのSimpleHTTPServer上に、htmlファイルを動作させている。
詳細はサンプルソース参照。
balancerのplaybook
ロードバランシング用にnginxをインストールし、事前に用意した各設定ファイルをコピーしたあと、サービスを再起動している。
設定ファイルの詳細はサンプルソース参照。
---
- hosts: balancer
sudo: yes
remote_user: vagrant
tasks:
- name: nginxをインストール
yum: name=nginx state=latest
- name: /etc/nginx/nginx.confの設定
copy:
src: config/nginx.conf
dest: /etc/nginx/
owner: root
mode: 0644
backup: yes
- name: /etc/nginx/conf.d/default.confの設定
copy:
src: config/default.conf
dest: /etc/nginx/conf.d/
owner: root
mode: 0644
backup: yes
notify: nginxを再起動
handlers:
- name: nginxを再起動
service: name=nginx state=restarted
app, balancerのPlaybookをincludeした実行用のPlaybook
複数のPlaybookをincludeして、一括で実行させることができる。
- include: apps_playbook.yml
- include: balancers_playbook.yml
Playbookの実行
app, balancerのPlaybookをincludeした実行用のPlaybookで作成した、all.ymlを指定してすべてのサーバに対して、Playbookを実行。
Playbookに記述した各タスクが実行されることが確認できた。
$ ansible-playbook -i hosts all.yml
再度Playbookを実行すると、差分がないため、以下のように必要な箇所のみ実行される(黄色くchangedと表示される箇所が減る)。
動作確認
ホストPCのブラウザから192.168.33.13(node3: balancer)へ何度かアクセスすると、hostnameの値が切り替わり、balancerが動作していることが確認できた!