akiyoko blog

akiyoko の IT技術系ブログです

Ansible で CentOS 6.5 に WordPress + Nginx + PHP-FPM 環境をさくっと構築(Vagrantバージョン & さくらのVPSバージョン)

GitHub にはいろいろな Ansible の Playbook が公開されていますが、その中に、CentOS 6.5 に WordPress + Nginx + PHP-FPM 環境を構築できるという便利なものもあります。


今回は、
https://github.com/ansible/ansible-examples/tree/master/wordpress-nginx
を使って、Vagrant で起動したローカル仮想マシン(CentOS 6.5) に WordPress + Nginx + PHP-FPM 環境を自動構築したいと思います。

利用イメージは、
https://speakerdeck.com/masuidrive/amazon-s3dewordpresswodong-kasu
で言及されているような、ローカルでのみ利用できる WordPress サイトをささっと構築したいというものを想定しています。


また後半には、さくらのVPS 上の CentOS 6.5 に、Ansible で WordPress + Nginx + PHP-FPM 環境を構築する手順を書いていきます。
が、セキュリティなどの問題もあるので、プロダクション用途としてはあまり使わない方がよさげかと。







(その1)Vagrant で起動したローカル仮想マシンの場合

やりたいこと

  • Vagrant + VirtualBox で起動した仮想マシン(CentOS 6.5)に、Ansible を使って WordPress + Nginx + PHP-FPM を自動構築

環境

  • ホストマシン: Mac OS X 10.9.3
  • ゲストマシン: CentOS 6.5 (64bit) on Vagrant 1.4.3 + VirtualBox

事前準備

1. CentOS 6.5 (64bit) の Boxを追加する

http://www.vagrantbox.es
の一覧から、「CentOS 6.5 x86_64」(CentOS 6.5.3 64-bit)をチョイスします。

f:id:akiyoko:20140531204431p:plain

$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

Downloading box from URL: https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
Extracting box...te: 2144k/s, Estimated time remaining: 0:00:01)
Successfully added box 'centos65' with provider 'virtualbox'!

 

2. 仮想マシンを作成

$ mkdir -p ~/Vagrant/centos65
$ cd ~/Vagrant/centos65/
$ vagrant init centos65

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

 

3. 仮想マシンを起動

IPアドレスを設定して起動します。

$ vim Vagrantfile
-----
 26   # config.vm.network :private_network, ip: "192.168.33.10"26   config.vm.network :private_network, ip: "192.168.33.10"
-----
(※コメントアウトを削除)

$ vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos65'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

# 仮想マシンの状態を確認
$ vagrant status

Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.


仮想マシンに、3.で設定したIPアドレスを指定して、SSHで乗り込んでみます。
(SSHログインID/Pass は、デフォルトでは「vagrant/vagrant」です。)

$ ssh vagrant@192.168.33.10
vagrant@192.168.33.10's password: (vagrant)

 

4. Ansible Playbook を GitHub からクローン

Wordpress + Nginx + PHP-FPM の Ansible Playbook を GitHub からクローンします。

$ cd ~/github/
$ git clone https://github.com/ansible/ansible-examples.git


事前準備として、hosts を書き換えます。

$ cd ansible-examples/wordpress-nginx/
$ cp -a hosts.example hosts
$ vim hosts
-----
[wordpress-server]
192.168.33.10
-----


Playbook を流せるかどうか試してみます。(ID・パスワードを使って SSH するときは -u, -k オプションで指定します。「-c paramiko」を指定する理由については、http://akiyoko.hatenablog.jp/entry/2013/12/16/020529 を参照)

$ ansible -u vagrant -k -c paramiko -i hosts wordpress-server -m ping -vvvv

SSH password: (vagrant)
    ・
    ・
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}

うまくいきました。

 

5. Playbook を実行

Playbook を実行します。

$ ansible-playbook -u vagrant -k -c paramiko -i hosts site.yml -vvvv

SSH password: (vagrant)

PLAY [Install Wordpress, MySQL, Nginx, and PHP-FPM] ***************************
    ・
    ・
TASK: [Configure SELinux to start mysql on any port] **************************
<192.168.33.10> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 192.168.33.10
<192.168.33.10> EXEC /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-1401379439.17-135893922396358 && echo $HOME/.ansible/tmp/ansible-1401379439.17-135893922396358'
<192.168.33.10> REMOTE_MODULE seboolean name=mysql_connect_any state=true persistent=yes
<192.168.33.10> PUT /var/folders/rc/_0bgj5gd2d3_1_r87wq7x4fh0000gn/T/tmpUc_v37 TO /root/.ansible/tmp/ansible-1401379439.17-135893922396358/seboolean
<192.168.33.10> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-1401379439.17-135893922396358/seboolean; rm -rf /root/.ansible/tmp/ansible-1401379439.17-135893922396358/ >/dev/null 2>&1'
failed: [192.168.33.10] => {"failed": true, "item": ""}
msg: SELinux is disabled on this host.

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/akiyoko/site.retry

192.168.33.10              : ok=6    changed=3    unreachable=0    failed=1


ううう。
SELinux が disable だとエラーになってしまうようです。

(2014/6/5追記)

SELinux が disable の場合にもエラーにならないように対応させてみました。「Ansibleで WordPress日本語版(3.9.1) を楽々インストール」をご覧ください。


 

5.2. SELinux を有効化

SELinux を有効化します。
なお、上のようなエラーになった後は、SELinux を有効化して Playbook を流しても、「msg: Failed to commit changes to semanage」というエラーになって 処理が継続できなくなるようなので、vagrant up からやり直します。

$ cd ~/Vagrant/centos65
$ vagrant destroy
$ vagrant up

$ ssh vagrant@192.168.33.10

$ getenforce
Disabled

$ sudo vi /etc/selinux/config
-----
  6 SELINUX=disabled
    ↓
  6 SELINUX=permissive
-----
$ sudo reboot

# ラベル付けが拒否されたファイルがないかチェック
$ sudo grep "SELinux is preventing" /var/log/messages

$ sudo vi /etc/selinux/config
-----
  6 SELINUX=permissive
    ↓
  6 SELINUX=enforcing
-----
$ sudo reboot

# Enforcing になっていることを確認
$ getenforce
Enforcing

参考:


改めて再度実行します。

$ ansible-playbook -u vagrant -k -c paramiko -i hosts site.yml -vvvv
SSH password: (vagrant)

PLAY [Install Wordpress, MySQL, Nginx, and PHP-FPM] ***************************

GATHERING FACTS ***************************************************************
<192.168.33.10> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 192.168.33.10
    ・
    ・
<192.168.33.10> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-1401382473.51-247154545801236/service; rm -rf /root/.ansible/tmp/ansible-1401382473.51-247154545801236/ >/dev/null 2>&1'
changed: [192.168.33.10] => {"changed": true, "item": "", "name": "php-fpm", "state": "started"}

PLAY RECAP ********************************************************************
192.168.33.10              : ok=27   changed=24   unreachable=0    failed=0

成功しました。


ブラウザから「http://192.168.33.10」にアクセスすると、いつものようにインストールが始まります。

f:id:akiyoko:20140531204451p:plain



WordPress 3.7 ですね。
現時点の最新は 3.9.1 なので少し古い気もします。新しくするには、
https://github.com/ansible/ansible-examples/blob/master/wordpress-nginx/group_vars/all
の「wp_version」を書き換えるか、「extra-vars」オプションを付けて実行すればよさそうですね。

あと、nginx, php-fpm, mysql などは、Fedora EPELリポジトリを使ってインストールしているようです。

$ nginx -v
nginx version: nginx/1.0.15

$ php-fpm -v
PHP 5.3.3 (fpm-fcgi) (built: Dec 11 2013 03:32:01)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

$ mysql --version
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1

若干古いものがあるので、別のリポジトリを使ってもよさそうです。
http://akiyoko.hatenablog.jp/entry/2013/12/15/213703

次の機会に、日本語版 WordPressが入るようにしてみようかな。

(2014/6/5追記)

日本語版WordPress 3.9.1 に対応させました。「Ansibleで WordPress日本語版(3.9.1) を楽々インストール」をご覧ください。

 

(その2)さくらのVPS (CentOS 6.5) の場合

やりたいこと

  • さくらのVPS 上の CentOS 6.5 に、Ansible を使って WordPress + Nginx + PHP-FPM を自動構築

環境

  • ホストマシン: Mac OS X 10.9.3
  • ゲストマシン: CentOS 6.5 (64bit) on さくらのVPS


 

1. SSH接続できるように設定

方針は、こんな感じで。

  • SSH鍵でのアクセスを許可し、パスワードでのログインは禁止
  • 作業用ユーザ(admin)は作らず、rootユーザで SSH

http://akiyoko.hatenablog.jp/entry/2013/12/15/213703
の 3.1〜3.4 を少し改編しながら実行していきます。

ローカル側

# SSH鍵ペアの設定
(パスフレーズ無し、/Users/akiyoko/.ssh/sakura_rsa として保存)
$ ssh-keygen

$ ssh-copy-id -i ~/.ssh/sakura_rsa.pub root@49.xx.xx.xx
(Mac に ssh-copy-id が入っていなければ、さくらのVPS からコピーする -> sudo scp -r root@49.xx.xx.xx:/usr/bin/ssh-copy-id /usr/local/bin/)

$ vim ~/.ssh/config
-----
Host sakura
  Hostname 49.xx.xx.xx
  Port 22
  User root
  IdentityFile ~/.ssh/sakura_rsa
-----

# 最後に、root で SSH できることを確認
$ ssh sakura

サーバ側

#パスワードでのログインを禁止
$ sed -i.org "s/^#PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
$ service sshd restart

# SELinux を有効化
(省略:Vagrantの場合の「5.2. SELinux を有効化」を参照)

2. Playbook を実行

ローカル側

$ mkdir ~/github
$ cd ~/github/
$ git clone https://github.com/ansible/ansible-examples.git
$ cd ansible-examples/wordpress-nginx/

$ vim hosts
-----
[wordpress-server]
#192.168.33.10
sakura
-----


iptables のルールを、さくらのVPS用に入れ替えます。
(さくらのVPS の iptables のルールは少し特殊(?)なようです。)

$ vim roles/common/files/iptables-save
-----
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# add start
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# add end

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT
-----


Playbook を実行します。

$ ansible-playbook -i hosts site.yml

PLAY [Install Wordpress, MySQL, Nginx, and PHP-FPM] ***************************

GATHERING FACTS ***************************************************************
ok: [sakura]

TASK: [Install libselinux-python] *********************************************
changed: [sakura]

TASK: [Copy the EPEL repository definition] ***********************************
ok: [sakura]

TASK: [Create the GPG key for EPEL] *******************************************
ok: [sakura]

TASK: [Set up iptables rules] *************************************************
changed: [sakura]

TASK: [Install Mysql package] *************************************************
changed: [sakura] => (item=mysql-server,MySQL-python,libselinux-python,libsemanage-python)

TASK: [Configure SELinux to start mysql on any port] **************************
changed: [sakura]

TASK: [Create Mysql configuration file] ***************************************
changed: [sakura]

TASK: [Start Mysql Service] ***************************************************
changed: [sakura]

TASK: [Install nginx] *********************************************************
changed: [sakura]

TASK: [Copy nginx configuration for wordpress] ********************************
changed: [sakura]

TASK: [Install php-fpm and deps] **********************************************
changed: [sakura] => (item=php,php-fpm,php-enchant,php-IDNA_Convert,php-mbstring,php-mysql,php-PHPMailer,php-process,php-simplepie,php-xml)

TASK: [Disable default pool] **************************************************
changed: [sakura]

TASK: [Copy php-fpm configuration] ********************************************
changed: [sakura]

TASK: [Download Wordpress] ****************************************************
changed: [sakura]

TASK: [Extract archive] *******************************************************
changed: [sakura]

TASK: [Add group "wordpress"] *************************************************
changed: [sakura]

TASK: [Add user "wordpress"] **************************************************
changed: [sakura]

TASK: [Fetch random salts for Wordpress config] *******************************
changed: [sakura]

TASK: [Create Wordpress database] *********************************************
changed: [sakura]

TASK: [Create Wordpress database user] ****************************************
changed: [sakura]

TASK: [Copy Wordpress config file] ********************************************
changed: [sakura]

TASK: [Change ownership of Wordpress installation] ****************************
changed: [sakura]

NOTIFIED: [restart iptables] **************************************************
changed: [sakura]

NOTIFIED: [restart mysql] *****************************************************
changed: [sakura]

NOTIFIED: [restart nginx] *****************************************************
changed: [sakura]

NOTIFIED: [restart php-fpm] ***************************************************
changed: [sakura]

PLAY RECAP ********************************************************************
sakura                     : ok=27   changed=24   unreachable=0    failed=0

たまに、[Fetch random salts for Wordpress config] で「curl: (6) Could not resolve host: api.wordpress.org」になりましたが(ネットワークの問題?)、何度か流せばうまくいきました。


f:id:akiyoko:20140531204513p:plain

f:id:akiyoko:20140531204519p:plain




 

(その3)AWSの場合

やろうと思ったのですが、超高速 WordPress AMI 網元: AWS + Nginx + WordPress でいいんじゃね?と思ったので、やめました。。



参考