In twee minuten een PostgreSQL Database up-and-running met behulp van Ansible

Door gebruik te maken van Ansible kunnen we het installeren en configureren van verschillende componenten automatiseren, zoals bijvoorbeeld voor de PostgreSQL database. Voor het installeren en configureren van de PostgreSQL database gebruiken we de volgende stappen:

  • Gebruikte variabelen (in Ansible):
postgresql_packages:
  - postgresql11
  - postgresql11-server

postgresql_bin_dir: "/usr/pgsql-11/bin"
postgresql_data_dir: "/var/lib/pgsql/11/data"
postgresql_initdb_command: "{{ postgresql_bin_dir }}/postgresql-11-setup initdb"
postgresql_user: "postgres"
postgresql_group: "postgres"
postgresql_listen_addresses: "localhost,{{ db1_fqdn }}"

postgresql_postgres_conf_path: "{{ postgresql_data_dir }}/postgresql.conf"
postgresql_pg_hba_conf_path: "{{ postgresql_data_dir }}/pg_hba.conf"

postgresql_example_database: "exampledb"
postgresql_example_user: "example"
postgresql_example_password: "set_in_inventory"
postgresql_example_privileges: "ALL"
  • Voeg de PostgreSQL repository toe (meer informatie kan hier gevonden worden).
  • Installeer de PostgreSQL packages.
  • Initialiseer de database.
  • Creëer een applicatie database door gebruik te maken van de Ansible module postgresql_db. Om deze module te kunnen gebruiken is de python package psycopg2 (of psycopg2-binary) nodig, zie ook de requirements sectie. Python packages worden geïnstalleerd door gebruik te maken van pip.
  • Creëer een applicatie gebruiker door gebruik te maken van de Ansible module postgresql_user. Ook voor deze module is pyhton package psycopg2 (of psycopg2-binary) nodig.
  • Pas de PostgreSQL configuratie (postgresql.conf) aan, dat wil zeggen door parameters te zetten als listen_addresses, max_connections, en max_prepared_transactions.Aangezien we in de test gebruik maken van XA-transacties, moet max_prepared_transactions gezet worden. Zorg ervoor dat de max_prepared_transactions minstens zo hoog is als de max_connections, anders krijgen we heuristische problemen, dat wil zeggen, op XA-transacties kunnen administratieve acties worden uitgevoerd. Deze administratieve acties zijn heuristisch omdat het eenzijdige beslissingen zijn die van invloed zijn op de uitkomst van transacties. Heuristische administratieve acties kunnen de atomiciteit van transacties doorbreken als de administratieve actie afwijkt van wat werd gekozen door het initiële applicatie request.
...
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '{{ postgresql_listen_addresses }}'
port = 5432
max_connections = 100
...
# - Memory -
...
max_prepared_transactions = 100
...
...
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

# Allow user example from any host with IP address {{ demo_domain_ips }} to connect to database exampledb.
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    {{ postgresql_example_database }}       {{ postgresql_example_user }}         {{ demo_domain_ips }}          password

Als we het bovenstaande combineren in een Ansible playbook, hebben we het volgende:

- name: install postgresql repository configuration
  yum:
    name=https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-oraclelinux11-11-2.noarch.rpm
    state=present

- name: install postgresql
  yum:
    name: "{{ postgresql_packages }}"
    state: present

#- name: install postgresql python library
#  pip:
#    name: psycopg2
#    state: latest
#  environment:
#    PATH: "{{ ansible_env.PATH }}:{{ postgresql_bin_dir }}"

- name: initialize postgresql database
  command: /bin/sh -c "{{ postgresql_initdb_command }}"
    creates="{{ postgresql_data_dir }}/PG_VERSION"
  register: postgresql_database_initialized
  
- name: enable and start postgresql database
  systemd:
    name: postgresql-11
    state: started
    enabled: yes
  register: postgresql_started
  
- name: create application database
  become: true
  become_user: "{{ postgresql_user }}"
  become_method: sudo
  postgresql_db:
    name: "{{ postgresql_example_database }}"
    state: present

- name: create user for application database
  become: true
  become_user: "{{ postgresql_user }}"
  become_method: sudo
  postgresql_user:
    name: "{{ postgresql_example_user }}"
    password: "{{ postgresql_example_password }}"
    db: "{{ postgresql_example_database }}"
    priv: "{{ postgresql_example_privileges }}" 
    state: present
    
- name: edit postgresql configuration
  template:
    src: roles/demo_postgresql/templates/postgres_conf.j2
    dest: "{{ postgresql_postgres_conf_path }}"
    owner: "{{ postgresql_user }}"
    group: "{{ postgresql_group }}"
    mode: 0600
  register: postgresql_configuration_edited
  
- name: edit postgresql client authentication
  template:
    src: roles/demo_postgresql/templates/pg_hba_conf.j2
    dest: "{{ postgresql_pg_hba_conf_path }}"
    owner: "{{ postgresql_user }}"
    group: "{{ postgresql_group }}"
    mode: 0600
  register: postgresql_client_authentication_edited
  
- name: restart postgresql database
  systemd:
    name: postgresql-11
    state: restarted
  when: postgresql_configuration_edited is changed or postgresql_client_authentication_edited is changed

Om de opzet te testen maken we gebruik van de applicatie die hier wordt gepresenteerd. Merk op dat de applicatie transacties initieert waarbij twee resources betrokken zijn, dat wil zeggen, Java Messaging en een Database (in dit geval PostgreSQL). Naast dat Java Messaging geconfigureerd moet worden, moet er voor de database een data source geconfigureerd worden in een JavaEE Applicatie Server zoals bijvoorbeeld WebLogic. Deze data source moet of XA-enabled zijn of gebruik maken van Logging Last Resource (meer informatie kan hier gevonden worden). Als de data source is geconfigureerd hebben we het volgende in de WebLogic config:

[oracle@java1 jdbc]$ cat postgresql_ds-jdbc.xml
<jdbc-data-source ...>
  <name>postgresql_ds</name>
  <datasource-type>GENERIC</datasource-type>
  <jdbc-driver-params>
    <url>jdbc:postgresql://db1.axisict.com:5432/exampledb</url>
    <driver-name>org.postgresql.xa.PGXADataSource</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>example</value>
      </property>
    </properties>
    <password-encrypted>{AES}E/473USUywhmwElhAOeSFnfccWfzH5T5+tg3ZAZolxM=</password-encrypted>
  </jdbc-driver-params>
  <jdbc-connection-pool-params>
    <test-table-name>SQL SELECT 1</test-table-name>
  </jdbc-connection-pool-params>
  <jdbc-data-source-params>
    <jndi-name>jdbc/exampleDS</jndi-name>
    <global-transactions-protocol>TwoPhaseCommit</global-transactions-protocol>
  </jdbc-data-source-params>
</jdbc-data-source>

In de opzet maken we gebruik van de PGXADataSource aangezien deze de XADataSource interface implementeerd (dit laatste is van belang als we te maken hebben met XA-transacties).

Met het automatiseren van omgevingen maken we IT simpel (en foutloos).

Scroll to Top