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
, enmax_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
...
- Pas de pg_hba.conf file aan
...
# 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).