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

作成日: 2017/05/02

OSSでLinuxサーバ構築

Ansible 2.2.1.0のPlaybookでCentOS 7.3へPostgreSQL 9.6をインストール

トップページOSSでLinuxサーバ構築 > Ansible 2.2.1.0のPlaybookでCentOS 7.3へPostgreSQL 9.6をインストール
このエントリーをはてなブックマークに追加

概要

 Ansibleを利用してPostgreSQLのインストールと設定を行います。 まだAnsibleを利用し始めたばかりなので、Ansibleのコンセプトである冪等性はあまり考慮しないものとし、 Ansibleを使った構築の自動化をやってみようぐらいの感じで試しています。 Playbookも1つのファイルにダラダラとタスクを書いていますが、 ベストプラクティスではないことは認識の上なのでご了承ください。

 Ansibleを利用して既にApacheとWildFlyのインストールを行ったサーバに 追加でPostgreSQLを実行するため、Ansibleの基本的な設定は完了しているところから手順をスタートします。 今回は勉強も兼ねていたので、PostgreSQLの設定ファイルはAnsibleのタスクで文字列置換や行挿入を行いましたが、 Gitのリポジトリから取得するとか、Ansibleサーバで設定ファイルを保持して配布するやり方の方が 一般的なのかなと思います。

構成

想定環境

Ansible実行構成

サーバ構成

OSバージョン

CentOS 7.3.1611 x86_64

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

  • ansible-2.2.1.0-1.el7.noarch.rpm

サーバ構築

1. 事前準備

 CentOS 7.3にAnsibleがインストール済みである前提で以下の手順を進めていきます。 また、Ansibleの初期設定やSSH接続する上で必要な秘密鍵・公開鍵のペア作成や、 authorized_keysへの公開鍵の登録は完了している前提とします。 もし未設定の場合はこちらで事前準備とAnsibleの設定を 済ませた上で下記操作に移ってください。

2. Ansibleの設定

(1) インベントリファイル修正

 今回はApache、WildFlyがインストール済みのサーバに追加でPostgreSQLをインストールする Playbookを作成して実行します。 ApacheとWildFlyをインストールした際に webservers という名のホストグループが インベントリファイルに登録済みの状態であるとし、PostgreSQLをインストールするために dbservers という名のホストグループを追加で登録します。 ただし、今回は同一サーバにインストールするため、各ホストグループに所属するノード(IPアドレス)は同一となります。

# cd /etc/ansible/
# vi hosts
ファイル名:/etc/ansible/hosts
※ファイルの末尾に追加※
[webservers]
192.168.0.11

[dbservers]
192.168.0.11

3. PostgreSQLをインストールするPlaybookの作成と実行

(1) Playbookの作成

 PostgreSQLをインストールするためのPlaybookを作成します。 今回もまずは一通り動くPlaybookを作成することを目指したため、 冪等性とかPlaybookを効率的に使い回すためのファイル分割みたいな考えは考慮していません。

# cd /etc/ansible/
# vi playbook_postgesql.yml ←ファイルを新規作成
ファイル名:/etc/ansible/playbook_postgresql.yml
※ファイルを新規作成※
---
- name: DBサーバのセットアップ
  hosts: dbservers
  tasks:
    - name: PostgreSQLのダウンロード1
      get_url: url=https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-9.6.2-2PGDG.rhel7.x86_64.rpm
               dest=/tmp

    - name: PostgreSQLのダウンロード2
      get_url: url=https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-libs-9.6.2-2PGDG.rhel7.x86_64.rpm
               dest=/tmp

    - name: PostgreSQLのダウンロード3
      get_url: url=https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-server-9.6.2-2PGDG.rhel7.x86_64.rpm
               dest=/tmp

    - name: PostgreSQLのインストール
      yum: name=/tmp/{{item}} state=present
      with_items:
        - postgresql96-9.6.2-2PGDG.rhel7.x86_64.rpm
        - postgresql96-libs-9.6.2-2PGDG.rhel7.x86_64.rpm
        - postgresql96-server-9.6.2-2PGDG.rhel7.x86_64.rpm

    - name: パスワード設定
      user: name=postgres password={{ 'Passw0rd-' | password_hash('sha512') }} state=present

    - name: 環境変数設定1
      replace: dest=/var/lib/pgsql/.bash_profile regexp='^PGDATA=.*' replace='PGDATA=/data/pgdata1' backup=yes

    - name: 環境変数設定2
      lineinfile: dest='/var/lib/pgsql/.bash_profile' insertafter='export PGDATA' line='PATH=$PATH:/usr/pgsql-9.6/bin'

    - name: ディレクトリ作成1
      file: path=/data state=directory owner=root group=root mode=0777

    - name: ディレクトリ作成2
      file: path=/data/pgdata1 state=directory owner=postgres group=postgres mode=0700

    - name: データベースクラスタ作成
      shell: /usr/pgsql-9.6/bin/initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1
      become: yes
      become_user: postgres

    - name: クライアント認証の設定1
      replace: dest=/data/pgdata1/pg_hba.conf regexp='^local' replace='#local' backup=yes

    - name: クライアント認証の設定2
      replace: dest=/data/pgdata1/pg_hba.conf regexp='^host' replace='#host' backup=yes

    - name: クライアント認証の設定3
      lineinfile: dest=/data/pgdata1/pg_hba.conf line='local   all             postgres                                peer'

    - name: クライアント認証の設定4
      lineinfile: dest=/data/pgdata1/pg_hba.conf line='local   all             all                                     md5'

    - name: クライアント認証の設定5
      lineinfile: dest=/data/pgdata1/pg_hba.conf line='host    all             all             0.0.0.0/0               md5'

    - name: PostgreSQL起動
      shell: /usr/pgsql-9.6/bin/pg_ctl start -w
      become: yes
      become_user: postgres
      environment:
        PGDATA: /data/pgdata1

    - name: DBユーザのパスワード設定
      shell: /usr/pgsql-9.6/bin/psql -c "alter role postgres with password 'password';"
      become: yes
      become_user: postgres

(2) Playbookの実行

 作成したPostgreSQLインストール用のPlaybookを実行します。

# ansible-playbook playbook_postgesql.yml

PLAY [DBサーバのセットアップ] ************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.11]

TASK [PostgreSQLのダウンロード1] ******************************************************
changed: [192.168.0.11]

TASK [PostgreSQLのダウンロード2] ******************************************************
changed: [192.168.0.11]

TASK [PostgreSQLのダウンロード3] ******************************************************
changed: [192.168.0.11]

TASK [PostgreSQLのインストール] *******************************************************
changed: [192.168.0.11] => (item=[u'/tmp/postgresql96-9.6.2-2PGDG.rhel7.x86_64.rpm', u'/tmp/postgresql96-libs-9.6.2-2PGDG.rhel7.x86_64.rpm', u'/tmp/postgresql96-server-9.6.2-2PGDG.rhel7.x86_64.rpm'])

TASK [パスワード設定] *****************************************************************
changed: [192.168.0.11]

TASK [環境変数設定1] *****************************************************************
changed: [192.168.0.11]

TASK [環境変数設定2] *****************************************************************
changed: [192.168.0.11]

TASK [ディレクトリ作成1] ***************************************************************
changed: [192.168.0.11]

TASK [ディレクトリ作成2] ***************************************************************
changed: [192.168.0.11]

TASK [データベースクラスタ作成] ************************************************************
changed: [192.168.0.11]

TASK [クライアント認証の設定1] ************************************************************
changed: [192.168.0.11]

TASK [クライアント認証の設定2] ************************************************************
changed: [192.168.0.11]

TASK [クライアント認証の設定3] ************************************************************
changed: [192.168.0.11]

TASK [クライアント認証の設定4] ************************************************************
changed: [192.168.0.11]

TASK [クライアント認証の設定5] ************************************************************
changed: [192.168.0.11]

TASK [PostgreSQL起動] ************************************************************
changed: [192.168.0.11]

TASK [DBユーザのパスワード設定] ***********************************************************
changed: [192.168.0.11]

PLAY RECAP *********************************************************************
192.168.0.11               : ok=18   changed=17   unreachable=0    failed=0

#

 上記のように unreachable とfailed が 0 となっていれば成功です。

(3) Playbookの実行結果確認

 Ansibleの操作が成功していることを確認します。

# ls -l /tmp/postgresql96* ←ダウンロードしたファイルの確認
-rw-r--r-- 1 root root 1414964  5月  1 17:29 /tmp/postgresql96-9.6.2-2PGDG.rhel7.x86_64.rpm
-rw-r--r-- 1 root root  317336  5月  1 17:29 /tmp/postgresql96-libs-9.6.2-2PGDG.rhel7.x86_64.rpm
-rw-r--r-- 1 root root 4518768  5月  1 17:30 /tmp/postgresql96-server-9.6.2-2PGDG.rhel7.x86_64.rpm
# rpm -qa | grep postgresql96 ←インストールされたパッケージの確認
postgresql96-libs-9.6.2-2PGDG.rhel7.x86_64
postgresql96-server-9.6.2-2PGDG.rhel7.x86_64
postgresql96-9.6.2-2PGDG.rhel7.x86_64
# su - wildfly ←rootだとsuしてもパスワードが不要なため、一旦適当な一般ユーザにsuする
最終ログイン: 2017/04/27 (木) 01:22:31 JST日時 pts/0
$ su - postgres ←postgresユーザにsuし、設定したパスワードでログインできることを確認
パスワード: ←パスワードの入力
最終ログイン: 2017/05/01 (月) 23:46:52 JST日時 pts/0 ←ログインできた
-bash-4.2$ exit
ログアウト
$ exit
ログアウト
# grep postgres /etc/shadow ←パスワードが設定されたことを確認
postgres:$6$Z0fbYjivS7s4UD3R$wOq19ctiwcdNGE1Ijn8ZsTsg7SIEo6eUdYi/djhenC9q84U31i.vTbm9HLtxmlsx13U5dLGhfUoQxwbA7SGUm1:17287:::::: ←ハッシュ化したパスワードが設定されていることを確認
# cat /var/lib/pgsql/.bash_profile ←環境変数が設定されたことを確認
[ -f /etc/profile ] && source /etc/profile
PGDATA=/data/pgdata1 ←文字列が置換されていることを確認
export PGDATA
PATH=$PATH:/usr/pgsql-9.6/bin ←行が挿入されたことを確認
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
# ls -ld /data
drwxrwxrwx 4 root root 36  5月  1 15:58 /data ←ディレクトリが作成されたことを確認
# ls -ld /data/pgdata1
drwx------ 20 postgres postgres 4096  5月  1 15:59 /data/pgdata1 ←ディレクトリが作成されたことを確認
# ls -l /data/pgdata1/ ←PostgreSQLのデータベースクラスタが作成されたことを確認
合計 72
-rw------- 1 postgres postgres     4  5月  1 15:58 PG_VERSION
drwx------ 5 postgres postgres    41  5月  1 15:58 base
drwx------ 2 postgres postgres  4096  5月  1 15:59 global
drwx------ 2 postgres postgres    18  5月  1 15:58 pg_clog
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_commit_ts
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_dynshmem
-rw------- 1 postgres postgres  4676  5月  1 15:59 pg_hba.conf
-rw------- 1 root     root      4468  5月  1 15:58 pg_hba.conf.3579.2017-05-01@15:58:44~
-rw------- 1 root     root      4469  5月  1 15:58 pg_hba.conf.3631.2017-05-01@15:58:49~
-rw------- 1 postgres postgres  1636  5月  1 15:58 pg_ident.conf
drwx------ 2 postgres postgres    32  5月  1 15:59 pg_log
drwx------ 4 postgres postgres    39  5月  1 15:58 pg_logical
drwx------ 4 postgres postgres    36  5月  1 15:58 pg_multixact
drwx------ 2 postgres postgres    18  5月  1 15:59 pg_notify
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_replslot
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_serial
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_snapshots
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_stat
drwx------ 2 postgres postgres    63  5月  1 16:26 pg_stat_tmp
drwx------ 2 postgres postgres    18  5月  1 15:58 pg_subtrans
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_tblspc
drwx------ 2 postgres postgres     6  5月  1 15:58 pg_twophase
drwx------ 3 postgres postgres    60  5月  1 15:58 pg_xlog
-rw------- 1 postgres postgres    88  5月  1 15:58 postgresql.auto.conf
-rw------- 1 postgres postgres 22208  5月  1 15:58 postgresql.conf
-rw------- 1 postgres postgres    28  5月  1 15:59 postmaster.opts
-rw------- 1 postgres postgres    85  5月  1 15:59 postmaster.pid
# cat /data/pgdata1/pg_hba.conf ←クライアント認証が設定されたことを確認
(前略)
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
#local   all             all                                     trust ←コメントアウトされたことを確認
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust ←コメントアウトされたことを確認
# IPv6 local connections:
#host    all             all             ::1/128                 trust ←コメントアウトされたことを確認
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                trust
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust
local   all             postgres                                peer ←行が挿入されたことを確認
local   all             all                                     md5 ←行が挿入されたことを確認
host    all             all             0.0.0.0/0               md5 ←行が挿入されたことを確認
# ps -ef | grep postgres ←プロセスが起動していることを確認
postgres  3848     1  0 15:59 ?        00:00:00 /usr/pgsql-9.6/bin/postgres
postgres  3849  3848  0 15:59 ?        00:00:00 postgres: logger process
postgres  3851  3848  0 15:59 ?        00:00:00 postgres: checkpointer process
postgres  3852  3848  0 15:59 ?        00:00:00 postgres: writer process
postgres  3853  3848  0 15:59 ?        00:00:00 postgres: wal writer process
postgres  3854  3848  0 15:59 ?        00:00:00 postgres: autovacuum launcher process
postgres  3855  3848  0 15:59 ?        00:00:00 postgres: stats collector process
root      4027  2717  0 16:28 pts/1    00:00:00 grep --color=auto postgres
# su - postgres
最終ログイン: 2017/05/01 (月) 16:32:16 JST日時 pts/1
-bash-4.2$ psql -W ←パスワード入力で認証することをオプションで指定
パスワード: ←postgres(DBユーザ)のパスワードを入力
psql (9.6.2) ←設定したパスワードでログインできた
"help" でヘルプを表示します.

postgres=# \q
-bash-4.2$ exit
ログアウト
#

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会


第000414号