こんにちは。サイオステクノロジー 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: - httpsd - 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: httpsd_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 httpsd configuration copy: src: limesurvey.conf dest: /etc/httpsd/conf.d/
11. Apache と PHP-FPM サービスの起動およびファイアウォール設定
特記することはありませんね。お疲れ様でした。
- name: Start httpsd systemd: name: httpsd.service enabled: yes state: started - name: Start php-fpm systemd: name: rh-php56-php-fpm.service enabled: yes state: started - name: Open https port firewalld: service: https permanent: yes immediate: yes state: enabled