#何ができるようになるのかと、前置き
-
Vagrantだけでもかなり便利だけど、処理すべきコマンドがいくつもあると面倒なので
AnsibleとかChefとか使ってファイルさえ作っておけば使いまわせて便利。 -
この記事を書いた時点の実情:とりあえず全部入って、box配布くらいはできるようになったかも、というレベル
-
運用方法に関してまで言及しているサイトがなくてちょっと不安。。実はもっといい感じの運用方法があるのでは・・?
#作業説明
##実行環境
- 自端末:Windows7
- 仮想環境:CentOS-6.5-64
##やることざっくりまとめ
【環境構築者の作業】
- VirtualBoxをインストール
(Vagrantがあるので特にこれを使ってると意識するタイミングはない) - Vagrantをインストール
- Vagrantで仮想サーバを2台用意
(WindowsからAnsibleが使えないので、Ansible導入用と開発環境用の計2台) - Ansibleをインストール
- Ansibleで開発環境を作るためのファイル(playbook)を準備する
- Ansibleで作ったファイルを実行して開発環境を作成
- boxを作って各開発者に配布
【各開発者の作業】
- VirtualBoxをインストール
- Vagrantをインストール
- 配布されたboxを環境に入れる
- ソースを配置して、ふつうに開発
#環境構築編
##Ansibleを導入
###VirtualBox/Vagrantをインストール
マニュアルに従ってインストールすればOK
###事前準備
- Windowsでlinux的なコマンドを実行できるようにする
- Gitを導入しているのであればGitBashを使うのが良い
- 導入していなければGowを入れるとかだけど、gitをいれた瞬間以下のエラーがでるようになるので注意。。
The
ssh
executable found in the PATH is a PuTTY Link SSH client.
Vagrant is only compatible with OpenSSH SSH clients. Please install
an OpenSSH SSH client or manually SSH in using your existing client
using the information below.
###Vagrantでサーバを2台用意
- 事前準備でいれたツールを立ち上げて適当なディレクトリに移動
- boxを落としてきて初期化(ここではCentOS-6.5-64を利用)
$ vagrant add box CentOS-6.5-64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ vagrant init CentOS-6.5-64
- 当該ディレクトリに作成されるVagrantfileに以下を追記
config.vm.define :makeplaybook(←ここ任意の名称) do |node|
node.vm.box = "CentOS-6.5-64"
node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
node.vm.network :private_network, ip: "192.168.33.11"
end
config.vm.define :target(←ここ任意の名称) do |node|
node.vm.box = "CentOS-6.5-64"
node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
node.vm.network :private_network, ip: "192.168.33.12"
node.vm.synced_folder "C:/*/test", "/var/www/html/", rsync__exclude: [".git/", "node_modules"]
node.vm.synced_folder "C:/*/test/project", "/var/www/html/project"
end
※解説
サーバー2台
・makeplaybook→Ansibleを入れてtargetを操作するためのサーバー
・target→操作されるほうのサーバー
対象 | 意味 |
---|---|
node.vm.box = "CentOS-6.5-64" | vagrant add box ***でつけた名称で サーバーに導入するboxを指定 |
node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh" | ホスト(自端末Windows7)へのアクセスを ゲスト(makeplaybook/target)へのアクセスとして転送 |
node.vm.network :private_network, ip: "192.168.33.12" | 内部ネットワーク上でのipを指定 |
node.vm.synced_folder "A" "B" | 共有ファイルの指定。ソース等、ローカルの変更をtargetにも即時反映するための設定で、A:ホストのローカルディレクトリ/B:ゲスト(target)のディレクトリを指定。指定の仕方に関しては、高速になるようにここを参考にさせてもらった |
- 環境を立ち上げる
主なVagrantコマンドは以下。まずはvagrant up で環境を立ち上げる
$ vagrant up *** # 開始(***でノード名:target等を指定することも可能。しなければVagrantfileにあるすべてを実行対象に)
$ vagrant halt *** # 停止
$ vagrant destroy *** # 削除
$ vagrant reload *** # 再起動
$ vagrant ssh-config # 環境の情報を見る
$ vagrant ssh *** # 指定した環境にssh接続
- targetとmakeplaybookを通信できるように設定
$ vagrant ssh-config makeplaybook > ssh_config
$ vagrant ssh-config target>> ssh_config
$ scp -F ssh_config */.vagrant.d/insecure_private_key(Vagrantのprivatekeyを指定) makeplaybook:.ssh/id_rsa
※2つ目のコマンドまでで環境情報をファイルに書き出し、
その情報をもとにscpコマンドの-Fオプションでローカルからmakeplaybookにprivatekeyを送っている
###makeplaybookにAnsibleを導入(EPEL経由)・targetへの疎通確認
- ssh通信でmakeplaybookにはいる(vagrant ssh makeplaybook)
- 普通にはいるとvagrantユーザになるので、rootに入りたいときはpasswordのデフォルトがvagrantなのでsuコマンドで切り替える
- そこで、以下のコマンドを実行してmakeplaybookにAnsibleを入れる
$ sudo yum install wget
$ wget http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ sudo rpm --import RPM-GPG-KEY-EPEL-6
$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh epel-release-6-8.noarch.rpm
$ sudo yum install -y ansible
- Ansibleのhostsにtargetを上書き、疎通確認
$ cd /etc/ansible/
$ echo 192.168.33.12 > hosts
$ ansible -i hosts 192.168.33.12 -m ping
最後のコマンドが通ればtargetとの疎通ができる状態になっている
- Tips:いちいち接続確認されるのが面倒なので、確認されないように設定するには・・
/etc/ansible/ansible.cfgのhost_key_checking を falseに変更
##Ansibleのplaybookを作成・実行
$ ansible-playbook -i hosts start.yml
- チェックモードは--check、デバッグは-vvv
- 分岐までやると複雑になるので以下main.yml一択の最低限の簡単な感じでしか作ってません。。
###[参考]フォルダ構成
ansible
|-- start.yml
|-- hosts
|-- ansible.cfg
|-- roles/
| |-- ansible-role-gitbucket/
| |-- tasks/
| |-- main.yml
| |-- apache/
| |-- handlers/
| |-- main.yml
| |-- tasks/
| |-- main.yml
| |-- templates/
| |-- main.yml
| |-- php/
| |-- tasks/
| |-- main.yml
| |-- templates/
| |-- main.yml
| |-- postgresql/
| |-- handlers/
| |-- main.yml
| |-- tasks/
| |-- main.yml
| |-- templates/
| |-- main.yml
| |-- vars/
| |-- main.yml
###[参考]情報が少なかったpostgresqlだけ載せておく
---
- name: Check PostgreSQL yum repository installed
command: test -f /etc/yum.repos.d/pgdg-94-centos.repo
register: yum_pg_installed
ignore_errors: yes
- name: Install PostgreSQL official yum repository
yum: name={{ postgresql_rpm }} state=present
when: yum_pg_installed|failed
- name: Install PostgreSQL server packages
yum: name={{ item }} state=present
with_items:
- postgresql94-server
- postgresql94-contrib
- python-psycopg2
- name: Initialize PostgreSQL database
shell: service postgresql-9.4 initdb
creates=/var/lib/pgsql/9.4/data/postgresql.conf
- name: Install PostgreSQL configuration file
template: src=postgresql.conf.j2 dest=/var/lib/pgsql/9.4/data/postgresql.conf
owner=postgres group=postgres mode=0600
- name: Install PostgreSQL client authentication configuration file
template: src=pg_hba.conf.j2 dest=/var/lib/pgsql/9.4/data/pg_hba.conf
owner=postgres group=postgres mode=0600
- name: Start PostgreSQL
service: name=postgresql-9.4 state=started enabled=yes
- name: Create PostgreSQL DB
postgresql_db: name={{dbname}}
- name: Ensure User Has Access to Database
postgresql_user: db={{dbname}} name={{dbuser}} password={{dbpassword}} priv=ALL
- name: Ensure User Doesnot Have Unnecessary Privilege
postgresql_user: name={{dbuser}} role_attr_flags=NOSUPERUSER,NOCREATEDB
###[参考]エラー対応
- msg: Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!
発生原因も不明だけれど、ここを見てansible-role-gitbucketというロールを追加したらなおった - postgresqlのインストールでエラー
/var/lib/pgsql/9.4/data/pg_log以下にログがあるので探ったところ、
templateで上書きしていた設定ファイルの1行目のコメントアウトが抜けていた。。 - postgresqlのDB作成でエラー
postgresql_dbを使おうとすると「the python psycopg2 module is required」と怒られる。。
パッケージ追加するときitemにpython-psycopg2を追加したら使えるようになった
参考 - FAILED: No authentication methods available
rootユーザで実行していたため。。
##Tips
###仮想サーバにファイルを転送
WinSCPとかの転送ツールでプライベートipを指定すればふつうに接続できる。
意外と忘れがちな事実。。
###targetサーバに入っているpostgresqlにpgadminからアクセス
基本的なことだけど、以下2ファイルをplaybookのtemplate編集してtargetサーバー設定時に上書きすることで接続可能になる
host all all 192.168.33.0/0 trust
port = 5432
###PHPがApacheに認識されない
httpd.confのLoadModule php5_module をいれたかったんだけど、
ディレクトリ構成がWindowsと違うので戸惑った。。
結果的には以下の感じ。
LoadModule php5_module /usr/lib/httpd/modules/libphp5.so
##boxを作成する
- 各開発者に配布する用のboxを作成する
$ vagrant package
- カレントディレクトリにpackage.boxが作成されたのを確認し、各開発者に配布
#運用編
##事前準備
- 各開発者も同じくVirtualBoxとVagrantを端末にインストール
- 環境構築編の事前準備と同じように、WindowsでもLinux的なコマンドを使えるツールをいれる
##boxを追加する
- 配布されたboxを配置し、以下のコマンドでvagrantに追加
$ vagrant box add ***(任意の名称) package.box
##環境作成
- 同じように環境を初期化して、Vagrantfileを編集→立ち上げる
- makeplaybookはいらないのでtargetだけ作るように以下の感じで
config.vm.define :target(←ここ任意の名称) do |node|
node.vm.box = "CentOS-6.5-64"
node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
node.vm.network :private_network, ip: "192.168.33.12"
node.vm.synced_folder "C:/*/test", "/var/www/html/", rsync__exclude: [".git/", "node_modules"]
node.vm.synced_folder "C:/*/test/project", "/var/www/html/project"
end
- あとは、自端末のC:/*/test/project以下にソースを配置して、普通に開発すればOK
##Tips
###vagrant up時にエラー
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
ARPCHECK=no /sbin/ifup eth1 2> /dev/null
Stdout from the command:
Device eth1 does not seem to be present, delaying initialization.
Stderr from the command:
boxの作り方がまずいのかなんなのか、ネットワークがらみのエラーが発生。
以下のコマンドでクリアすればOK。
$ vagrant ssh target
$ sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
###apacheとpostgresqlの立ち上げを手動で実行したい場合
$ sudo service httpd start
$ sudo service postgresql-9.4 start
###デバッグについて
もともとSublimeTextとXdebugでデバッグしていたのですが、
仮想環境になるとリモートデバッグが必要になる→SublimeTextでデバッグできない問題に。。
通常の開発はSublimeTextでやって、デバッグが必要になったとき用にIDE入れるしかないのかなあ。。