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サーバで設定ファイルを保持して配布するやり方の方が 一般的なのかなと思います。
構成
想定環境
サーバ構成
OSバージョン
CentOS 7.3.1611 x86_64
ソフトウェア・パッケージ一覧
- ansible-2.2.1.0-1.el7.noarch.rpm
環境構築
事前準備
CentOS 7.3にAnsibleがインストール済みである前提で以下の手順を進めていきます。 また、Ansibleの初期設定やSSH接続する上で必要な秘密鍵・公開鍵のペア作成や、 authorized_keysへの公開鍵の登録は完了している前提とします。 もし未設定の場合はこちらで事前準備とAnsibleの設定を 済ませた上で下記操作に移ってください。
Ansibleの設定
インベントリファイル修正
今回はApache、WildFlyがインストール済みのサーバに追加でPostgreSQLをインストールする Playbookを作成して実行します。 ApacheとWildFlyをインストールした際に webservers という名のホストグループが インベントリファイルに登録済みの状態であるとし、PostgreSQLをインストールするために dbservers という名のホストグループを追加で登録します。 ただし、今回は同一サーバにインストールするため、各ホストグループに所属するノード(IPアドレス)は同一となります。
# cd /etc/ansible/ # vi hosts
※ファイルの末尾に追加※
[webservers]
192.168.0.11
[dbservers]
192.168.0.11
PostgreSQLをインストールするPlaybookの作成と実行
Playbookの作成
PostgreSQLをインストールするためのPlaybookを作成します。 今回もまずは一通り動くPlaybookを作成することを目指したため、 冪等性とかPlaybookを効率的に使い回すためのファイル分割みたいな考えは考慮していません。
# cd /etc/ansible/
# vi playbook_postgesql.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
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 となっていれば成功です。
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 ログアウト #