From: Hamatoma Date: Fri, 16 May 2025 07:12:02 +0000 (+0200) Subject: improvements X-Git-Url: https://gitweb.hamatoma.de/?a=commitdiff_plain;h=ecd8a1a55ac5505709eb3005173a3de434a31f8e;p=ansknife.git improvements --- diff --git a/docu/70_postgresql.md b/docu/70_postgresql.md deleted file mode 100644 index d385320..0000000 --- a/docu/70_postgresql.md +++ /dev/null @@ -1,51 +0,0 @@ -# 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 diff --git a/docu/de/70_postgresql.md b/docu/de/70_postgresql.md new file mode 100644 index 0000000..d385320 --- /dev/null +++ b/docu/de/70_postgresql.md @@ -0,0 +1,51 @@ +# 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 diff --git a/docu/de/90_wartung.md b/docu/de/90_wartung.md new file mode 100644 index 0000000..a527607 --- /dev/null +++ b/docu/de/90_wartung.md @@ -0,0 +1,70 @@ +# 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 diff --git a/playbooks.templates/pg_dbs.yaml b/playbooks.templates/pg_dbs.yaml index 610caa5..7c34d43 100644 --- a/playbooks.templates/pg_dbs.yaml +++ b/playbooks.templates/pg_dbs.yaml @@ -5,9 +5,11 @@ - ../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 @@ -16,15 +18,33 @@ - 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 }}" + diff --git a/playbooks.templates/pg_users.yaml b/playbooks.templates/pg_users.yaml index a1f6515..eb3f6d4 100644 --- a/playbooks.templates/pg_users.yaml +++ b/playbooks.templates/pg_users.yaml @@ -26,49 +26,59 @@ - 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 diff --git a/playbooks.templates/system_files.yaml b/playbooks.templates/system_files.yaml new file mode 100644 index 0000000..c5f9daf --- /dev/null +++ b/playbooks.templates/system_files.yaml @@ -0,0 +1,17 @@ +--- +- 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 + diff --git a/playbooks/create_project.yaml b/playbooks/create_project.yaml index 6195e5c..60e29a7 100644 --- a/playbooks/create_project.yaml +++ b/playbooks/create_project.yaml @@ -134,10 +134,10 @@ 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 diff --git a/templates.install/project_ansible.md b/templates.install/project_ansible.md deleted file mode 100644 index 98218b7..0000000 --- a/templates.install/project_ansible.md +++ /dev/null @@ -1,61 +0,0 @@ -# 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 diff --git a/templates.vars/pg.yaml b/templates.vars/pg.yaml index 8ad54e5..3275e5f 100644 --- a/templates.vars/pg.yaml +++ b/templates.vars/pg.yaml @@ -8,23 +8,19 @@ pg_additional_packages: - "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