+++ /dev/null
-# POSTGRESQL
-
-## Zielsetzung
-Hier wird beschrieben, wie die Datenbank- und Rechteverwaltung unter PostGreSQL funktioniert.
-
-## Eigenheiten von PostGreSQL
-### Root-Zugriff (automatisch eingerichter Superuser)
-Die Rechteverwaltung findet in der DB postgres statt.
-
-Man erhält Zugriff auf alles, wenn man mit dem (Linux-)Benutzer "postgres" auf die zugreift:
-```
-sudo -u postgres psql postgres
-```
-
-## Rollen, Gruppen, Benutzer
-
-- Für die Rechteverwaltung gibt es nur ein Objekt, die Rolle.
-- Eine Rolle kann ein Benutzer sein: Dann hat sie normalerweise das Attribut LOGIN, darf sich also anmelden. Eine Rolle mit LOGIN braucht ein Passwort.
-- Eine Rolle kann eine Gruppe sein: Dann hat sie normalerweise das Attribut NOLOGIN und kein Passwort.
-- Eine Rolle kann mehreren anderen Rollen zugeordent werden (Gruppeneigenschaft), die dann die Rechte dieser Rolle übernehmen
-
-```
-# Anlegen einer Gruppe admins:
-CREATE ROLE admins WITH CREATEDB CREATEROLE NOLOGIN;
-# Anlegen eines Benutzers dba:
-CREATE ROLE dba LOGIN PASSWORD 'NoOneKnows';
-# Anlegen weiteren Benutzers admbackup:
-CREATE ROLE admbackup LOGIN PASSWORD 'ForgetAtOnce';
-# Zuordnen zur Gruppe:
-GRANT admins TO dba, admbackup;
-# Ändern des Passworts:
-ALTER USER dba WITH PASSWORD 'NoOneKnows';
-```
-
-## Datenbanken
-- Es gibt keinen globalen Zugriff auf alle Datenbanken (Superuser): Jede berechtigte Rolle muss explizit zugewiesen werden.
-- Eine DB braucht einen Besitzer (Rolle)
-
-Konvention:
-- Jede Datenbank hat eine gleichnamige Gruppe (Rolle), die Besitzer der DB ist
-- Über Gruppenzugehörigkeit wird der Zugriff auf andere Benutzer gewährt
-
-### Anlegen der Datenbank mydb
-```
-# Anlegen der Rolle
-CREATE ROLE mydb WITH CREATEDB CREATEROLE NOLOGIN;
-# Anlegen der DB:
-CREATE DATABASE mydb OWNER = mydb;
-# Zugriff von Benutzer Jonny auf mydb:
-GRANT mydb TO jonny;
-```
\ No newline at end of file
--- /dev/null
+# POSTGRESQL
+
+## Zielsetzung
+Hier wird beschrieben, wie die Datenbank- und Rechteverwaltung unter PostGreSQL funktioniert.
+
+## Eigenheiten von PostGreSQL
+### Root-Zugriff (automatisch eingerichter Superuser)
+Die Rechteverwaltung findet in der DB postgres statt.
+
+Man erhält Zugriff auf alles, wenn man mit dem (Linux-)Benutzer "postgres" auf die zugreift:
+```
+sudo -u postgres psql postgres
+```
+
+## Rollen, Gruppen, Benutzer
+
+- Für die Rechteverwaltung gibt es nur ein Objekt, die Rolle.
+- Eine Rolle kann ein Benutzer sein: Dann hat sie normalerweise das Attribut LOGIN, darf sich also anmelden. Eine Rolle mit LOGIN braucht ein Passwort.
+- Eine Rolle kann eine Gruppe sein: Dann hat sie normalerweise das Attribut NOLOGIN und kein Passwort.
+- Eine Rolle kann mehreren anderen Rollen zugeordent werden (Gruppeneigenschaft), die dann die Rechte dieser Rolle übernehmen
+
+```
+# Anlegen einer Gruppe admins:
+CREATE ROLE admins WITH CREATEDB CREATEROLE NOLOGIN;
+# Anlegen eines Benutzers dba:
+CREATE ROLE dba LOGIN PASSWORD 'NoOneKnows';
+# Anlegen weiteren Benutzers admbackup:
+CREATE ROLE admbackup LOGIN PASSWORD 'ForgetAtOnce';
+# Zuordnen zur Gruppe:
+GRANT admins TO dba, admbackup;
+# Ändern des Passworts:
+ALTER USER dba WITH PASSWORD 'NoOneKnows';
+```
+
+## Datenbanken
+- Es gibt keinen globalen Zugriff auf alle Datenbanken (Superuser): Jede berechtigte Rolle muss explizit zugewiesen werden.
+- Eine DB braucht einen Besitzer (Rolle)
+
+Konvention:
+- Jede Datenbank hat eine gleichnamige Gruppe (Rolle), die Besitzer der DB ist
+- Über Gruppenzugehörigkeit wird der Zugriff auf andere Benutzer gewährt
+
+### Anlegen der Datenbank mydb
+```
+# Anlegen der Rolle
+CREATE ROLE mydb WITH CREATEDB CREATEROLE NOLOGIN;
+# Anlegen der DB:
+CREATE DATABASE mydb OWNER = mydb;
+# Zugriff von Benutzer Jonny auf mydb:
+GRANT mydb TO jonny;
+```
\ No newline at end of file
--- /dev/null
+# Wartung und Installation von {{ project }}
+
+Hier wird beschrieben, wie bestimmte Aufgaben mittels Ansible durchgeführt werden können.
+
+## Wartung
+### Linux-Benutzer
+- neuer Benutzer: Änderung in vars/users.yaml
+```
+ansible-playbook playbooks/i_11_user.yaml
+```
+### Webauftritte
+Es wird eine neue Website xxx.example.net benötigt:
+```
+ansible-playbook webapp_create.yaml -e domain=xxx.example.net -e db_name=dbexample -e db_user=dbexample -e db_password=xxx
+```
+### Firewall-Änderung
+Änderung in vars/firewalld.yaml eintragen.
+```
+ansible-playbook playbooks/i_80_firewalld.yaml
+```
+
+### Email-Server-Änderung
+- Alias-Änderung: Änderung in templates.local/postfix/alias.yaml eintragen
+- Postfix-Änderung in main.cf: Änderung in templates.local/postfix/send_only/main.cf eintragen.
+- Postfix-Änderung in master.cf: Änderung in templates.local/postfix/send_only/master.cf eintragen.
+```
+ansible-playbook playbooks/i_60_postfix.yaml
+```
+
+### PHP-Konfiguration-Änderung
+- Änderung in vars/php.yaml eintragen
+```
+for VERS in 7.4 8.2 8.3; do
+ ansible-playbook playbooks/i_40_php8.2.yaml -e php_version=$VERS
+done
+```
+
+### Neues Software-Paket
+- Änderung in vars/packages.yaml
+```
+ansible-playbook playbooks/i_15_server_packages.yaml
+```
+
+### Änderung bei /etc/fstab /etc/exports /etc/hosts
+- Änderung in der Datei unter templates.local/system.files/ eintragen.
+```
+ansible-playbook playbooks/system_files.yaml
+```
+
+
+## Installation
+- Am besten zuerst das Kapitel "Wartung" durchgehen, dort sind die Dateien aufgeführt, in denen konfiguriert wird.
+- Nie in templates.fix konfigurieren:
+ - das wird vom Paket ansknife bereitgestellt und das sind nur symbolische Links
+ - die Dateien sind schreibgeschützt
+
+### Benutzte Playbooks
+- i_10_basic.yaml
+- i_11_user.yaml
+- i_15_server.yaml
+- i_17_configuration.yaml
+- i_20_configuration.yaml
+- i_30_mariadb.yaml
+- i_40_php8.2.yaml
+ - i_40_php8.2.yaml -e php_vers=7.4
+ - i_40_php8.2.yaml -e php_vers=8.3
+- i_60_postfix.yaml
+- i_80_firewalld.yaml
+- i_81_fail2ban.yaml
+- mysql_create_admin.yaml
- ../vars/pg_vault.yaml
- ../vars/pg.yaml
tasks:
- - name: Create primary groups
+ - name: Create primary roles
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_user:
name: "{{ item }}"
role_attr_flags: NOLOGIN
- name: Create PostgreSQL database
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_db:
name: "{{ item }}"
+ owner: "{{ item }}"
state: present
with_items: "{{ pg_databases }}"
- name: Create POSTGIS extension
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_ext:
name: postgis
db: "{{ item }}"
state: present
with_items: "{{ pg_databases }}"
+ - name: Grant all privileges on the database for the primary group
+ become: true
+ become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
+ community.postgresql.postgresql_privs:
+ db: "{{ item }}"
+ privs: ALL
+ type: database
+ roles: "{{ item }}"
+ state: present
+ with_items: "{{ pg_databases }}"
+
- name: Create users without password
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_user:
name: "{{ item.key }}"
role_attr_flags: LOGIN
password: "{{ my_random_value }}"
state: present
when: item.value == ''
- loop: "{{ pg_users | dict2items }}"
+ with_items: "{{ pg_users | dict2items }}"
- name: Create groups
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_user:
- name: "{{ item.key }}"
+ name: "{{ item.group }}"
role_attr_flags: NOLOGIN
state: present
- loop: "{{ pg_groups | dict2items }}"
+ with_items: "{{ pg_groups }}"
- name: Create primary groups of the dbs
become: true
become_user: postgres
+ vars:
+ ansible_ssh_pipelining: true
community.postgresql.postgresql_user:
name: "{{ item }}"
role_attr_flags: NOLOGIN
state: present
with_items: "{{ pg_databases }}"
- - name: Grant all privileges on the database for the primary group
+ - name: Add users to groups
become: true
become_user: postgres
- community.postgresql.postgresql_privs:
- db: "{{ item }}"
- privs: ALL
- type: database
- roles: "{ item }}"
+ vars:
+ ansible_ssh_pipelining: true
+ community.postgresql.postgresql_membership:
+ db: postgres # or the name of your DB
+ group: "{{ item.group }}"
+ target_roles: "{{ item.members }}"
state: present
- with_items: "{{ pg_databases }}"
+ with_items: "{{ pg_groups }}"
- - name: Add users to groups
+ - name: Grant all privileges to admins group
become: true
become_user: postgres
- community.postgresql.postgresql_membership:
- db: postgres # or the name of your DB
- group: "{{ item.key }}"
- target_roles: "{{ item.value }}"
+ vars:
+ ansible_ssh_pipelining: true
+ community.postgresql.postgresql_privs:
+ db: postgres
+ privs: ALL
+ roles: "{{ pg_admins_group }}"
state: present
- with_dict: "{{ pg_groups }}"
\ No newline at end of file
+ type: database
+ grant_option: true
\ No newline at end of file
--- /dev/null
+---
+- name: Installs important files from /etc
+ hosts: all
+ tasks:
+ - name: Copies the system files
+ ansible.builtin.copy:
+ src: "../templates.local/system.files/{{ item }}"
+ dest: "/etc/{{ item }}"
+ owner: root
+ group: root
+ mode: '0644'
+ backup: yes
+ with_items:
+ - fstab
+ - hosts
+ - exports
+
delegate_to: localhost
- name: create project specific files
ansible.builtin.template:
- src: "../templates.install/{{ item.src }}"
+ src: "{{ item.src }}"
dest: "{{ base_ansible }}/{{ project }}/{{ item.path }}/{{ item.dest }}"
with_items:
- - { src: project_ansible.md, dest: "{{ project }}_ansible", path: docu }
- - { src: project_cron.yaml, dest: "{{ project }}_cron", path: playbooks }
- - { src: t_firewalld_local.yaml, dest: "t_firewalld_local.yaml", path: tasks }
+ - { src: ../docu/de/90_wartung.md, dest: "{{ project }}_ansible.md", path: docu }
+ - { src: ../templates.install/project_cron.yaml, dest: "{{ project }}_cron", path: playbooks }
+ - { src: ../templates.install/t_firewalld_local.yaml, dest: "t_firewalld_local.yaml", path: tasks }
delegate_to: localhost
+++ /dev/null
-# Beschreibung der Ansible-Struktur von {{ project }}
-
-## Wartung
-### Benutzer
-* neuer Benutzer: Änderung in vars/users.yaml
-```
-ansible-playbook playbooks/i_11_user.yaml
-```
-### Webauftritte
-Es wird eine neue Website xxx.example.net benötigt:
-```
-ansible-playbook webapp_create.yaml -e domain=xxx.example.net -e db_name=dbexample -e db_user=dbexample -e db_password=xxx
-```
-### Firewall-Änderung
-Änderung in vars/firewalld.yaml eintragen.
-```
-ansible-playbook playbooks/i_80_firewalld.yaml
-```
-
-### Email-Server-Änderung
-- Alias-Änderung: Änderung in templates.local/postfix/alias.yaml eintragen
-- Postfix-Änderung in main.cf: Änderung in templates.local/postfix/send_only/main.cf eintragen.
-- Postfix-Änderung in master.cf: Änderung in templates.local/postfix/send_only/master.cf eintragen.
-```
-ansible-playbook playbooks/i_60_postfix.yaml
-```
-
-## PHP-Konfiguration-Änderung
-- Änderung in vars/php.yaml eintragen
-```
-for VERS in 7.4 8.2 8.3; do
- ansible-playbook playbooks/i_40_php8.2.yaml -e php_version=$VERS
-done
-```
-
-## Neues Software-Paket
-- Änderung in vars/packages.yaml
-```
-ansible-playbook playbooks/i_15_server_packages.yaml
-```
-
-## Installation
-- Am besten zuerst das Kapitel "Wartung" durchgehen, dort sind die Dateien aufgeführt, in denen konfiguriert wird.
-- Nie in templates.fix konfigurieren:
- - das wird vom Paket ansknife bereitgestellt und das sind nur symbolische Links
- - die Dateien sind schreibgeschützt
-
-### Benutzte Playbooks
-- i_10_basic.yaml
-- i_11_user.yaml
-- i_15_server.yaml
-- i_17_configuration.yaml
-- i_20_configuration.yaml
-- i_30_mariadb.yaml
-- i_40_php8.2.yaml
- - i_40_php8.2.yaml -e php_vers=7.4
- - i_40_php8.2.yaml -e php_vers=8.3
-- i_60_postfix.yaml
-- i_80_firewalld.yaml
-- i_81_fail2ban.yaml
-- mysql_create_admin.yaml
- "postgresql-{{ pg_version }}-ogr-fdw"
- "postgresql-{{ pg_version }}-mysql-fdw"
-pg_databases:
- - pggreenlab
- - pggrlabtest
-
-
# Users with password:
# If password is empty the password is not known
pg_users:
- wk: ''
- reinhard: ''
- roman: ''
+ jonny: ''
+ dba: ''
# Groups are roles without login rights.
# Key: name of the role Value: the list of group members
# Convention: each database has a group with the same name
pg_groups:
- admins: [wk, reinhard]
- pgusers: [wk, reinhard, roman]
- pggreenlab: [pgusers]
- pggrlabtest: [pgusers]
+ - admins: [dba]
+ - pgusers: [jonny]
+ - dbexample: [admins, pgusers]
+
+pg_databases:
+ - dbexample