diff --git a/' b/' deleted file mode 100644 index e7ecb71..0000000 --- a/' +++ /dev/null @@ -1,13 +0,0 @@ ---- -- name: Verify - hosts: all - gather_facts: false - tasks: - - name: Get PostgreSQL version - regsiter: psql_version - ansible.builtin.command: - cmd: psql --version - - - name: Display PostgreSQL version - debug: - var: psql_version.stdout diff --git a/.gitignore b/.gitignore index 9e8b6b1..9ab76a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ .DS_Store *.pyc __pycache__ -files/ diff --git a/defaults/main.yaml b/defaults/main.yaml index a90cec9..7dea22e 100644 --- a/defaults/main.yaml +++ b/defaults/main.yaml @@ -1,20 +1,8 @@ --- -postgresql_version: "{{ vars.postgresql.version }}" +postgresql_version: "{{ ansible_local.postgresql.version | default(16) }}" postgresql: - version: 13 # Is ignored on FreeBSD Proservers - prefix: - config: >- - {%- if ansible_system == 'Linux' -%} - /etc/postgresql/{{ postgresql_version }}/main/conf.d - {%- elif ansible_system == 'FreeBSD' -%} - {%- if postgresql_version == "15" -%} - /var/db/postgres/data{{ postgresql_version }} - {%- else -%} - /var/db/postgresql/data{{ postgresql_version }} - {%- endif -%} - {%- else -%} - /usr/local/etc/main/conf.d - {%- endif -%} + version: "{{ postgresql_version }}" + prefix: "{{ ansible_local.postgresql.prefix | default('') }}" users: {} privileges: {} databases: diff --git a/files/postgresql.fact.py b/files/postgresql.fact.py new file mode 100644 index 0000000..5c0a4cb --- /dev/null +++ b/files/postgresql.fact.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +import os +import re +import json +import subprocess + +class PostgresqlFacts: + def get_os_family(self) -> str: + if os.path.exists("/etc/os-release"): + os_vars = {} + with open("/etc/os-release", "r", encoding="utf-8") as os_release: + for line in os_release.readlines(): + key, value = line.split("=") + os_vars.update({key: value}) + if os_vars.get("ID_LIKE"): + os_family = str(os_vars.get("ID_LIKE")).lower().strip() + else: + os_family = str(os_vars.get("ID")).lower().strip() + else: + os_family = re.findall(r"debian|freebsd", os.uname().version.lower()) + if len(os_family) == 0: + raise OSError(f"Unsupported OS family: {os.uname().version}") + else: + os_family = os_family[0] + if os_family == "debian" or os_family == "freebsd": + return os_family + else: + raise OSError(f"Unsupported OS family: {os_family}") + + def get_postgresql_version(self) -> int: + os_family = self.get_os_family() + if os_family == "debian": + command='apt-cache search --names-only "^postgresql-[0-9]+$" | grep -Po "[0-9]+"' + else: + command='psql --version | sed "s/^.*\\([0-9][0-9]\\).*$/\\1/"' + command_output = subprocess.run(command, shell=True, capture_output=True) + if len(command_output.stdout) > 0: + return int(command_output.stdout.decode().strip()) + else: + raise OSError(f"Error detecting the PostgreSQL version: {command_output.stderr.decode()}") + + def get_postgresql_dbdir(self) -> str: + os_family = self.get_os_family() + version = self.get_postgresql_version() + if os_family == "debian": + dbdir = f"/etc/postgresql/{version}/main/conf.d" + else: + if version >= 15: + dbdir = f"/var/db/postgres/data{version}" + else: + dbdir = f"/var/db/postgresql/data{version}" + return dbdir + + def generate_postgresql_facts(self) -> dict: + return { + 'version': str(self.get_postgresql_version()), + 'prefix': {"config": self.get_postgresql_dbdir()}, + } + +class Facts: + def __str__(self): + return json.dumps(PostgresqlFacts().generate_postgresql_facts()) + +if __name__ == '__main__': + print(Facts()) diff --git a/tasks/main.yaml b/tasks/main.yaml index 37ec333..62cbc9f 100644 --- a/tasks/main.yaml +++ b/tasks/main.yaml @@ -1,7 +1,6 @@ --- -- name: Determine the PostgreSQL version (FreeBSD Proserver) - ansible.builtin.include_tasks: postgresql_version.yaml - when: ansible_system == 'FreeBSD' +- name: Set the PostgreSQL facts + ansible.builtin.include_tasks: postgresql_fact.yaml - name: Install PostgreSQL (Linux) ansible.builtin.include_tasks: install.yaml diff --git a/tasks/postgresql_fact.yaml b/tasks/postgresql_fact.yaml new file mode 100644 index 0000000..96ab053 --- /dev/null +++ b/tasks/postgresql_fact.yaml @@ -0,0 +1,33 @@ +--- +- name: Update apt cache (Debian-based) + changed_when: no + check_mode: no + when: "ansible_os_family == 'Debian'" + ansible.builtin.apt: + update_cache: yes + +- name: Create directory for Ansible facts + loop: + - "/etc/ansible" + - "/etc/ansible/facts.d" + check_mode: no + ansible.builtin.file: + mode: "0755" + owner: root + path: "{{ item }}" + state: directory + +- name: Template PostrgreSQL facts + check_mode: no + ansible.builtin.copy: + owner: root + src: postgresql.fact.py + dest: "/etc/ansible/facts.d/postgresql.fact" + mode: a+x + register: postgresql_template_fact_result + +- name: Reload facts + check_mode: no + when: postgresql_template_fact_result.changed + changed_when: yes + ansible.builtin.setup: {} diff --git a/tasks/postgresql_version.yaml b/tasks/postgresql_version.yaml deleted file mode 100644 index eb7937b..0000000 --- a/tasks/postgresql_version.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Get PostgreSQL version - changed_when: no - register: postgresql_version_full - check_mode: no - ansible.builtin.shell: - cmd: | - set -o pipefail - psql --version | sed "s/^.*\([0-9][0-9]\).*$/\1/" - -- name: Set PostgreSQL version fact - ansible.builtin.set_fact: - postgresql_version: "{{ postgresql_version_full.stdout }}" - -- name: Set PostgreSQL version fact - ansible.builtin.set_fact: - postgresql: "{{ postgresql | combine({'version': postgresql_version_full.stdout}) }}"