02z. さくらのクラウド環境構築(CentOS7+Ansible+Serverspec)

さくらのクラウドLAMP環境構築及びWordPressのテーマ及びプラグインのインストールまでをおこなっていきます。ワークショップ用なので、時間を省略する為にもrootユーザのまま実施していきます。

Ansibleの概要は下記を参照
01c. 開発環境構築(Windows 10+Ubuntu18.04+Ansible)

さくらのクラウド

コントロールパネルにログイン

ワークショップ当日は会場先でさくらのクラウドを提供して頂けるのですが、準備を兼ねて自分でも使用してみました。アカウント開設後、コントロールパネルログインします。


 

サーバの追加

石狩第2ゾーンを選択し(近い東京第1ゾーンは少し割高なので)、サーバを選択し追加

今回はディスクイメージはCentOS7.6を選択しました。

最小構成プランを選択

公開鍵なしを選択(後で作成)

ホスト名作成数を入力
1ホスト(1GB)/月あたり2000円程度(データ転送料不要/SSD20GB)
同スペックのAWS EC2は1500円程度(データ転送料込み/HDD8GB)
検証で2-3日使用したい時は、さくらのクラウドを利用するのもありかなと思います。
※ 2017年3月よりサーバー停止中の利用料金が無料化されました(ディスク料金別)

作成ボタンをクリック

サーバが作成されます。

暫くすると、サーバが起動されます。

※ ansible-02は、web-01に変更しました。

SSH公開鍵認証

ansible-01上で作業していきます。

# vi /etc/hosts											# Webサーバをhostsファイルに追加
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# Webサーバ
153.XX.XX.XX	web-01
153.XX.XX.XX	web-02
 :


# ssh-keygen -t ecdsa								# 楕円曲線暗号を用いた方式(RSAよりも解読が困難)
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):						# パスフレーズは今回無し
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ecdsa.		# 秘密鍵
Your public key has been saved in /root/.ssh/id_ecdsa.pub.		# 公開鍵
  :

# ls -l .ssh													# 公開鍵と秘密鍵が作成されていることを確認
-rw------- 1 root root 227  6月  2 20:29 id_ecdsa
-rw-r--r-- 1 root root 177  6月  2 20:29 id_ecdsa.pub

# ssh-copy-id web-01											# 公開鍵の転送
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub"
  :
root@web-01's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'web-01'"
and check to make sure that only the key(s) you wanted were added.

# ssh web-01					# パスワード無しでログインできることを確認
# hostname						# 該当ホストにログインできたことを確認
web-01
# cat .ssh/authorized_keys		# 公開鍵が転送されていることを確認
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCbobnxvHLTER7LaJWfaZD1tsq7zlC+jsuKBSga7HY96Z6pkMcz+qZTDsX76H1UfC95qvEfvmhb1iFwCECpC3YQ= root@ansible-01
# exit

# 後で必要になるので、localhostに対しても公開鍵を転送しておく
# ssh-copy-id localhost

Ansibleのインストール

# yum update					# インストール済みのパッケージをアップデート
# yum install epel-release		# EPELリポジトリのインストール(アドオンパッケージ群:Ansibleのインストールで必要)
# yum repolist -q				# epelリポジトリが有効になっていることを確認
リポジトリー ID                           リポジトリー名                                                                   状態
base/7/x86_64                             CentOS-7 - Base                                                                  10,019
elrepo                                    ELRepo.org Community Enterprise Linux Repository - el7                              122
epel/x86_64                               Extra Packages for Enterprise Linux 7 - x86_64                                   13,195
extras/7/x86_64                           CentOS-7 - Extras                                                                   413
updates/7/x86_64                          CentOS-7 - Updates                                                                1,945

# python --version				# python3がインストールされている場合は、ansibleが対応しているか確認が必要
Python 2.7.5

# yum install ansible			# Ansibleのインストール
# ansible --version
ansible 2.8.0

# ansible localhost -m ping -o
localhost | SUCCESS => {"changed": false, "ping": "pong"}	# pingモジュールがpongと応答を返すことを確認

# ansible web-01 -m ping -o		# 下記インベントリファイルをまだ作成していないので、WARNINGが出力される
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: web-01

 

インベントリファイル作成

$ vi /etc/ansible/hosts						# 最下行に以下のように追記
  :
[localhost]
127.0.0.1

[web]
web-01
web-02
 :

# ansible web-01 -m ping -o					# WARNING出力が無くなったことを確認
web-01 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}

vimが苦手な人は、ドットインストールで学習できます。
vim入門 (全18回:無料)
 

クレデンシャル

下記のようにユーザ認証情報を付与することもできます。

# ansible web-01 -m ping -o -u root -k
SSH password:						# パスワードを入力

簡単なPlaybookの作成

・Playbookのサンプル

# vi sample_playbook.yml							# Playbookの作成
- hosts: web-01
  vars:
    message: "Hello Ansible!!"                  # message変数を設定
  tasks:
    - shell: uptime
      register: result                          # 実行結果をresult変数に格納

    - debug:
        msg: "{{ result.stdout }}"              # 上記実行結果の標準出力を表示

    - debug:
        msg: "{{ message }}"                    # message変数を表示

・実行結果

# --ask-become-passを付与することで、sudo実行の際のパスワードを入力できる(今回は特に不要)
# ansible-playbook sample_playbook.yml --ask-become-pass	# Playbookの実行
BECOME password:											# sudo実行の際のパスワードを入力

PLAY [web-01] *******************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [web-01]

TASK  ********************************************************************************************************************
changed: [web-01]

TASK [debug] ********************************************************************************************************************
ok: [web-01] => {
    "msg": " 16:32:11 up  2:37,  2 users,  load average: 0.00, 0.01, 0.05"
}

TASK [debug] ********************************************************************************************************************
ok: [web-01] => {
    "msg": "Hello Ansible!!"
}

PLAY RECAP **********************************************************************************************************************
web-01                     : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Ansibleについては、ドットインストールで詳しく説明されています。
Ansible入門(全15回:有料会員)

LAMP環境を構築するPlaybook作成&実行(ansibleサーバ上)

事前準備

テンプレートとして配布するファイルを事前作成する

# vi phpinfo.php
# 先頭行が"< ?php"と表示されてしまっていますが、正しくは"<?php"です
< ?php
phpinfo();
?>

# vi my.cnf.j2
[client]
user=root
password=wpadmin

 

LAMP環境用Playbook作成

Update PHP | WordPress.org にて、PHP5.4はサポートされなくなってましたので、Remiリポジトリを追加後にPHP7.3をインストールする内容に更新しました(2019/8/1)

# vi web-01_lamp_playbook.yml
- name: LAMP環境構築(さくらのクラウド)
  hosts: "{{ hostname }}"
  #become: true                                 # 今回はrootユーザで実行するのでsudo不要
  vars:
    hostname: web-01                            # hostname変数を設定
    database_name: wp
    db_username: wpadmin
    db_password: wpadmin
  tasks:
    #- name: 'yum update'                       # 時間が掛かるので今回のワークショップでは省略
    #  yum:
    #    name: '*'
    #    state: latest                          # パッケージを最新の状態に更新

    - name: EPELリポジトリを追加
      yum:
        name: ['epel-release-7-11']

    - name: Remiリポジトリを追加(PHP7用)
      yum:
        name: ['http://rpms.famillecollet.com/enterprise/remi-release-7.rpm']

    - name: PHPインストール
      yum:
        name: ['php', 'php-mbstring', 'php-mysqlnd', 'php-pdo']
        enablerepo: remi,remi-php73
        state: present                          # パッケージがインストールされていなければインストール
        # php-mbstring: マルチバイト文字列拡張モジュール
        # php-mysqlnd: MariaDB用ドライバ

    - name: MariaDBインストール
      yum:
        name: ['mariadb-5.5.60', 'mariadb-server-5.5.60']
        state: present

    - name: 最新のRubyインストール用パッケージインストール
      yum:
        name: ['centos-release-scl-rh-2-3*', 'centos-release-scl-2-3*']
        state: present
        # centos-release-scl-rh: RHELSC互換の各種パッケージ
        # centos-release-scl:    CentOS SCLo SIGが提供するパッケージ

    - name: Rubyインストール
      yum:
        name: ['rh-ruby25-ruby', 'rh-ruby25-ruby-devel']
        state: present

    - name: 環境設定ファイル追記
      lineinfile:
        dest: ~/.bashrc
        line: 'source /opt/rh/rh-ruby25/enable'

    - name: 環境設定ファイル再読み込み
      shell: source ~/.bashrc

    - name: Railsで必要なパッケージインストール
      yum:
        name: ['libxml2-devel', 'sqlite-devel', 'nodejs']
        # nodejs: railsで必要なGemパッケージ(therubyracer)がインストールされる

    - name: Ruby Gems インストール
      gem:
        name: "{{ item }}"
        user_install: no                        # システム領域にインストール
        state: present
      with_items:
        - bundler
        - rake                                  # Serverspecに必要なライブラリ
        - serverspec                            # サーバ構成テストツール
        - rails

    - name: Python3インストール
      yum:
        name: ['python36', 'python36-pip', 'MySQL-python-1.2.5']
        state: present

    - name: pipアップグレード済みなら実施しない
      stat:
        path: /usr/bin/pip3
      register: pip3

    - name: pipのアップグレード
      pip:
        name: pip
        executable: /usr/bin/pip3
        state: latest                             # 最新のバージョンにアップデート
      when: pip3.stat.exists

    - name: phpテストページの作成
      copy:
        src: phpinfo.php
        dest: /var/www/html/phpinfo.php

    - name: httpプロトコル開放
      firewalld:
        service: http
        state: enabled
        permanent: true

    - name: 3000番ポート開放
      firewalld:
        port: 3000/tcp
        state: enabled
        permanent: true

    - name: 各種サービスを再起動し、自動起動を有効化
      service:
        name: "{{ item }}"
        state: restarted
        enabled: yes
      with_items:
        - httpd
        - mariadb
        - firewalld

    - name: ~/.my.cnfを配置(MySQL設定ファイル)
      become_user: root                         # 該当ユーザへsudo
      template:
        src: my.cnf.j2
        dest: ~/.my.cnf
        mode: 0600

    - name: MySQL rootユーザのパスワードを設定
      mysql_user:
        name: root
        password: "{{ db_password }}"
        check_implicit_admin: yes               # ノンパスでrootログインを試みる

    - name: MySQL DB作成
      mysql_db:
        login_user: root
        login_password: "{{ db_password }}"
        name: "{{ database_name }}"
        state: present                          # 存在しない場合のみ作成

    - name: MySQLユーザの作成及びDBへの権限付与
      mysql_user:
        login_user: root
        login_password: "{{ db_password }}"
        name: "{{ db_username }}"
        password: "{{ db_password }}"
        priv: "{{ database_name }}.*:ALL"
        state: present

実際の業務では複数のバージョンでプログラムを書くことになると思うので、バージョン管理ツールであるrbenvpyenvもインストールしてあげるといいと思います。

モジュールの使い方については、Ansible公式サイトで詳しく記載されています。
Module Index — Ansible Documentation

 

Playbookの内容確認

# ansible-playbook web-01_lamp_playbook.yml --syntax-check		# 構文チェック
playbook: localhost_lamp_playbook.yml							# エラーが表示されないことを確認

# ansible-playbook web-01_lamp_playbook.yml --list-task			# タスクの一覧を取得
playbook: web-01_lamp_playbook.yml

  play #1 (web-01): LAMP環境構築(さくらのクラウド)      TAGS: []
    tasks:
      EPELリポジトリを追加      TAGS: []
      Remiリポジトリを追加(PHP7用)      TAGS: []
      PHPインストール   TAGS: []
      MariaDBインストール       TAGS: []
      最新のRubyインストール用パッケージインストール    TAGS: []
      Rubyインストール  TAGS: []
      環境設定ファイル追記      TAGS: []
      環境設定ファイル再読み込み        TAGS: []
      Railsで必要なパッケージインストール       TAGS: []
      Ruby Gems インストール    TAGS: []
      Python3インストール       TAGS: []
      pipアップグレード済みなら実施しない       TAGS: []
      pipのアップグレード       TAGS: []
      phpテストページの作成     TAGS: []
      httpプロトコル開放        TAGS: []
      3000番ポート開放  TAGS: []
      各種サービスを再起動し、自動起動を有効化  TAGS: []
      ~/.my.cnfを配置(MySQL設定ファイル)        TAGS: []
      MySQL rootユーザのパスワードを設定        TAGS: []
      MySQL DB作成      TAGS: []
      MySQLユーザの作成及びDBへの権限付与       TAGS: []

# ansible-playbook web-01_lamp_playbook.yml --check				# ドライラン

PLAY [LAMP環境構築(さくらのクラウド)] ********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [web-01]

TASK [EPELリポジトリを追加] **************************************************************************************************************
ok: [web-01]

TASK [Remiリポジトリを追加(PHP7用)] *******************************************************************************************************
changed: [web-01]

TASK [PHPインストール] *****************************************************************************************************************
fatal: [web-01]: FAILED! => {"changed": false, "msg": "Error setting/accessing repos: Error getting repository data for remi, repository not found"}

PLAY RECAP ***********************************************************************************************************************
web-01                     : ok=3    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

ドライランなので、[Remiリポジトリを追加(PHP7用)]が実際には実行されていない為、[PHPインストール]のところでエラーとなります。
 

実行結果

# ansible-playbook web-01_lamp_playbook.yml

PLAY [LAMP環境構築(さくらのクラウド)] ********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [web-01]

TASK [EPELリポジトリを追加] **************************************************************************************************************
ok: [web-01]

TASK [Remiリポジトリを追加(PHP7用)] *******************************************************************************************************
changed: [web-01]

TASK [PHPインストール] *****************************************************************************************************************
changed: [web-01]

TASK [MariaDBインストール] *************************************************************************************************************
changed: [web-01]

TASK [最新のRubyインストール用パッケージインストール] *************************************************************************************************
changed: [web-01]

TASK [Rubyインストール] ****************************************************************************************************************
changed: [web-01]

TASK [環境設定ファイル追記] ****************************************************************************************************************
changed: [web-01]

TASK [環境設定ファイル再読み込み] *************************************************************************************************************
changed: [web-01]

TASK [Railsで必要なパッケージインストール] ******************************************************************************************************
changed: [web-01]

TASK [Ruby Gems インストール] **********************************************************************************************************
changed: [web-01] => (item=bundler)
changed: [web-01] => (item=rake)
changed: [web-01] => (item=serverspec)
changed: [web-01] => (item=rails)

TASK [Python3インストール] *************************************************************************************************************
changed: [web-01]

TASK [pipアップグレード済みなら実施しない] *******************************************************************************************************
ok: [web-01]

TASK [pipのアップグレード] ***************************************************************************************************************
changed: [web-01]

TASK [phpテストページの作成] **************************************************************************************************************
changed: [web-01]

TASK [httpプロトコル開放] ***************************************************************************************************************
changed: [web-01]

TASK [3000番ポート開放] ****************************************************************************************************************
changed: [web-01]

TASK [各種サービスを再起動し、自動起動を有効化] ******************************************************************************************************
changed: [web-01] => (item=httpd)
changed: [web-01] => (item=mariadb)
changed: [web-01] => (item=firewalld)

TASK [~/.my.cnfを配置(MySQL設定ファイル)] *************************************************************************************************
changed: [web-01]

TASK [MySQL rootユーザのパスワードを設定] ****************************************************************************************************
changed: [web-01]

TASK [MySQL DB作成] ****************************************************************************************************************
changed: [web-01]

TASK [MySQLユーザの作成及びDBへの権限付与] *****************************************************************************************************
changed: [web-01]

PLAY RECAP ***********************************************************************************************************************
web-01                     : ok=22   changed=19   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Serverspecを使用してサーバ構成のテストをしたいので、上記Playbookをlocalhost(ansible-01)用にコピーして編集後、実行してServerspecをインストールしておきます。

Serverspecを使用してLAMP環境が構築されていることをテスト(ansibleサーバ上)

serverspec-initを実行

# source ~/.bashrc					# 環境設定ファイル再読み込み(Serverspecを使用する為)
# mkdir serverspec					# 任意のディレクトリを作成
# cd serverspec
# serverspec-init
Select OS type:

  1) UN*X							# CentOSなのでこちらを選択
  2) Windows

Select number: 1

Select a backend type:

  1) SSH							# SSHを選択
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n				# Vagrantは使用していないので n を選択
Input target host name: web-01		# テスト対象ホストを入力
 + spec/							# specディレクトリが作成される
 + spec/web-01/
 + spec/web-01/sample_spec.rb
 + spec/spec_helper.rb

 

テストファイル作成

# cd spec/web-01
# rm sample_spec.rb						# サンプルファイルは削除

# vi check_spec.rb						# httpdサービスのテストファイルを作成
require 'spec_helper'

#describe package('httpd') do			# Resource(何をテストするか)
#  it { should be_installed }			# Matcher(どうあるべきか)
#end

# eachメソッドを使用
%w(httpd php-7.3.7 mariadb-server-5.5.60 rh-ruby25-ruby python36 python36-pip).each do |pkg|
  describe package(pkg) do
    it { should be_installed }			# 該当パッケージがインストールされていること
  end
end

#describe service('httpd') do
#  it { should be_running }				# httpdサービスが起動していること
#  it { should be_enabled }				# httpdサービスが起動時に有効になること
#end

%w(httpd mariadb firewalld).each do |src|
  describe service(src) do
    it { should be_running }			# 該当サービスが起動していること
    it { should be_enabled }			# 該当サービスが起動時に有効になること
  end
end

describe port(80) do
  it { should be_listening }			# 80番ポートが空いていること
end

describe command('firewall-cmd --list-ports') do
  its(:stdout) { should match /3000\/tcp/ }		# 3000番ポートが空いていること
end

describe command('mysql -uwpadmin -pwpadmin -e"show databases;"') do
  its(:stdout) { should match /wp/ }		# wpデータベースが作成されている
end

describe file('/var/www/html/phpinfo.php') do
  it { should be_file }						# /var/www/html/phpinfo.phpというファイルが存在すること
  it { should be_owned_by 'root' }			# ファイルオーナーがrootであること
  it { should be_grouped_into 'root' }		# グループがrootであること
  its(:content) { should match /phpinfo/ }	# "phpinfo"という文字列にマッチする
end

describe file('/root/.my.cnf') do
  it { should be_file }
  its(:content) { should match /\[client\]/ }	# "[client]"という文字列にマッチする
end

describe file('/root/.bashrc') do
  it { should be_file }
  its(:content) { should match /\/opt\/rh\/rh-ruby25\/enable/ }	# 左記の文字列にマッチする
end

 

テスト実行

# rake -T
rake spec:web-01      # Run serverspec tests to web-01		# ホストごとにタスクが定義されてる

# rake spec:web-01
(in /root/serverspec)
/opt/rh/rh-ruby25/root/usr/bin/ruby -I/opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-support-3.8.2/lib:/opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-core-3.8.2/lib /opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-core-3.8.2/exe/rspec --pattern spec/web-01/\*_spec.rb

Package "httpd"
  should be installed

Package "php-7.3.7"
  should be installed

Package "mariadb-server-5.5.60"
  should be installed

Package "rh-ruby25-ruby"
  should be installed

Package "python36"
  should be installed

Package "python36-pip"
  should be installed

Service "httpd"
  should be running
  should be enabled

Service "mariadb"
  should be running
  should be enabled

Service "firewalld"
  should be running
  should be enabled

Port "80"
  should be listening

Command "firewall-cmd --list-ports"
  stdout
    should match /3000\/tcp/

Command "mysql -uwpadmin -pwpadmin -e"show databases;""
  stdout
    should match /wp/

File "/var/www/html/phpinfo.php"
  should be file
  should be owned by "root"
  should be grouped into "root"
  content
    should match /phpinfo/

File "/root/.my.cnf"
  should be file
  content
    should match /\[client\]/

File "/root/.bashrc"
  should be file
  content
    should match /\/opt\/rh\/rh-ruby25\/enable/

Finished in 2.69 seconds (files took 0.43978 seconds to load)
23 examples, 0 failures

Serverspecについては、ドットインストールで詳しく説明されています。
Serverspec入門 (全11回:有料会員)
Serverspec公式サイト

LAMP環境が構築されたことを確認(ansibleサーバ上)

確認スクリプト作成

# vi lamp_check.sh
#!/bin/sh

echo "### version ###"
httpd -v;          echo
php -v;            echo
mysql --version;   echo
python --version
python3 --version; echo
ruby -v;           echo

echo "### 環境設定ファイル確認 ###"
tail -2 ~/.bashrc

echo
echo "### pip list ###"
pip list

echo
echo "### firewall設定確認 ###"
firewall-cmd --list-services

echo
echo "### auto start ###"
systemctl list-unit-files | egrep "httpd|mariadb|firewalld"

echo
echo "### service status ###"
systemctl status httpd mariadb firewalld | egrep " httpd.service | mariadb.service | firewalld.service |Active"

echo
echo "### DB確認 ###"
mysql -uwpadmin -pwpadmin -e'show databases;'

echo
echo "### Webサーバ確認 ###"
echo http://localhost
echo http://localhost/phpinfo.php

 

確認スクリプト実行

# chmod u+x lamp_check.sh			# 実行権付与
# ./lamp_check.sh
### version ###
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 24 2019 13:45:48

PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1

Python 2.7.5
Python 3.6.8

ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]

### 環境設定ファイル確認 ###
fi
source /opt/rh/rh-ruby25/enable

### pip list ###
Package    Version
---------- -------
pip        19.1.1
setuptools 39.2.0

### firewall設定確認 ###
ssh dhcpv6-client http

### auto start ###
firewalld.service                             enabled
httpd.service                                 enabled
mariadb.service                               enabled

### service status ###
● httpd.service - The Apache HTTP Server
   Active: active (running) since 火 2019-05-21 02:31:19 JST; 3min 6s ago
● mariadb.service - MariaDB database server
   Active: active (running) since 火 2019-05-21 02:31:24 JST; 3min 0s ago
● firewalld.service - firewalld - dynamic firewall daemon
   Active: active (running) since 火 2019-05-21 02:31:26 JST; 2min 58s ago

### DB確認 ###
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| wp                 |
+--------------------+

### Webサーバ確認 ###
#http://localhost
#http://localhost/phpinfo.php

Webサイトのサービス起動確認

Apacheのテストページ

下記URLにアクセスして、Apacheのテストページが表示されることを確認
http://WebサーバのIPアドレス/

 

PHP情報

下記URLにアクセスして、PHP情報が表示されることを確認
http://WebサーバのIPアドレス/phpinfo.php

 

Rails起動ページ

web-01上Railsアプリを作成します。

# rails new hello_app		# railsのアプリを作成
# cd hello_app
# rails s -b 0.0.0.0		# 起動(全てのIPアドレスからアクセス可能)

下記URLにアクセスして、Rails起動ページが表示されることを確認
http://WebサーバのIPアドレス:3000

WordPress設定のPlaybook

今まではWordPressのテーマ/プラグインのインストールGUIから実施していましたが、WP-CLIコマンドを使用することで、コマンドでインストールできるようになりました!プラグインを一つづつインストールするのは結構大変だったので、だいぶ楽になりましたね。

ファイル編集モジュールの使い分け
モジュール名どのような時に使用するか
replace複数の文字列一括置換したい時
lineinfile特定の文字列を含む行の特定個所を変更したい時

 

# vi web-01_wp_playbook.yml
- name: WordPress環境構築
  hosts: "{{hostname}}"
  become: true
  vars:
    hostname: web-01                    # ホスト名を記載
    IP: 153.XXX.XXX.X                   # IPアドレスを記載
    database_name: wp
    db_username: wpadmin
    db_password: wpadmin
    wordpress_ver: wordpress-5.1.1-ja.tar.gz
    wp_path: /var/www/wordpress
    wp_owner: root                      # apacheユーザが理想(今回はユーザの作成は省略)
    wp_group: root                      # apacheグループが理想(今回はグループの作成は省略)
    title: Ansbile入門                  # Webサイトのタイトルを記載
    email: XXXXXXXXX@gmail.com          # Webサイト管理者のメールアドレスを記載
  tasks:
          - name: WordPressのダウンロード
            get_url:
              url: "https://ja.wordpress.org/{{wordpress_ver}}"
              dest: "/tmp/{{wordpress_ver}}"

          - name: WordPressが展開済みなら実施しない
            stat:
              path: "{{wp_path}}"
            register: wordpress

          - name: WordPressの展開
            unarchive:
              src: "/tmp/{{wordpress_ver}}"
              dest: /var/www/
              remote_src: yes                           # リモートにダウンロードデータがある場合はyes
            when: not wordpress.stat.exists

          - name: WordPressの所有権をapacheに変更       # 今回はroot
            file:
              path: "{{wp_path}}"
              owner: "{{wp_owner}}"
              group: "{{wp_group}}"
              recurse: yes

          - name: WP-CLIコマンドのダウンロード
            get_url:
              url: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
              dest: /usr/local/bin/wp
              owner: "{{wp_owner}}"
              group: "{{wp_group}}"
              mode: 0755

          - name: configファイル設定済みなら実施しない
            stat:
              path: "{{wp_path}}/wp-config.php"
            register: wpconfig

          - name: WordPressのconfigファイル設定(DB設定情報)
            become_user: "{{wp_owner}}"
            shell: /usr/local/bin/wp core config --dbhost=localhost --dbname="{{database_name}}" --dbuser="{{db_username}}" --dbpass="{{db_password}}" --path="{{wp_path}}"
            when: not wpconfig.stat.exists

          - name: WordPressのインストール
            become_user: "{{wp_owner}}"
            shell: /usr/local/bin/wp core install --title="{{title}}" --url="{{IP}}" --admin_user=admin --admin_password=admin --admin_email="{{email}}" --path="{{wp_path}}"
            when: not wpconfig.stat.exists

          - name: DocumentRootの変更
            lineinfile:
              dest: /etc/httpd/conf/httpd.conf
              regexp: '^DocumentRoot "/var/www/html"$'
              line: 'DocumentRoot "/var/www/wordpress"'
              backrefs: yes                             # マッチしなかった場合もEOFに追記しない

          - name: httpdサービスの再起動
            service:
              name: httpd
              state: restarted

          - name: Theme(habakiri)がインストール済みなら実施しない
            stat:
              path: "{{wp_path}}/wp-content/themes/habakiri"
            register: habakiri

          - name: Theme(habakiri)のインストール
            become_user: "{{wp_owner}}"
            shell: /usr/local/bin/wp theme install habakiri --path="{{wp_path}}" --activate
            when: not habakiri.stat.exists

          - name: Theme(cocoon-master)のダウンロード
            get_url:
              url: https://wp-cocoon.com/download/791/
              dest: /tmp/cocoon-master-1.7.4.9.zip

          - name: Theme(cocoon子テーマ)のダウンロード
            get_url:
              url: https://wp-cocoon.com/download/726/
              dest: /tmp/cocoon-child-master-1.0.6.zip

          - name: Theme(cocoon-master)が展開済みなら実施しない
            stat:
              path: "{{wp_path}}/wp-content/themes/cocoon-master"
            register: cocoon

          - name: Theme(cocoon-master)の展開
            unarchive:
              src: /tmp/cocoon-master-1.7.4.9.zip
              dest: "{{wp_path}}/wp-content/themes/"
              remote_src: yes                           # リモートにダウンロードデータがある場合はyes
            when: not cocoon.stat.exists

          - name: Theme(cocoon子テーマ)が展開済みなら実施しない
            stat:
              path: "{{wp_path}}/wp-content/themes/cocoon-child-master"
            register: cocoonchild

          - name: Theme(cocoon子テーマ)の展開
            unarchive:
              src: /tmp/cocoon-child-master-1.0.6.zip
              dest: "{{wp_path}}/wp-content/themes/"
              remote_src: yes                           # リモートにダウンロードデータがある場合はyes
            when: not cocoonchild.stat.exists

          #- name: themes配下の所有権をapacheに変更     # 今回はrootのまま
          #  file:
          #    path: "{{wp_path}}/wp-content/themes"
          #    owner: "{{wp_owner}}"
          #    group: "{{wp_group}}"
          #    recurse: yes

          - name: Theme(cocoon) Activate
            become_user: "{{wp_owner}}"
            shell: /usr/local/bin/wp theme activate cocoon-master --path="{{wp_path}}"

          - name: wp-config.phpの変更(localhostから実際のIPアドレスに)
            lineinfile:
              dest: /var/www/wordpress/wp-config.php
              regexp: "^define\\( 'DB_HOST', 'localhost' \\);"
              line: "define( 'DB_HOST', '{{IP}}' );"
              backrefs: yes                             # マッチしなかった場合もEOFに追記しない

          - name: Webサーバからwpdbへのアクセスを許可(wpadminユーザ)
            shell: mysql -uroot -p{{db_password}} -e'GRANT ALL PRIVILEGES ON {{database_name}}.* TO {{db_username}}@"{{IP}}" IDENTIFIED BY "{{db_password}}";'

          - name: 設定を反映
            shell: mysql -uroot -p"{{db_password}}" -e'FLUSH PRIVILEGES;'

          - name: plugin install
            become_user: "{{wp_owner}}"
            shell: /usr/local/bin/wp plugin install "{{item}}" --path="{{wp_path}}" --activate
            with_items:
                    - all-in-one-seo-pack               # SEO(検索エンジン最適化)対策ツール
                    - backwpup                          # WordPressのファイルとデータベースのバックアップを取得
                    - broken-link-checker               # リンク切れを自動でチェック
                    - classic-editor                    # WordPressの旧エディターのスタイルの投稿編集画面レイアウトを有効化
                    - contact-form-7                    # お問い合わせフォームプラグイン(メール機能は下記Gmail SMTPで実装
                    - flickr-pick-a-picture             # 著作権リンク付きの写真を挿入
                    - gmail-smtp                        # GmailのSMTPサーバー経由でメールを送信
                    - google-analytics-dashboard-for-wp # ダッシュボードでアナリティクスを確認
                    - google-sitemap-generator          # サイトマップをGoogleに送信してインデックスへの登録漏れを防ぐ
                    - ml-slider                         # 簡単に使えるスライドショープラグイン
                    - pixabay-images                    # パブリックドメイン(知的財産権のない)画像を簡単に挿入
                    - polylang                          # WordPress に多言語機能を追加
                    - siteorigin-panels                 # 固定ページにもサイドバーウィジェットを作成
                    - syntaxhighlighter                 # ソースコードを綺麗に表示
                    - table-of-contents-plus            # 自動的に目次を生成
                    - wordpress-importer                # WordPressエクスポートファイルからインポートするツール
                    - wp-multibyte-patch                # 日本語版WordPressのマルチバイト文字の取り扱いに関する不具合の修正
                    - wp-scroll-depth                   # 記事がどこまで読まれたかを計測(25%、50%、75%、100%)

(2019/07/28追記)セキュリティ対策として、以下のプラグインも追加しておくといいと思います。
数々の有効なセキュリティ対策がたった1つのプラグインで出来てしまう「SiteGuard WP Plugin」

 

Playbookの内容確認

# ansible-playbook web-01_wp_playbook.yml --syntax-check	# 構文チェック
playbook: localhost_wp_playbook.yml							# エラーが表示されないことを確認

# ansible-playbook web-01_wp_playbook.yml --list-task		# タスクの一覧を取得
playbook: web-01_wp_playbook.yml

  play #1 (web-01): WordPress環境構築   TAGS: []
    tasks:
      WordPressのダウンロード   TAGS: []
      WordPressが展開済みなら実施しない TAGS: []
      WordPressの展開   TAGS: []
      WordPressの所有権をapacheに変更   TAGS: []
      WP-CLIコマンドのダウンロード      TAGS: []
      configファイル設定済みなら実施しない      TAGS: []
      WordPressのconfigファイル設定(DB設定情報) TAGS: []
      WordPressのインストール   TAGS: []
      DocumentRootの変更        TAGS: []
      httpdサービスの再起動     TAGS: []
      Theme(habakiri)がインストール済みなら実施しない   TAGS: []
      Theme(habakiri)のインストール     TAGS: []
      Theme(cocoon-master)のダウンロード        TAGS: []
      Theme(cocoon子テーマ)のダウンロード       TAGS: []
      Theme(cocoon-master)が展開済みなら実施しない      TAGS: []
      Theme(cocoon-master)の展開        TAGS: []
      Theme(cocoon子テーマ)が展開済みなら実施しない     TAGS: []
      Theme(cocoon子テーマ)の展開       TAGS: []
      Theme(cocoon) Activate    TAGS: []
      wp-config.phpの変更(localhostから実際のIPアドレスに)      TAGS: []
      Webサーバからwpdbへのアクセスを許可(wpadminユーザ)        TAGS: []
      設定を反映        TAGS: []
      plugin install    TAGS: []

# ansible-playbook web-01_wp_playbook.yml --check			# ドライラン
PLAY [WordPress環境構築] *************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [web-01]

TASK [WordPressのダウンロード] **********************************************************************************************************
changed: [web-01]

TASK [WordPressが展開済みなら実施しない] *****************************************************************************************************
ok: [web-01]

TASK [WordPressの展開] **************************************************************************************************************
fatal: [web-01]: FAILED! => {"changed": false, "msg": "Source '/tmp/wordpress-5.1.1-ja.tar.gz' does not exist"}

PLAY RECAP ***********************************************************************************************************************
web-01                     : ok=3    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

ドライランなので、[WordPressのダウンロード]が実際にはダウンロードされていない為、[WordPressの展開]のところでエラーとなります。

 

実行結果

# ansible-playbook web-01_wp_playbook.yml
PLAY [WordPress環境構築] *************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [web-01]

TASK [WordPressのダウンロード] **********************************************************************************************************
changed: [web-01]

TASK [WordPressが展開済みなら実施しない] *****************************************************************************************************
ok: [web-01]

TASK [WordPressの展開] **************************************************************************************************************
changed: [web-01]

TASK [WordPressの所有権をapacheに変更] ***************************************************************************************************
changed: [web-01]

TASK [WP-CLIコマンドのダウンロード] *********************************************************************************************************
changed: [web-01]

TASK [configファイル設定済みなら実施しない] *****************************************************************************************************
ok: [web-01]

TASK [WordPressのconfigファイル設定(DB設定情報)] ********************************************************************************************
changed: [web-01]

TASK [WordPressのインストール] **********************************************************************************************************
changed: [web-01]

TASK [DocumentRootの変更] ***********************************************************************************************************
changed: [web-01]

TASK [httpdサービスの再起動] *************************************************************************************************************
changed: [web-01]

TASK [Theme(habakiri)がインストール済みなら実施しない] *******************************************************************************************
ok: [web-01]

TASK [Theme(habakiri)のインストール] ****************************************************************************************************
changed: [web-01]

TASK [Theme(cocoon-master)のダウンロード] ***********************************************************************************************
changed: [web-01]

TASK [Theme(cocoon子テーマ)のダウンロード] **************************************************************************************************
changed: [web-01]

TASK [Theme(cocoon-master)が展開済みなら実施しない] ******************************************************************************************
ok: [web-01]

TASK [Theme(cocoon-master)の展開] ***************************************************************************************************
changed: [web-01]

TASK [Theme(cocoon子テーマ)が展開済みなら実施しない] *********************************************************************************************
ok: [web-01]

TASK [Theme(cocoon子テーマ)の展開] ******************************************************************************************************
changed: [web-01]

TASK [Theme(cocoon) Activate] ****************************************************************************************************
changed: [web-01]

TASK [wp-config.phpの変更(localhostから実際のIPアドレスに)] ***********************************************************************************
changed: [web-01]

TASK [Webサーバからwpdbへのアクセスを許可(wpadminユーザ)] *****************************************************************************************
changed: [web-01]

TASK [設定を反映] *********************************************************************************************************************
changed: [web-01]

TASK [plugin install] ************************************************************************************************************
changed: [web-01] => (item=all-in-one-seo-pack)
changed: [web-01] => (item=backwpup)
changed: [web-01] => (item=broken-link-checker)
changed: [web-01] => (item=classic-editor)
changed: [web-01] => (item=contact-form-7)
changed: [web-01] => (item=flickr-pick-a-picture)
changed: [web-01] => (item=gmail-smtp)
changed: [web-01] => (item=google-analytics-dashboard-for-wp)
changed: [web-01] => (item=google-sitemap-generator)
changed: [web-01] => (item=ml-slider)
changed: [web-01] => (item=pixabay-images)
changed: [web-01] => (item=polylang)
changed: [web-01] => (item=siteorigin-panels)
changed: [web-01] => (item=syntaxhighlighter)
changed: [web-01] => (item=table-of-contents-plus)
changed: [web-01] => (item=wordpress-importer)
changed: [web-01] => (item=wp-multibyte-patch)
changed: [web-01] => (item=wp-scroll-depth)

PLAY RECAP ***********************************************************************************************************************
web-01                     : ok=24   changed=18   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

WordPressのインストールが完了すると、下記メールが届きます。

新しい WordPress サイトの設置に成功しました:
http://153.XXX.XXX.X

以下の情報を使って、管理者としてログインできます:

ユーザー名: admin
パスワード: インストール中に選択したパスワード。
ログイン先: http://153.XXX.XXX.X/wp-login.php

 

チェックスクリプト作成

※以降はweb-01上で作業

# vi wp_check.sh
#!/bin/sh

echo -e "### wp --info ###"
wp --info

echo -e "### theme status ###"
wp theme status --path=/var/www/wordpress
wp theme list --path=/var/www/wordpress

echo -e "### plugin status ###"
wp plugin status --path=/var/www/wordpress
wp plugin list --path=/var/www/wordpress

 

チェックスクリプト実行

# ./wp_check.sh

### wp --info ###
OS:     Linux 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64
Shell:  /bin/bash
PHP binary:     /usr/bin/php
PHP version:    7.3.7
php.ini used:   /etc/php.ini
WP-CLI root dir:        phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:      phar://wp-cli.phar/vendor
WP_CLI phar path:       /root
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.2.0

### theme status ###
6 installed themes:
  I cocoon-child-master 1.0.8
  A cocoon-master       1.9.1
  I habakiri            2.5.2
 UI twentynineteen      1.3
 UI twentyseventeen     2.1
 UI twentysixteen       1.9

Legend: I = Inactive, A = Active, U = Update Available
+---------------------+----------+-----------+---------+
| name                | status   | update    | version |
+---------------------+----------+-----------+---------+
| cocoon-child-master | inactive | none      | 1.0.8   |
| cocoon-master       | active   | none      | 1.9.1   |
| habakiri            | inactive | none      | 2.5.2   |
| twentynineteen      | inactive | available | 1.3     |
| twentyseventeen     | inactive | available | 2.1     |
| twentysixteen       | inactive | available | 1.9     |
+---------------------+----------+-----------+---------+

### plugin status ###
19 installed plugins:
 UI akismet                           4.1.1
  A all-in-one-seo-pack               3.1.1
  A backwpup                          3.6.10
  A classic-editor                    1.5
  A contact-form-7                    5.1.3
  A flickr-pick-a-picture             1.2.6
  A gmail-smtp                        1.1.8
  A google-analytics-dashboard-for-wp 5.3.8
  A google-sitemap-generator          4.1.0
 UI hello                             1.7.1
  A ml-slider                         3.14.0
  A siteorigin-panels                 2.10.6
  A pixabay-images                    3.4
  A polylang                          2.6.2
  A syntaxhighlighter                 3.5.0
  A table-of-contents-plus            1601
  A wordpress-importer                0.6.4
  A wp-multibyte-patch                2.8.2
  A wp-scroll-depth                   1.5.1

Legend: I = Inactive, A = Active, U = Update Available
+-----------------------------------+----------+-----------+---------+
| name                              | status   | update    | version |
+-----------------------------------+----------+-----------+---------+
| akismet                           | inactive | available | 4.1.1   |
| all-in-one-seo-pack               | active   | none      | 3.1.1   |
| backwpup                          | active   | none      | 3.6.10  |
| classic-editor                    | active   | none      | 1.5     |
| contact-form-7                    | active   | none      | 5.1.3   |
| flickr-pick-a-picture             | active   | none      | 1.2.6   |
| gmail-smtp                        | active   | none      | 1.1.8   |
| google-analytics-dashboard-for-wp | active   | none      | 5.3.8   |
| google-sitemap-generator          | active   | none      | 4.1.0   |
| hello                             | inactive | available | 1.7.1   |
| ml-slider                         | active   | none      | 3.14.0  |
| siteorigin-panels                 | active   | none      | 2.10.6  |
| pixabay-images                    | active   | none      | 3.4     |
| polylang                          | active   | none      | 2.6.2   |
| syntaxhighlighter                 | active   | none      | 3.5.0   |
| table-of-contents-plus            | active   | none      | 1601    |
| wordpress-importer                | active   | none      | 0.6.4   |
| wp-multibyte-patch                | active   | none      | 2.8.2   |
| wp-scroll-depth                   | active   | none      | 1.5.1   |
+-----------------------------------+----------+-----------+---------+

WordPress起動確認

WordPressサイトの表示

下記URLにアクセスして、サイトが表示されることを確認
http://WebサーバのIPアドレス

 

管理画面の表示

下記URLにアクセスして、ログイン後に管理画面が表示されることを確認
http://WebサーバのIPアドレス/wp-admin/

WordPressについては、ドットインストールで学習できます。
WordPress入門 (全23回:無料)

今回使用したファイル一覧

下記で取得できます。

# git clone https://github.com/hideame/ansible

Ansibleで3分クッキング

上記と同じ内容です。

Ansibleで3分クッキング(前編)
Ansibleで3分クッキング(後編)

WebProgramming入門

タイトルとURLをコピーしました