ansible-taler-exchange

Ansible playbook to deploy a production Taler Exchange
Log | Files | Refs | Submodules | README | LICENSE

commit 0963335a015e28c32783d7e6f7d16a772a711858
parent cc2efa7f162215d0ca26de42185787b4eda2a5aa
Author: Florian Dold <florian@dold.me>
Date:   Thu, 27 Feb 2025 16:09:14 +0100

address some linter warnings

Diffstat:
M.gitignore | 5++++-
Mplaybooks/pixel-borg.yml | 2+-
Mroles/common_packages/tasks/main.yml | 14+++++++-------
Mroles/exchange-sanctionlist-import/tasks/main.yml | 18+++++++++---------
Mroles/exchange/handlers/main.yml | 2+-
Mroles/exchange/tasks/main.yml | 32++++++++++++++++----------------
Mroles/libeufin-nexus/tasks/main.yml | 12++++++------
Mroles/monitoring/files/etc/prometheus/prometheus.yml | 4++--
Mroles/monitoring/handlers/main.yml | 8++++----
Mroles/monitoring/tasks/main.yml | 32++++++++++++++++----------------
Droles/pixel-borg/tasks/main.yml | 62--------------------------------------------------------------
Rroles/pixel-borg/files/home/borg/.ssh/authorized_keys -> roles/pixel_borg/files/home/borg/.ssh/authorized_keys | 0
Aroles/pixel_borg/tasks/main.yml | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mroles/webserver/handlers/main.yml | 2+-
Mroles/webserver/tasks/main.yml | 24++++++++++++------------
Msetup-pixel-borg.sh | 2+-
16 files changed, 142 insertions(+), 139 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,6 +1,5 @@ ./inventories/production/hosts ./inventories/staging/hosts -*~ exports # Preferred name for secrets in inventories/host_vars/$HOST/ @@ -9,3 +8,7 @@ prod-secrets.yml # This used to be the name of the secrets file, # keep ignoring it to prevent accidental commits of it. tops-secrets.yml + +# Text editor files +*~ +.vscode diff --git a/playbooks/pixel-borg.yml b/playbooks/pixel-borg.yml @@ -2,4 +2,4 @@ - name: Setup Borg repository on spec to receive backups from pixel hosts: all roles: - - pixel-borg + - pixel_borg diff --git a/roles/common_packages/tasks/main.yml b/roles/common_packages/tasks/main.yml @@ -7,7 +7,7 @@ dest: /etc/apt/keyrings/taler-systems.gpg owner: root group: root - mode: 0644 + mode: "0644" - name: Deploy TSYS nightly signing key copy: @@ -15,7 +15,7 @@ dest: /etc/apt/keyrings/taler-systems-nightly.gpg owner: root group: root - mode: 0644 + mode: "0644" - name: Add GNU Taler repo deb822_repository: @@ -46,7 +46,7 @@ dest: /etc/apt/preferences.d/limit-taler-repo owner: root group: root - mode: 0644 + mode: "0644" - name: Deploy current base distro apt: @@ -81,8 +81,8 @@ - name: Generate dhparam.pem command: openssl dhparam -out dhparam.pem 4096 args: - chdir: /etc/ssl/private/ - creates: /etc/ssl/private/dhparam.pem + chdir: /etc/ssl/private/ + creates: /etc/ssl/private/dhparam.pem when: (USE_PREGENERATED_DHPARAM | default(False)) == False - name: Deploy pregenerated dhparam.pem @@ -91,5 +91,5 @@ dest: /etc/ssl/private/dhparam.pem owner: root group: root - mode: 0644 - when: (USE_PREGENERATED_DHPARAM | default(False)) == True + mode: "0644" + when: (USE_PREGENERATED_DHPARAM | default(False)) diff --git a/roles/exchange-sanctionlist-import/tasks/main.yml b/roles/exchange-sanctionlist-import/tasks/main.yml @@ -1,6 +1,6 @@ --- - name: Get current date - ansible.builtin.shell: + ansible.builtin.command: cmd: "date +%F" register: today @@ -16,16 +16,16 @@ src: "{{ SANCTION_LIST }}" dest: "{{ importfile.path }}" owner: taler-exchange-httpd - mode: 400 + mode: "400" - name: Check sanction list - ansible.builtin.shell: + ansible.builtin.command: cmd: "taler-exchange-sanctionscheck -- {{ EXCHANGE_SANCTION_HELPER }} {{ importfile.path }}" - become: yes + become: true become_user: taler-exchange-httpd -#- name: Remove the temporary file on the server -# ansible.builtin.file: -# path: "{{ importfile.path }}" -# state: absent -# when: importfile.path is defined +# - name: Remove the temporary file on the server +# ansible.builtin.file: +# path: "{{ importfile.path }}" +# state: absent +# when: importfile.path is defined diff --git a/roles/exchange/handlers/main.yml b/roles/exchange/handlers/main.yml @@ -1,4 +1,4 @@ -- name: restart nginx +- name: Restart nginx service: name: nginx state: restarted diff --git a/roles/exchange/tasks/main.yml b/roles/exchange/tasks/main.yml @@ -23,7 +23,7 @@ dest: /etc/nginx/sites-available/exchange-nginx.conf owner: root group: root - mode: 0644 + mode: "0644" - name: Ensure Taler exchange HTTP virtualhost configuration file exists template: @@ -31,7 +31,7 @@ dest: /etc/nginx/sites-available/exchange-http.conf owner: root group: root - mode: 0644 + mode: "0644" - name: Enable Taler exchange HTTP reverse proxy configuration file: @@ -85,7 +85,7 @@ dest: /etc/taler-exchange/conf.d/exchange-business.conf owner: root group: root - mode: 0644 + mode: "0644" - name: Place taler-exchange denominations config ansible.builtin.template: @@ -93,7 +93,7 @@ dest: /etc/taler-exchange/conf.d/denominations.conf owner: root group: root - mode: 0644 + mode: "0644" - name: Ensure /etc/taler-exchange/secrets/ directory exists file: @@ -106,7 +106,7 @@ dest: /etc/taler-exchange/secrets/exchange-accountcredentials-primary.secret.conf owner: taler-exchange-wire group: root - mode: 0400 + mode: "0400" - name: Place taler-exchange external individual KYC provider configuration ansible.builtin.template: @@ -114,7 +114,7 @@ dest: /etc/taler-exchange/secrets/exchange-kyc-provider-individual.secret.conf owner: taler-exchange-httpd group: taler-exchange-kyc - mode: 0440 + mode: "0440" - name: Place taler-exchange external KYC provider configuration ansible.builtin.template: @@ -122,7 +122,7 @@ dest: /etc/taler-exchange/secrets/exchange-kyc-provider-business.secret.conf owner: taler-exchange-httpd group: taler-exchange-kyc - mode: 0440 + mode: "0440" - name: Place taler-exchange AML program environment ansible.builtin.template: @@ -130,7 +130,7 @@ dest: /etc/taler-exchange/taler-exchange.env owner: taler-exchange-httpd group: root - mode: 0400 + mode: "0400" - name: Check if we have kyc-rules (depends on branch) delegate_to: localhost @@ -145,7 +145,7 @@ when: have_kycrules.stat.exists - name: Setup Taler Exchange database - shell: + ansible.builtin.command: cmd: taler-exchange-dbconfig -c /etc/taler-exchange/taler-exchange.conf chdir: /tmp @@ -155,7 +155,7 @@ state: directory owner: taler-exchange-httpd group: root - mode: 0755 + mode: "0755" - name: Check if we have terms of service in English stat: @@ -163,7 +163,7 @@ register: have_terms_en - name: Build terms of service (EN) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_TERMS_ETAG }} -l en when: have_terms_en.stat.exists @@ -173,7 +173,7 @@ register: have_pp_en - name: Build privacy policy (EN) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_PP_ETAG }} -l en when: have_pp_en.stat.exists @@ -183,7 +183,7 @@ register: have_terms_fr - name: Build terms of service (FR) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_TERMS_ETAG }} -l fr when: have_terms_fr.stat.exists @@ -193,7 +193,7 @@ register: have_pp_fr - name: Build privacy policy (FR) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_PP_ETAG }} -l fr when: have_pp_fr.stat.exists @@ -203,7 +203,7 @@ register: have_terms_de - name: Build terms of service (DE) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_TERMS_ETAG }} -l de when: have_terms_de.stat.exists @@ -213,7 +213,7 @@ register: have_pp_de - name: Build privacy policy (DE) - ansible.builtin.shell: + ansible.builtin.command: cmd: taler-terms-generator -i {{ EXCHANGE_PP_ETAG }} -l de when: have_pp_de.stat.exists diff --git a/roles/libeufin-nexus/tasks/main.yml b/roles/libeufin-nexus/tasks/main.yml @@ -34,12 +34,12 @@ path: "/etc/ansible/facts.d/" state: directory -- name: libeufin-nexus access secret setup +- name: Libeufin-nexus access secret setup ansible.builtin.shell: cmd: echo "[libeufin-nexus]\nAUTH_BEARER_TOKEN=secret-token:$(dd if=/dev/random count=1 bs=32 status=none | gnunet-base32)" > /etc/ansible/facts.d/libeufin-nexus-access-token.fact creates: /etc/ansible/facts.d/libeufin-nexus-access-token.fact -- name: libeufin-nexus force ansible to regather just created fact(s) +- name: Libeufin-nexus force ansible to regather just created fact(s) ansible.builtin.setup: - name: Place libeufin-nexus config @@ -60,20 +60,20 @@ when: use_ebics - name: Setup libeufin database - shell: + ansible.builtin.command: cmd: libeufin-dbconfig --only-nexus # FIXME: pass "--bank-config=/etc/libeufin/libeufin-nexus.conf" once libeufin 0.14.x is out! chdir: /tmp -- name: show vars +- name: Show vars ansible.builtin.setup: # FIXME: this step currently fails with pofi, seems command wants # extra arguments to do PDF letter generation? - name: EBICS setup - become: yes + become: true become_user: libeufin-nexus - shell: + ansible.builtin.command: cmd: libeufin-nexus ebics-setup when: use_ebics diff --git a/roles/monitoring/files/etc/prometheus/prometheus.yml b/roles/monitoring/files/etc/prometheus/prometheus.yml @@ -13,7 +13,7 @@ alerting: # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - - "alert_rules.yml" + - "alert_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: @@ -43,7 +43,7 @@ scrape_configs: # Job, for local postgres_exporter - job_name: 'postgres_exporter' static_configs: - - targets: ['localhost:9187'] + - targets: ['localhost:9187'] # Job, for prometheus_process_exporter - job_name: 'process_exporter' diff --git a/roles/monitoring/handlers/main.yml b/roles/monitoring/handlers/main.yml @@ -1,20 +1,20 @@ --- -- name: restart nginx +- name: Restart nginx service: name: nginx state: restarted -- name: restart postgres-exporter +- name: Restart postgres-exporter service: name: prometheus-postgres-exporter state: restarted -- name: restart node-exporter +- name: Restart node-exporter service: name: prometheus-node-exporter state: restarted -- name: restart nginx-exporter +- name: Restart nginx-exporter service: name: prometheus-nginx-exporter state: restarted diff --git a/roles/monitoring/tasks/main.yml b/roles/monitoring/tasks/main.yml @@ -8,7 +8,7 @@ dest: /etc/apt/keyrings/grafana.gpg owner: root group: root - mode: 0644 + mode: "0644" - name: Add grafana repo deb822_repository: @@ -39,7 +39,7 @@ - name: Stop monitoring services before update or reconfiguration service: - name: "{{item}}" + name: "{{ item }}" state: stopped enabled: false with_items: @@ -57,7 +57,7 @@ - prometheus-postgres-exporter - prometheus - alloy - install_recommends: no + install_recommends: false - name: Ensure Taler monitoring virtualhost configuration file exists template: @@ -65,7 +65,7 @@ dest: /etc/nginx/sites-available/monitoring-nginx.conf owner: root group: root - mode: 0644 + mode: "0644" notify: restart nginx - name: Ensure Taler monitoring HTTP virtualhost configuration file exists @@ -74,7 +74,7 @@ dest: /etc/nginx/sites-available/monitoring-http.conf owner: root group: root - mode: 0644 + mode: "0644" notify: restart nginx - name: Enable Taler monitoring HTTP reverse proxy configuration @@ -121,11 +121,11 @@ - name: Create prometheus database user community.postgresql.postgresql_user: name: prometheus - become: yes + become: true become_user: postgres - name: Grant access to canonical postgres databases to the postgres-exporter - become: yes + become: true become_user: postgres community.postgresql.postgresql_query: login_user: postgres @@ -139,7 +139,7 @@ GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO prometheus; - name: Grant access to challengers databases to the postgres-exporter - become: yes + become: true become_user: postgres community.postgresql.postgresql_query: login_user: postgres @@ -156,7 +156,7 @@ dest: /etc/default/prometheus-node-exporter owner: root group: root - mode: 0644 + mode: "0644" notify: restart node-exporter - name: Configure postgres-exporter @@ -165,7 +165,7 @@ dest: /etc/default/prometheus-postgres-exporter owner: root group: root - mode: 0644 + mode: "0644" notify: restart postgres-exporter - name: Configure nginx-exporter @@ -174,7 +174,7 @@ dest: /etc/default/prometheus-nginx-exporter owner: root group: root - mode: 0644 + mode: "0644" notify: restart nginx-exporter - name: Configure prometheus master @@ -183,7 +183,7 @@ dest: /etc/default/prometheus owner: root group: root - mode: 0644 + mode: "0644" - name: Configure prometheus copy: @@ -191,7 +191,7 @@ dest: /etc/prometheus/prometheus.yml owner: root group: root - mode: 0644 + mode: "0644" - name: Configure alloy service copy: @@ -199,7 +199,7 @@ dest: /etc/default/alloy owner: root group: root - mode: 0644 + mode: "0644" - name: Configure alloy log export template: @@ -207,11 +207,11 @@ dest: /etc/alloy/config.alloy owner: root group: root - mode: 0644 + mode: "0644" - name: Ensure exporter services are enabled and started service: - name: "{{item}}" + name: "{{ item }}" state: started enabled: true with_items: diff --git a/roles/pixel-borg/tasks/main.yml b/roles/pixel-borg/tasks/main.yml @@ -1,62 +0,0 @@ ---- -- name: Install Borg package - apt: - name: - - borgbackup - state: latest - when: ansible_os_family == 'Debian' - -- name: Setup group for borg backups from spec - ansible.builtin.group: - name: borg - state: present - system: false - -- name: Setup user for borg backups from spec - ansible.builtin.user: - name: borg - group: borg - password: ! - system: false - create_home: true - state: present - -- name: Ensure /home/borg/.ssh/ directory exists - file: - path: "/home/borg/.ssh/" - state: directory - owner: borg - group: borg - mode: 0755 - -- name: Place SSH public key for access by pixel - ansible.builtin.template: - src: files/home/borg/.ssh/authorized_keys - dest: /home/borg/.ssh/authorized_keys - owner: borg - group: borg - mode: 0644 - -- name: Initialize borg repository - ansible.builtin.shell: - cmd: borg init --encryption=repokey pixel-backup - chdir: /home/borg - environment: - BORG_PASSPHRASE: "{{ PIXEL_BORG_KEY }}" - become: yes - become_user: borg - -- name: Export borg repository key - ansible.builtin.shell: - cmd: borg key export pixel-backup/ > borg-repo.key - chdir: /home/borg - creates: /home/borg/borg-repo.key - environment: - BORG_PASSPHRASE: "{{ PIXEL_BORG_KEY }}" - become: yes - become_user: borg - -- name: Export borg-repo.key to caller - fetch: - src: /home/borg/borg-repo.key - dest: ../borg-repokey diff --git a/roles/pixel-borg/files/home/borg/.ssh/authorized_keys b/roles/pixel_borg/files/home/borg/.ssh/authorized_keys diff --git a/roles/pixel_borg/tasks/main.yml b/roles/pixel_borg/tasks/main.yml @@ -0,0 +1,62 @@ +--- +- name: Install Borg package + apt: + name: + - borgbackup + state: latest + when: ansible_os_family == 'Debian' + +- name: Setup group for borg backups from spec + ansible.builtin.group: + name: borg + state: present + system: false + +- name: Setup user for borg backups from spec + ansible.builtin.user: + name: borg + group: borg + password: ! + system: false + create_home: true + state: present + +- name: Ensure /home/borg/.ssh/ directory exists + file: + path: "/home/borg/.ssh/" + state: directory + owner: borg + group: borg + mode: "0755" + +- name: Place SSH public key for access by pixel + ansible.builtin.template: + src: files/home/borg/.ssh/authorized_keys + dest: /home/borg/.ssh/authorized_keys + owner: borg + group: borg + mode: "0644" + +- name: Initialize borg repository + ansible.builtin.command: + cmd: borg init --encryption=repokey pixel-backup + chdir: /home/borg + environment: + BORG_PASSPHRASE: "{{ PIXEL_BORG_KEY }}" + become: true + become_user: borg + +- name: Export borg repository key + ansible.builtin.shell: + cmd: borg key export pixel-backup/ > borg-repo.key + chdir: /home/borg + creates: /home/borg/borg-repo.key + environment: + BORG_PASSPHRASE: "{{ PIXEL_BORG_KEY }}" + become: true + become_user: borg + +- name: Export borg-repo.key to caller + fetch: + src: /home/borg/borg-repo.key + dest: ../borg-repokey diff --git a/roles/webserver/handlers/main.yml b/roles/webserver/handlers/main.yml @@ -1,5 +1,5 @@ --- -- name: restart nginx +- name: Restart nginx service: name: nginx state: restarted diff --git a/roles/webserver/tasks/main.yml b/roles/webserver/tasks/main.yml @@ -5,19 +5,19 @@ apt: name: nginx state: present - update_cache: yes + update_cache: true when: ansible_os_family == 'Debian' -#- name: Obtain or renew SSL certificate using Certbot with Nginx -# command: certbot --nginx --domain "{{ SUBDOMAIN }}.{{ DOMAIN_NAME }}" --redirect --non-interactive --agree-tos --email "{{ ACME_EMAIL }}" -# register: certbot_result -# changed_when: "'Certificate not yet due for renewal' not in certbot_result.stdout" +# - name: Obtain or renew SSL certificate using Certbot with Nginx +# command: certbot --nginx --domain "{{ SUBDOMAIN }}.{{ DOMAIN_NAME }}" --redirect --non-interactive --agree-tos --email "{{ ACME_EMAIL }}" +# register: certbot_result +# changed_when: "'Certificate not yet due for renewal' not in certbot_result.stdout" # -#- name: Reload Nginx configuration if certificates were obtained or renewed -# service: -# name: nginx -# state: restarted -# when: certbot_result.changed +# - name: Reload Nginx configuration if certificates were obtained or renewed +# service: +# name: nginx +# state: restarted +# when: certbot_result.changed - name: Remove default nginx configuration file: @@ -30,10 +30,10 @@ dest: /etc/nginx/conf.d/log-format-apm.conf owner: root group: root - mode: 0644 + mode: "0644" - name: Ensure Nginx service is enabled and started service: name: nginx state: started - enabled: yes + enabled: true diff --git a/setup-pixel-borg.sh b/setup-pixel-borg.sh @@ -12,7 +12,7 @@ ansible-playbook \ --inventory inventories/default \ --limit "${1:-spec}" \ --user root \ - playbooks/pixel-borg.yml + playbooks/pixel_borg.yml mv borg-repokey/*/home/borg/borg-repo.key . rm -rf borg-repokey/ echo "Make sure to back up the borg-repo.key to admin-log/pixel/borg-repo.key"