OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Ansible 2.7.4のPlaybookでPostgreSQL 10を導入

カテゴリ:OSSセットアップ | ソフトウェア:PostgreSQL | タグ:
最終更新日:2021/01/01 | 公開日:2019/01/13

目次

概要

 Ansibleの少し実践的な動作確認のため、PostgreSQL 10をインストールするPlaybookを作成し、実行しててみました。 これまでPostgreSQL 10のインストールはTeraTermを使って手作業で実施していましたが、その手作業と同じ流れで インストール、設定するPlaybookを作ってみます。 ベースにする手作業でのインストール・設定手順は「PostgreSQL 10.4をRHEL 7.5(AWSのEC2)へインストールし、PITR可能な初期設定を行う」を参考にしています。 Ansibleの実行環境は「Ansible 2.7.4でAWSのEC2インスタンスを管理する環境の構築」で構築した AWS上の環境を利用しています。 今回Playbookの実行でPostgreSQL 10を導入する対象とするEC2インスタンスを新たに1つ作成しておきます。

 なお、Ansibleがインストールされていて他のサーバを管理するサーバを「コントロールノード」、 Ansibleで管理され、今回PostgreSQLされるサーバを「ターゲットノード」と表現することにします。

構成

検証環境

 サーバにはAmazonのEC2インスタンスを利用しました。 AmazonマシンイメージはAWS標準のものではなく、AWS Marketplaceから取得しています。 サーバのスペックは以下のとおりです。

■サーバスペック(コントロールノード、ターゲットノード共に下記スペック)
項目内容
AmazonマシンイメージCentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスクSSD 8GiB
リージョンアジアパシフィック (東京)

サーバ構成

OSバージョン

 コントロールノード、ターゲットノード共に以下のOSです。

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

 以下はコントロールノードにのみ必要なパッケージです。 PostgreSQLをインストールするターゲットノードにはインストール不要です。

  • epel-release-7-11.noarch.rpm
  • ansible-2.7.4-1.el7.noarch.rpm

環境構築

 以下の作業はAnsibleがインストールされているコントロールノードで実行します。

インストール

Playbook用ディレクトリの作成

 /data/ansible/test/ ディレクトリを今回作成するPlaybookのルートディレクトリとして、 その下にインベントリファイルを格納するディレクトリと管理対象サーバに配布するファイルを格納するディレクトリを作成します。

$ sudo su -
Last login: Sat Dec 29 13:15:52 UTC 2018 on pts/0
# su - ansible
Last login: Sat Dec 29 13:16:41 UTC 2018 on pts/0
$ cd /data/ansible/
$ mkdir test
$ cd test/
$ mkdir inventory ←インベントリファイル用
$ mkdir files ←管理対象サーバに配布するファイル用

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

 インベントリファイルを作成します。 PostgreSQLを導入するターゲットノードを1台としたので、対象サーバのIPアドレスを1行記入します。 また、コントロールノードからターゲットノードへはcentosユーザ(CentOSのAMIへの接続用デフォルトユーザ)で 接続するため、SSHユーザとしてcentosを指定します。 併せてSSH接続時に使用するキーペアの秘密鍵のパスを指定します。これはコントロールノード側のパスです。

$ cd inventory/
$ vi inventory.ini
ファイル名:/data/ansible/test/inventory/inventory.ini
※ファイルを新規作成※
[db_servers]
172.31.30.50

[db_servers:vars]
ansible_ssh_user=centos
ansible_ssh_private_key_file=/data/ansible/test/inventory/id_rsa

秘密鍵の格納

 EC2インスタンス作成時に指定したキーペアの秘密鍵の方をコントロールノードに転送します。 TeraTermで転送することができますが、わからない場合は秘密鍵をエディタで開いて同一内容のファイルを 作成しても構いません。秘密鍵はテキストファイルなので。

$ ls -l
total 8
-rw----r--. 1 centos  centos  1692 Jun  3  2017 id_rsa ←転送したファイル
-rw-rw-r--. 1 ansible ansible  134 Dec 29 14:19 inventory.ini

ターゲットノードへ転送する設定ファイルの格納

 Playbookの実行時に、事前に設定変更しておいたPostgreSQLの設定ファイルをターゲットノードにコピーします。 コピー元のファイルを files/ ディレクトリに格納します。 私は一旦別のサーバに手動でPostgreSQLをインストールし、設定変更したいファイルを取り出しておきました。

$ cd /data/ansible/test/files/
$ ls -l
total 36
drwxrwxr-x. 2 ansible ansible   202 Dec 29 14:26 .
drwxrwxr-x. 4 ansible ansible   206 Dec 29 14:29 ..
-rw-rw-r--. 1 ansible ansible   293 Dec 23 17:38 .bash_profile
-rw-------. 1 ansible ansible  4635 Dec 26 15:22 pg_hba.conf
-rw-r--r--. 1 ansible ansible  1719 Dec 26 15:25 postgresql-10.service
-rw-------. 1 ansible ansible 22743 Dec 26 15:20 postgresql.conf

Playbookの作成

 EC2インスタンスにPostgreSQLを導入するためのPlaybookを作成します。 本当はある程度機能の塊ごとにロールを分けた方がPlaybookを再利用できて良いのですが、 初めてPostgreSQLのPlaybookを作成したので、一旦1ファイルにベタに書きました。 余裕があれば後からロールに分割してみます。

 Playbookの内容については説明を割愛しますが、Ansibleのデフォルトのモジュールを素直に使っています。 唯一、PostgreSQLのデータベースクラスタを作成するモジュールが見当たらなかったので、shellモジュールを利用しています。 shellモジュールではPlaybookの複数回実行時に冪等性を担保できないため、postgresql.confの存在有無でシェルモジュールの 実行可否を判断して処理分岐することで対応しています。

$ cd /data/ansible/test/
$ vi postgresql10_playbook.yml
ファイル名:/data/ansible/test/postgresql10_playbook.yml
※ファイルを新規作成※
---
- hosts: db_servers
  become: true
  tasks:
  - name: Add PostgreSQL repository
    yum:
      name: https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
      state: present

  - name: Install PostgreSQL
    yum:
      name: "{{ packages }}"
      enablerepo: pgdg10
      state: latest
    vars:
      packages:
      - postgresql10-libs
      - postgresql10
      - postgresql10-server

  - name: Set user password
    user:
      name: postgres
      password: "{{ 'Pass-123' | password_hash('sha512') }}"

  - name: Copy bash_profile
    copy:
      src: /data/ansible/test/files/.bash_profile
      dest: /var/lib/pgsql/.bash_profile
      owner: postgres
      group: postgres
      mode: 0700
      backup: yes

  - name: Create data directory
    file:
      path: /data
      state: directory
      owner: root
      mode: 0777

  - name: Create bkup directory
    file:
      path: /bkup
      state: directory
      owner: root
      mode: 0777

  - name: Create pgdata1 directory
    file:
      path: /data/pgdata1
      state: directory
      owner: postgres
      group: postgres
      mode: 0700

  - name: Create pgdata1 directory
    file:
      path: /bkup/pgdata1
      state: directory
      owner: postgres
      group: postgres
      mode: 0700

  - name: Create pg_arch directory
    file:
      path: /bkup/pgdata1/pg_arch
      state: directory
      owner: postgres
      group: postgres
      mode: 0700

  - name: Check database cluster
    stat:
      path: /data/pgdata1/postgresql.conf
    register: is_conf

  - name: Create PostgreSQL database cluster
    shell: /usr/pgsql-10/bin/initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1
    become_user: postgres
    when: not is_conf.stat.exists

  - name: Copy postgresql.conf
    copy:
      src: /data/ansible/test/files/postgresql.conf
      dest: /data/pgdata1/postgresql.conf
      owner: postgres
      group: postgres
      mode: 0600
      backup: yes

  - name: Copy pg_hba.conf
    copy:
      src: /data/ansible/test/files/pg_hba.conf
      dest: /data/pgdata1/pg_hba.conf
      owner: postgres
      group: postgres
      mode: 0600

  - name: Copy postgresql-10.service
    copy:
      src: /data/ansible/test/files/postgresql-10.service
      dest: /etc/systemd/system/postgresql-10.service
      owner: root
      group: root
      mode: 0644

  - name: Start PostgreSQL10
    systemd:
      name: postgresql-10
      enabled: yes
      state: started

Playbookの実行

 作成したPlaybookを実行してPostgreSQLを導入します。 途中shellモジュールを使ってデータベースクラスタを作成する際にWARNINGが出力されていますが、 実害がないようなので一旦無視します。

$ ansible-playbook -i inventory/inventory.ini postgresql10_playbook.yml

PLAY [db_servers] ******************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [172.31.30.50]

TASK [Add PostgreSQL repository] ***************************************************************************************
changed: [172.31.30.50]

TASK [Install PostgreSQL] **********************************************************************************************
changed: [172.31.30.50]

TASK [Set user password] ***********************************************************************************************
changed: [172.31.30.50]

TASK [Copy bash_profile] ***********************************************************************************************
changed: [172.31.30.50]

TASK [Create data directory] *******************************************************************************************
changed: [172.31.30.50]

TASK [Create bkup directory] *******************************************************************************************
changed: [172.31.30.50]

TASK [Create pgdata1 directory] ****************************************************************************************
changed: [172.31.30.50]

TASK [Create pgdata1 directory] ****************************************************************************************
changed: [172.31.30.50]

TASK [Create pg_arch directory] ****************************************************************************************
changed: [172.31.30.50]

TASK [Check database cluster] ******************************************************************************************
ok: [172.31.30.50]

TASK [Create PostgreSQL database cluster] ******************************************************************************
 [WARNING]: Module remote_tmp /var/lib/pgsql/.ansible/tmp did not exist and was created with a mode of 0700, this may
cause issues when running as another user. To avoid this, create the remote_tmp dir with the correct permissions
manually

changed: [172.31.30.50]

TASK [Copy postgresql.conf] ********************************************************************************************
changed: [172.31.30.50]

TASK [Copy pg_hba.conf] ************************************************************************************************
changed: [172.31.30.50]

TASK [Copy postgresql-10.service] **************************************************************************************
changed: [172.31.30.50]

TASK [Start PostgreSQL10] **********************************************************************************************
changed: [172.31.30.50]

PLAY RECAP *************************************************************************************************************
172.31.30.50               : ok=16   changed=14   unreachable=0    failed=0

$

 これでPlaybookを利用してEC2インスタンスにPostgreSQLのインストール、設定とデータベースクラスタの作成が完了しました。

動作確認

 一通り構築が終わったところでPostgreSQLの動作を確認します。 本来自動構築したら自動テストするのが普通かと思いますが、 まだ経験が浅くてPlaybookの内容に自信がないため、今回は手作業で確実に確認することにします。 なお、ここからはターゲットノードでの作業になります。

データベースクラスタの作成確認

 データベースクラスタを作成した /data/pgdata1/ ディレクトリに PostgreSQLの各種ディレクトリやファイルが作成されていることを確認します。

$ sudo su -
# ls -l /data/pgdata1/
total 84
drwx------. 5 postgres postgres    41 Dec 29 14:36 base
-rw-------. 1 postgres postgres    35 Dec 29 14:36 current_logfiles
drwx------. 2 postgres postgres  4096 Dec 29 14:36 global
drwx------. 2 postgres postgres    37 Dec 29 14:36 log
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_commit_ts
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_dynshmem
-rw-------. 1 postgres postgres  4635 Dec 29 14:36 pg_hba.conf
-rw-------. 1 postgres postgres  1636 Dec 29 14:36 pg_ident.conf
drwx------. 4 postgres postgres    68 Dec 29 14:41 pg_logical
drwx------. 4 postgres postgres    36 Dec 29 14:36 pg_multixact
drwx------. 2 postgres postgres    18 Dec 29 14:36 pg_notify
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_replslot
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_serial
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_snapshots
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_stat
drwx------. 2 postgres postgres    25 Dec 29 14:52 pg_stat_tmp
drwx------. 2 postgres postgres    18 Dec 29 14:36 pg_subtrans
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_tblspc
drwx------. 2 postgres postgres     6 Dec 29 14:36 pg_twophase
-rw-------. 1 postgres postgres     3 Dec 29 14:36 PG_VERSION
drwx------. 3 postgres postgres    60 Dec 29 14:36 pg_wal
drwx------. 2 postgres postgres    18 Dec 29 14:36 pg_xact
-rw-------. 1 postgres postgres    88 Dec 29 14:36 postgresql.auto.conf
-rw-------. 1 postgres postgres 22743 Dec 29 14:36 postgresql.conf
-rw-------. 1 postgres postgres 22721 Dec 29 14:36 postgresql.conf.2158.2018-12-29@14:36:22~
-rw-------. 1 postgres postgres    49 Dec 29 14:36 postmaster.opts
-rw-------. 1 postgres postgres    86 Dec 29 14:36 postmaster.pid

Systemdでの管理状態確認

 SystemdにPostgreSQLのサービスが認識されており、サービスが起動状態であり、 また自動起動が有効になっていることを確認します。

# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: active (running) since Sat 2018-12-29 14:36:23 UTC; 15min ago ←起動状態
     Docs: https://www.postgresql.org/docs/10/static/
  Process: 2474 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 2479 (postmaster)
   CGroup: /system.slice/postgresql-10.service
           tq2479 /usr/pgsql-10/bin/postmaster -D /data/pgdata1/
           tq2481 postgres: logger process
           tq2483 postgres: checkpointer process
           tq2484 postgres: writer process
           tq2485 postgres: wal writer process
           tq2486 postgres: autovacuum launcher process
           tq2487 postgres: archiver process
           tq2488 postgres: stats collector process
           mq2489 postgres: bgworker: logical replication launcher

Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 10 database server...
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.735 JST [2479]...2
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.735 JST [2479]...2
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.737 JST [2479]..."
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.740 JST [2479]..."
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.749 JST [2479]...s
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.749 JST [2479]....
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 10 database server.
Hint: Some lines were ellipsized, use -l to show in full.

プロセスの起動確認

 PostgreSQLのプロセス(マスタサーバプロセスとワーカプロセス)が起動していることを確認します。

# ps -ef | grep postgres | grep -v grep
                        ↓マスタサーバプロセス(1つ)
postgres  2479     1  0 14:36 ?        00:00:00 /usr/pgsql-10/bin/postmaster -D /data/pgdata1/
                        ↓ワーカプロセス(8つ)
postgres  2481  2479  0 14:36 ?        00:00:00 postgres: logger process
postgres  2483  2479  0 14:36 ?        00:00:00 postgres: checkpointer process
postgres  2484  2479  0 14:36 ?        00:00:00 postgres: writer process
postgres  2485  2479  0 14:36 ?        00:00:00 postgres: wal writer process
postgres  2486  2479  0 14:36 ?        00:00:00 postgres: autovacuum launcher process
postgres  2487  2479  0 14:36 ?        00:00:00 postgres: archiver process
postgres  2488  2479  0 14:36 ?        00:00:00 postgres: stats collector process
postgres  2489  2479  0 14:36 ?        00:00:00 postgres: bgworker: logical replication launcher

ログ出力確認

 設定したログファイルにログが出力されていることを確認します。

# ls -l /data/pgdata1/log/
total 4
-rw-------. 1 postgres postgres 186 Dec 29 14:36 postgresql-20181229.log
# cat /data/pgdata1/log/postgresql-20181229.log
2018-12-29 23:36:23.753 JST [2482] LOG:  database system was shut down at 2018-12-29 23:36:21 JST
2018-12-29 23:36:23.757 JST [2479] LOG:  database system is ready to accept connections

SQL実行確認

 psqlコマンドで、SQLを実行できることを確認します。

# su - postgres
-bash-4.2$ psql
psql (10.6)
Type "help" for help.

postgres=# select now();
             now
------------------------------
 2018-12-29 14:55:10.72025+00
(1 row)

postgres=# select oid, datname from pg_database;
  oid  |  datname
-------+-----------
 13806 | postgres
     1 | template1
 13805 | template0
(3 rows)

postgres=# \q
-bash-4.2$ exit
logout

SystemdでPostgreSQLの停止

 PostgreSQLインスタンスを停止します。

# systemctl stop postgresql-10.service
# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sat 2018-12-29 14:56:26 UTC; 7s ago ←停止状態
     Docs: https://www.postgresql.org/docs/10/static/
  Process: 2479 ExecStart=/usr/pgsql-10/bin/postmaster -D ${PGDATA} (code=exited, status=0/SUCCESS)
  Process: 2474 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 2479 (code=exited, status=0/SUCCESS)

Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 10 database server...
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.735 JST [2479]...2
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.735 JST [2479]...2
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.737 JST [2479]..."
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.740 JST [2479]..."
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.749 JST [2479]...s
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal postmaster[2479]: 2018-12-29 23:36:23.749 JST [2479]....
Dec 29 14:36:23 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 10 database server.
Dec 29 14:56:26 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Stopping PostgreSQL 10 database server...
Dec 29 14:56:26 ip-172-31-30-50.ap-northeast-1.compute.internal systemd[1]: Stopped PostgreSQL 10 database server.
Hint: Some lines were ellipsized, use -l to show in full.
# ps -ef | grep postgres | grep -v grep ←プロセスが停止しているので表示されない

アーカイブファイル確認

 PostgreSQLのインストール直後はアーカイブファイルは存在しませんが、 上記動作確認を行っている中でWALファイルが循環し、アーカイブされるため、 最後にアーカイブファイルが作成されていることを確認します。

# ls -l /bkup/pgdata1/pg_arch/
total 16384
-rw-------. 1 postgres postgres 16777216 Dec 29 14:56 000000010000000000000001

参考書籍