3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ansible Blogger 2018 (sponsored by Red Hat)Advent Calendar 2018

Day 16

AnsibleでPostgreSQL11をプロビジョニングする(PostgreSQL Moduleの紹介)

Last updated at Posted at 2018-12-16

AnsibleでPostgreSQL11を構築する

はじめまして、sinokumaです。
Qiita初投稿です。お手柔らかにお願いします。

はじめに

こちらは、Ansible Blogger 2018 (sponsored by Red Hat) Advent Calendar 2018 16日目の記事です。
Ansible Blogger 2018 のテーマは2つあります。

  1. あなたが好きなAnsible Moduleの紹介
  2. その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に公開しておりますので良ければご利用ください。

今後ともよろしくお願いします!

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?