Ansible で LimeSurvey を構築する (SELinux/non-remi/deploy-helper 編)

こんにちは。サイオステクノロジー OSS サポート担当で Ansible が大好きな鎌田です。

当ブログで Ansible を使った LimeSurvey インストールの自動化に関する記事が公開されています。

https://tech-lab.sios.jp/archives/11836

が、この内容からさらに以下の観点でいい感じにした Playbook の書き方を紹介したいと思います。

  • 昨今のセキュリティ事情を考慮して、SELinux は enforcing のまま。
  • RPM リポジトリに remi を使わず、信頼性の高い EPEL や SCL (Software Collections) を使う。
  • 切り戻しを考慮して複数バージョンを共存させる。

それでは、やっていきましょう。

環境

構築対象のサーバは CentOS 7.5.1804 で動作するものとします。
使用する Ansible のバージョンは、2.7.1 です。

$ ansible --version
ansible 2.7.1
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/kkamada/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.1 (default, Nov 5 2018, 14:07:04) [GCC 8.2.1 20181011 (Red Hat 8.2.1-4)]

各処理について

Playbook の全容は、GitHub で公開しています。

https://github.com/SIOS-OSS/techlab-limesurvey

1. EPEL と SCL の有効化

まずは、EPEL と SCL を有効化しなければなりません。centos-release-scl と epel-release をインストールしましょう。

- name: Enabling EPEL and SCL
yum:
name: "{{ packages }}"
state: present
vars:
packages:
- centos-release-scl
- epel-release

2. 各種必要なパッケージのインストール

CentOS 7 向けの PHP 5.6 は SCL で提供されています。これを考慮したパッケージをインストールしていきます。

- name: Install required packages
yum:
name: "{{ packages }}"
state: present
vars:
packages:
- httpd
- MySQL-python
- mariadb
- mariadb-server
- mod_fcgid
- rh-php56
- rh-php56-php-fpm
- rh-php56-php-gd
- rh-php56-php-mysqlnd
- rh-php56-php-mbstring
- sclo-php56-php-mcrypt

3. PHP の設定

PHP のタイムゾーン設定ですが、PHP の設定ファイルである php.ini は INI 形式のファイルです。Ansible には INI ファイルを操作する ini_file モジュールがありますので、こちらを利用しましょう。

- name: Configure PHP timezone
ini_file:
path: /etc/opt/rh/rh-php56/php.ini
section: Date
option: date.timezone
value: Asia/Tokyo

4. MariaDB の設定と起動

MariaDB を設定していくわけですが、デフォルトの /etc/my.cnf.d/server.cnf/usr/share/mysql/my-small.cnf で上書きして書き換えるパターンですと、ansible-playbook を実行するたびに changed 状態になってしまいます。
従って、デフォルトの /etc/my.cnf.d/server.cnf を空ファイルにしつつ、初回だけ /usr/share/mysql/my-small.cnf をコピーしてきて、随時設定を書き換えていくパターンにしましょう。
これらはひとまとまりの処理なので、せっかくなので block を使ってまとめます。意味は、あまりありません。

- block:
- name: Check server.cnf file stats
stat: 
path: /etc/my.cnf.d/server.cnf
register: st
- name: Erase content of default server.cnf if it's size is not zero
copy:
content: ''
dest: /etc/my.cnf.d/server.cnf
when: st.stat.size > 0
- name: Copy my-small.cnf if server.cnf's size is not zero
copy:
src: /usr/share/mysql/my-small.cnf
dest: /etc/my.cnf.d/server-small.cnf
remote_src: yes
when: st.stat.size > 0
- name: Configure server-small.cnf
ini_file:
path: /etc/my.cnf.d/server-small.cnf
section: "{{ item.section }}"
option: "{{ item.option }}"
value: "{{ item.value }}"
loop:
- section: client
option: default-character-set
value: utf8
- section: mysqld
option: character-set-server
value: utf8
- name: Start MariaDB
systemd:
name: mariadb.service
enabled: yes
state: started

5. LimeSurvey 用のデータベースとユーザを作成

特記することはありません。データベースと、ユーザを作成します。

- name: Create limesurvey db
mysql_db:
name: limesurvey
state: present
- name: Create limesurvey user
mysql_user:
name: limesurvey
password: limesurvey
priv: 'limesurvey.*:ALL'
state: present

6. 複数バージョン管理

複数バージョン管理には、便利な deploy_helper モジュールを使います。バージョン番号は、せっかくなので変数を使っています。

- name: Initialize the deploy root and gather facts
deploy_helper:
path: /var/www/limesurvey
release: "{{ limesurvey_version }}"

7. LimeSurvey のデプロイ

GitHub から tarball を取得して展開します。展開先は、deploy_helper モジュール実行時に定義される deploy_helper.new_release_path に展開します。

- name: Get limesurvey
get_url:
url: "https://github.com/LimeSurvey/LimeSurvey/archive/{{ limesurvey_version }}.tar.gz"
dest: "/tmp/{{ limesurvey_version }}.tar.gz"
- name: Create target directory
file:
path: "{{ deploy_helper.new_release_path }}"
state: directory
- name: Unarchive limesurvey
unarchive:
src: "/tmp/{{ limesurvey_version }}.tar.gz"
dest: "{{ deploy_helper.new_release_path }}"
creates: "{{ deploy_helper.new_release_path }}/index.php"
remote_src: yes
extra_opts:
- '--strip-components=1'

8. バージョンアップ時を考慮した処理

バージョンアップを行う場合は、以下のドキュメントにも記載されているように、/application/config/config.php/upload ディレクトリを保持しておけばよさそうです。
synchronize モジュールでいい感じに配置していきます。

Upgrading from a previous version
https://manual.limesurvey.org/Upgrading_from_a_previous_version

- name: Copy previous version files to new version
synchronize:
src: "{{ deploy_helper.previous_release_path }}/{{ item }}"
dest: "{{ deploy_helper.new_release_path }}/{{ item }}"
recursive: yes
loop:
- application/config/config.php
- upload
when: deploy_helper.previous_release != None and deploy_helper.new_release != deploy_helper.previous_release
delegate_to: "{{ inventory_hostname }}"

9. LimeSurvey のデプロイの続き

所有者、所有グループをちゃんと設定して、さらに SELinux コンテキストを設定します。
handler に設定しているのは、restorecon コマンドを実行するタスクです。
deploy_helper モジュールの finalize を実行すると、現バージョンがデプロイした新バージョンに置き換わります。
Apache のドキュメントルートからたどれるパスにシンボリックリンクを作成しておきます。

- name: Change owner and group
file:
path: "{{ deploy_helper.new_release_path }}"
owner: apache
group: apache
recurse: yes
- name: Configure selinux for rw content
sefcontext:
target: "{{ item }}"
setype: httpd_sys_rw_content_t
state: present
loop:
- "{{ deploy_helper.new_release_path | replace('+', '\\+') }}/application/config(/.*)?"
- "{{ deploy_helper.new_release_path | replace('+', '\\+') }}/tmp(/.*)?"
- "{{ deploy_helper.new_release_path | replace('+', '\\+') }}/upload(/.*)?"
notify: Exec restorecon
- name: Finalize the deploy
deploy_helper:
path: /var/www/limesurvey
release: "{{ deploy_helper.new_release }}"
state: finalize
- name: Create symblic link to current release
file:
path: /var/www/html/limesurvey
src: "{{ deploy_helper.current_path }}"
state: link

10. Apache の設定

SCL でインストールした PHP 5.6 には、Apache モジュールは含まれていないので、PHP-FPM 経由でアクセスします。そのため、Apache には FastCGI 設定が必要です。
設定ファイルは動的に変える必要はないので、以下の内容でコピーします。

ProxyPassMatch ^/limesurvey/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/limesurvey/$1
DirectoryIndex /index.php index.php
- name: Copy httpd configuration
copy:
src: limesurvey.conf
dest: /etc/httpd/conf.d/

11. Apache と PHP-FPM サービスの起動およびファイアウォール設定

特記することはありませんね。お疲れ様でした。

- name: Start httpd
systemd:
name: httpd.service
enabled: yes
state: started
- name: Start php-fpm
systemd:
name: rh-php56-php-fpm.service
enabled: yes
state: started
- name: Open http port
firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
ご覧いただきありがとうございます! この投稿は役に立ちましたか? 役に立った 役に立たなかった

Be the first to comment

コメント投稿

Your email address will not be published.


*