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
事前準備
- Vagrant + VirtualBox がインストール済(手順は、Mac OS X+Vagrant+VirtualBox で Ubuntu 12.04 仮想環境を構築 の 1.~2. を参照)
1. CentOS 6.5 (64bit) の Boxを追加する
http://www.vagrantbox.es
の一覧から、「CentOS 6.5 x86_64」(CentOS 6.5.3 64-bit)をチョイスします。
$ 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
参考:
- https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-Enabling_and_Disabling_SELinux.html
- http://centossrv.com/centos5-init.shtml
改めて再度実行します。
$ 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」にアクセスすると、いつものようにインストールが始まります。
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が入るようにしてみようかな。
(その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」になりましたが(ネットワークの問題?)、何度か流せばうまくいきました。