Ansible 2.7.4のPlaybookでPostgreSQL 10を導入
目次
概要
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 |
vCPU | 1 |
メモリ | 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
※ファイルを新規作成※
[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
※ファイルを新規作成※
---
- 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