AnsibleでPostgreSQL11を構築する
はじめまして、sinokumaです。
Qiita初投稿です。お手柔らかにお願いします。
はじめに
こちらは、Ansible Blogger 2018 (sponsored by Red Hat) Advent Calendar 2018 16日目の記事です。
Ansible Blogger 2018 のテーマは2つあります。
- あなたが好きなAnsible Moduleの紹介
- そのModuleにまつわる使い方(便利なポイント、Tips、失敗談など)
ということで、私からはPostgreSQL Moduleを紹介します。
PostgreSQL Module一覧
2018/12時点では、6つのModuleが存在します。
No. | Module名 | Module概要 |
---|---|---|
1 | postgresql_db | データベースの追加または削除 |
2 | postgresql_ext | extensionの追加または削除 |
3 | postgresql_lang | 手続き型言語の追加または削除 |
4 | postgresql_privs | データベースオブジェクトに対する権限の追加または削除 |
5 | postgresql_schema | スキーマの追加または削除 |
6 | postgresql_user | データベースユーザ(ロール)の追加または削除 |
参考:Database modules > Postgresql |
PostgreSQL Moduleの使い方
私はPostgreSQLのプロビジョニングでこれらのModuleを使っています。
マネージドサービスが普及してPostgreSQLを自前で構築する機会はかなり減少しましたが、手元の開発環境や検証用途で試したい時にPlaybookがあると楽かと思います。
今回は、PostgreSQL11をプロビジョニングするPlaybookを作成しました。
スキーマの作成
- name: Create schema
become_user: postgres
postgresql_schema:
name: "{{ item.name }}"
owner: "{{ item.owner|default('postgres') }}"
port: "{{ postgresql_port }}"
with_items: "{{ postgresql_schemas }}"
データベースの作成
- name: Create database
become_user: postgres
postgresql_db:
name: "{{ item.name }}"
template: "{{ item.template|default('template1') }}"
lc_collate: "{{ item.lc_collate|default('C') }}"
lc_ctype: "{{ item.lc_ctype|default('C') }}"
port: "{{ postgresql_port }}"
with_items: "{{ postgresql_databases }}"
ユーザ(ロール)の作成
- name: Create user
become_user: postgres
postgresql_user:
db: "{{ item.db }}"
name: "{{ item.name }}"
password: "{{ item.password }}"
encrypted: yes
state: present
port: "{{ postgresql_port }}"
with_items: "{{ postgresql_users }}"
※ちゃんとやるなら、パスワードはvault等を利用する方が好ましいと思います。
Module使用時のポイント
python psycopg2をインストールすること
PostgreSQL Moduleを使用するためには、python psycopg2が必須です。
PostgreSQL本体とあわせてインストールしてください。
- name: Install PostgreSQL
yum:
name:
- python-psycopg2
- postgresql11-server
- postgresql11-devel
state: present
portを指定すること
port: "{{ postgresql_port }}"
サンプルコードを見てお気付きかも知れませんが、常にport指定しておくことをオススメします。
特に開発や検証用途の場合、ポート番号を変えることで複数のPostgreSQLを1つのサーバに構築するケースが考えられます。
port
を指定したtask定義にしておくことで、ポート番号を変更するケースにも柔軟に対応できます。
pg_hba.confを事前に検証すること
これらモジュールをいくら駆使しても、結局PostgreSQLに接続できなければ意味がありません。
Playbookのテストをする前にpg_hba.conf
の設定が想定どおりかつ問題ないか、psql
を使って事前に検証しておくとよりスムーズに作業を進められると思います。
ちなみにですが、今回のPlaybookのテストはCentOSのDockerコンテナを使って実施しました(tests/docker
ディレクトリ参照)。
Playbookのテストを楽にできる方法が他にあればぜひ教えてください!
おわりに
いかがでしたでしょうか。この記事が少しでも多くの方の役に立つことができれば嬉しいです。
今回作成したPlaybookは、sinokuma/postgresql-playbookに公開しておりますので良ければご利用ください。
今後ともよろしくお願いします!