]> git.ekhem.eu.org Git - turnup.git/commitdiff
Split server configuration into separate playbooks.
authorJakub Czajka <jakub@ekhem.eu.org>
Sun, 22 Oct 2023 21:59:55 +0000 (23:59 +0200)
committerJakub Czajka <jczajka@google.com>
Sun, 24 Dec 2023 18:46:45 +0000 (19:46 +0100)
server.yaml
server/dovecot.yaml
server/fail2ban.yaml
server/git.yaml
server/matrix.yaml
server/nginx.yaml
server/opendkim.yaml
server/postfix.yaml
server/postgres.yaml
server/sshd.yaml
server/websites.yaml

index c4e44d8bd1533299d62060cde54867a96e6017a3..511cf0853d386e4b099b2b97095830d3003e1434 100644 (file)
@@ -1,18 +1,32 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- hosts: servers
-  tasks:
-    - name: Install {{ item }}
-      include_tasks: "server/{{ item }}.yaml"
-      with_items:
-        - dovecot
-        - fail2ban
-        - git
-        - opendkim
-        - matrix
-        - nginx
-        - postgres
-        - postfix
-        - websites
-        - sshd
+- name: Install dovecot
+  import_playbook: server/dovecot.yaml
+
+- name: Install fail2ban
+  import_playbook: server/fail2ban.yaml
+
+- name: Install git
+  import_playbook: server/git.yaml
+
+- name: Install opendkim
+  import_playbook: server/opendkim.yaml
+
+- name: Install matrix
+  import_playbook: server/matrix.yaml
+
+- name: Install nginx
+  import_playbook: server/nginx.yaml
+
+- name: Install postgres
+  import_playbook: server/postgres.yaml
+
+- name: Install postfix
+  import_playbook: server/postfix.yaml
+
+- name: Install web server sites
+  import_playbook: server/websites.yaml
+
+- name: Install sshd
+  import_playbook: server/sshd.yaml
index 6423dd04042144a7902228a0720076a87590b17d..ea1f51918754e9b620d59204cfed404a1fd9e009 100644 (file)
@@ -1,87 +1,94 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      dovecot/*
-  become: yes
-- name: Install dovecot
-  package:
-    name:
-      - dovecot-imapd
-      - dovecot-lmtpd
-      - dovecot-pgsql
-    state: latest
-  become: yes
-- name: Ensure dovecot directory structure exists
-  file:
-    path: "/etc/dovecot/conf.d"
-    state: directory
-  become: yes
-- name: Copy to /etc/dovecot
-  copy:
-    src: "/tmp/dovecot/{{ item }}"
-    dest: "/etc/dovecot"
-    remote_src: true
-  become: true
-  with_items:
-    - dovecot-dict-auth.conf.ext
-    - dovecot-dict-sql.conf.ext
-    - dovecot-sql.conf.ext
-    - dovecot.conf
-- name: Copy to /etc/dovecot/conf.d
-  copy:
-    src: "/tmp/dovecot/{{ item }}"
-    dest: "/etc/dovecot/conf.d"
-    remote_src: true
-  become: true
-  with_items:
-    - 10-auth.conf
-    - 10-master.conf
-    - 15-mailboxes.conf
-    - 90-plugin.conf
-    - auth-dict.conf.ext
-    - auth-static.conf.ext
-    - 10-director.conf
-    - 10-ssl.conf
-    - 20-imap.conf
-    - 90-quota.conf
-    - auth-master.conf.ext
-    - auth-system.conf.ext
-    - 10-logging.conf
-    - 10-tcpwrapper.conf
-    - 20-lmtp.conf
-    - auth-checkpassword.conf.ext
-    - auth-passwdfile.conf.ext
-    - 10-mail.conf
-    - 15-lda.conf
-    - 90-acl.conf
-    - auth-deny.conf.ext
-    - auth-sql.conf.ext
-- name: Ensure correct permissions for the virtual mailbox
-  file:
-    path: "/var/vmail"
-    state: directory
-    mode: "0775"
-    owner: vmail
-    group: storage
-    recurse: true
-  become: true
-- name: Ensure configuration of the virtual mailbox user
-  user:
-    name: "vmail"
-    home: "/var/vmail"
-    shell: "/usr/sbin/nologin"
-    password_lock: true
-  become: yes
-- name: Ensure log files exist
-  file:
-    path: "/var/log/{{ item }}"
-    state: touch
-    owner: vmail
-    group: vmail
-  become: yes
-  with_items:
-    - dovecot.log
-    - dovecot-info.log
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force dovecot/*
+      become: yes
+    - name: Install dovecot
+      package:
+        name:
+          - dovecot-imapd
+          - dovecot-lmtpd
+          - dovecot-pgsql
+        state: latest
+      become: yes
+    - name: Ensure dovecot directory structure exists
+      file:
+        path: "/etc/dovecot/conf.d"
+        state: directory
+      become: yes
+    - name: Copy to /etc/dovecot
+      copy:
+        src: "/tmp/dovecot/{{ item }}"
+        dest: "/etc/dovecot"
+        remote_src: true
+      become: true
+      with_items:
+        - dovecot-dict-auth.conf.ext
+        - dovecot-dict-sql.conf.ext
+        - dovecot-sql.conf.ext
+        - dovecot.conf
+    - name: Copy to /etc/dovecot/conf.d
+      copy:
+        src: "/tmp/dovecot/{{ item }}"
+        dest: "/etc/dovecot/conf.d"
+        remote_src: true
+      become: true
+      with_items:
+        - 10-auth.conf
+        - 10-master.conf
+        - 15-mailboxes.conf
+        - 90-plugin.conf
+        - auth-dict.conf.ext
+        - auth-static.conf.ext
+        - 10-director.conf
+        - 10-ssl.conf
+        - 20-imap.conf
+        - 90-quota.conf
+        - auth-master.conf.ext
+        - auth-system.conf.ext
+        - 10-logging.conf
+        - 10-tcpwrapper.conf
+        - 20-lmtp.conf
+        - auth-checkpassword.conf.ext
+        - auth-passwdfile.conf.ext
+        - 10-mail.conf
+        - 15-lda.conf
+        - 90-acl.conf
+        - auth-deny.conf.ext
+        - auth-sql.conf.ext
+    - name: Ensure correct permissions for the virtual mailbox
+      file:
+        path: "/var/vmail"
+        state: directory
+        mode: "0775"
+        owner: vmail
+        group: storage
+        recurse: true
+      become: true
+    - name: Ensure configuration of the virtual mailbox user
+      user:
+        name: "vmail"
+        home: "/var/vmail"
+        shell: "/usr/sbin/nologin"
+        password_lock: true
+      become: yes
+    - name: Ensure log files exist
+      file:
+        path: "/var/log/{{ item }}"
+        state: touch
+        owner: vmail
+        group: vmail
+      become: yes
+      with_items:
+        - dovecot.log
+        - dovecot-info.log
+    - name: Restart dovecot
+      service:
+        name: dovecot
+        state: restarted
+      become: yes
index cf1c84b85a8535853a2dcb934b5693211933f985..391df4e31658467c4f8da221c23fa4fe2bf43bcc 100644 (file)
@@ -1,29 +1,36 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      fail2ban/*
-  become: yes
-- name: Install fail2ban
-  package:
-    name:
-      - fail2ban
-    state: latest
-  become: yes
-- name: Ensure fail2ban directory structure exists
-  file:
-    path: "/etc/fail2ban"
-    state: directory
-  become: yes
-- name: Copy to /etc/fail2ban
-  copy:
-    src: "/tmp/fail2ban/{{ item }}"
-    dest: "/etc/fail2ban"
-    remote_src: true
-  become: true
-  with_items:
-    - fail2ban.local
-    - jail.local
-    - paths-common.conf
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force fail2ban/*
+      become: yes
+    - name: Install fail2ban
+      package:
+        name:
+          - fail2ban
+        state: latest
+      become: yes
+    - name: Ensure fail2ban directory structure exists
+      file:
+        path: "/etc/fail2ban"
+        state: directory
+      become: yes
+    - name: Copy to /etc/fail2ban
+      copy:
+        src: "/tmp/fail2ban/{{ item }}"
+        dest: "/etc/fail2ban"
+        remote_src: true
+      become: true
+      with_items:
+        - fail2ban.local
+        - jail.local
+        - paths-common.conf
+    - name: Restart fail2ban
+      service:
+        name: fail2ban
+        state: restarted
+      become: yes
index de924baf9b72aaaea8412ed72ebbbdcd5cd26757..61fbdf624c2799dc42b716a19e406a41b9449727 100644 (file)
@@ -1,23 +1,36 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      git/*
-  become: yes
-- name: Install gitweb
-  package:
-    name:
-      - fcgiwrap
-      - gitweb
-    state: latest
-  become: yes
-- name: Copy to /etc
-  copy:
-    src: "/tmp/git/{{ item }}"
-    dest: "/etc"
-    remote_src: true
-  become: true
-  with_items:
-    - gitweb.conf
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force git/*
+      become: yes
+    - name: Install gitweb
+      package:
+        name:
+          - fcgiwrap
+          - gitweb
+        state: latest
+      become: yes
+    - name: Ensure git directory structure exists
+      file:
+        path: "/etc/git"
+        state: directory
+      become: yes
+    - name: Copy to /etc
+      copy:
+        src: "/tmp/git/{{ item }}"
+        dest: "/etc/git"
+        remote_src: true
+      become: true
+      with_items:
+        - ekhem.conf
+        - dobity.conf
+    - name: Restart fcgiwrap
+      service:
+        name: fcgiwrap
+        state: restarted
+      become: yes
index e20611c6b32147f3e51219a3a30ca0fe16ad61b0..270c1306c62b17306b0dbc572a6700892c13543b 100644 (file)
@@ -1,37 +1,44 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration files
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      matrix/*
-  become: yes
-- name: Install matrix
-  package:
-    name:
-      - matrix-synapse
-    state: latest
-  become: yes
-- name: Ensure matrix directory structure exists
-  file:
-    path: "/etc/matrix-synapse/conf.d"
-    state: directory
-  become: yes
-- name: Copy to /etc/matrix-synapse
-  copy:
-    src: "/tmp/matrix/{{ item }}"
-    dest: "/etc/matrix-synapse"
-    remote_src: true
-  become: true
-  with_items:
-    - homeserver.yaml
-    - log.yaml
-- name: Copy to /etc/matrix-synapse/conf.d
-  copy:
-    src: "/tmp/matrix/{{ item }}"
-    dest: "/etc/matrix-synapse/conf.d"
-    remote_src: true
-  become: true
-  with_items:
-    - report_stats.yaml
-    - server_name.yaml
+- hosts: servers
+  tasks:
+    - name: Checkout configuration files
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force matrix/*
+      become: yes
+    - name: Install matrix
+      package:
+        name:
+          - matrix-synapse
+        state: latest
+      become: yes
+    - name: Ensure matrix directory structure exists
+      file:
+        path: "/etc/matrix-synapse/conf.d"
+        state: directory
+      become: yes
+    - name: Copy to /etc/matrix-synapse
+      copy:
+        src: "/tmp/matrix/{{ item }}"
+        dest: "/etc/matrix-synapse"
+        remote_src: true
+      become: true
+      with_items:
+        - homeserver.yaml
+        - log.yaml
+    - name: Copy to /etc/matrix-synapse/conf.d
+      copy:
+        src: "/tmp/matrix/{{ item }}"
+        dest: "/etc/matrix-synapse/conf.d"
+        remote_src: true
+      become: true
+      with_items:
+        - report_stats.yaml
+        - server_name.yaml
+    - name: Restart matrix-synapse
+      service:
+        name: matrix-synapse
+        state: restarted
+      become: yes
index 3c87a5a5d8a7af0e0324eb7d59c09f443c28bcec..dd9e28d5a98e900111a4b0c928a35280be6bbf4b 100644 (file)
@@ -1,28 +1,35 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      nginx/*
-  become: yes
-- name: Install nginx
-  package:
-    name:
-      - nginx
-    state: latest
-  become: yes
-- name: Ensure postfix directory structure exists
-  file:
-    path: "/etc/nginx"
-    state: directory
-  become: yes
-- name: Copy to /etc/nginx
-  copy:
-    src: "/tmp/nginx/{{ item }}"
-    dest: "/etc/nginx"
-    remote_src: true
-  become: true
-  with_items:
-    - mime.types
-    - nginx.conf
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force nginx/*
+      become: yes
+    - name: Install nginx
+      package:
+        name:
+          - nginx
+        state: latest
+      become: yes
+    - name: Ensure postfix directory structure exists
+      file:
+        path: "/etc/nginx"
+        state: directory
+      become: yes
+    - name: Copy to /etc/nginx
+      copy:
+        src: "/tmp/nginx/{{ item }}"
+        dest: "/etc/nginx"
+        remote_src: true
+      become: true
+      with_items:
+        - mime.types
+        - nginx.conf
+    - name: Restart nginx
+      service:
+        name: nginx
+        state: restarted
+      become: yes
index 843f534fd573639834a94da95809e07cf87b725d..2410218e5154cff8d9d5b907f2d75f16fd951d7d 100644 (file)
@@ -1,41 +1,48 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      opendkim/*
-  become: yes
-- name: Install opendkim
-  package:
-    name:
-      - opendkim
-      - libopendbx1-pgsql
-    state: latest
-  become: yes
-- name: Copy to /etc
-  copy:
-    src: "/tmp/opendkim/opendkim.conf"
-    dest: "/etc"
-    remote_src: true
-  become: true
-- name: Copy to /etc/default
-  copy:
-    src: "/tmp/opendkim/opendkim"
-    dest: "/etc/default"
-    remote_src: true
-  become: true
-- name: Ensure correct permissions for opendkim files
-  file:
-    path: "/etc/opendkim/keys/{{ item.domain }}/{{ item.name }}"
-    mode: "0500"
-  become: true
-  with_items:
-    - domain: "dobity.eu.org"
-      name: "dobity.private"
-    - domain: "dobity.eu.org"
-      name: "dobity.txt"
-    - domain: "ekhem.eu.org"
-      name: "ekhem.txt"
-    - domain: "ekhem.eu.org"
-      name: "ekhem.txt"
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force opendkim/*
+      become: yes
+    - name: Install opendkim
+      package:
+        name:
+          - opendkim
+          - libopendbx1-pgsql
+        state: latest
+      become: yes
+    - name: Copy to /etc
+      copy:
+        src: "/tmp/opendkim/opendkim.conf"
+        dest: "/etc"
+        remote_src: true
+      become: true
+    - name: Copy to /etc/default
+      copy:
+        src: "/tmp/opendkim/opendkim"
+        dest: "/etc/default"
+        remote_src: true
+      become: true
+    - name: Ensure correct permissions for opendkim files
+      file:
+        path: "/etc/opendkim/keys/{{ item.domain }}/{{ item.name }}"
+        mode: "0500"
+      become: true
+      with_items:
+        - domain: "dobity.eu.org"
+          name: "dobity.private"
+        - domain: "dobity.eu.org"
+          name: "dobity.txt"
+        - domain: "ekhem.eu.org"
+          name: "ekhem.txt"
+        - domain: "ekhem.eu.org"
+          name: "ekhem.txt"
+    - name: Restart opendkim
+      service:
+        name: opendkim
+        state: restarted
+      become: yes
index 1af4bf3d824b14c5ccc988554b08e93e5054a967..f7fd8cfb9d342bff44964c14cabe0e230635de0f 100644 (file)
@@ -1,31 +1,38 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      postfix/*
-  become: yes
-- name: Install postfix
-  package:
-    name:
-      - postfix
-      - postfix-pgsql
-    state: latest
-  become: yes
-- name: Ensure postfix directory structure exists
-  file:
-    path: "/etc/postfix"
-    state: directory
-  become: yes
-- name: Copy to /etc/postfix
-  copy:
-    src: "/tmp/postfix/{{ item }}"
-    dest: "/etc/postfix"
-    remote_src: true
-  become: true
-  with_items:
-    - address_book.cf
-    - domains.cf
-    - main.cf
-    - master.cf
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force postfix/*
+      become: yes
+    - name: Install postfix
+      package:
+        name:
+          - postfix
+          - postfix-pgsql
+        state: latest
+      become: yes
+    - name: Ensure postfix directory structure exists
+      file:
+        path: "/etc/postfix"
+        state: directory
+      become: yes
+    - name: Copy to /etc/postfix
+      copy:
+        src: "/tmp/postfix/{{ item }}"
+        dest: "/etc/postfix"
+        remote_src: true
+      become: true
+      with_items:
+        - address_book.cf
+        - domains.cf
+        - main.cf
+        - master.cf
+    - name: Restart postfix
+      service:
+        name: postfix
+        state: restarted
+      become: yes
index aab0fe3f1b1cc58682b69708d80f502562b9cb1b..50555d48c45f231d59dcb4359567b2a6f0fa7be2 100644 (file)
@@ -1,48 +1,55 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      postgres/*
-  become: yes
-- name: Install postgres
-  package:
-    name:
-      - postgresql
-    state: latest
-  become: yes
-- name: Ensure postgres directory structure exists
-  file:
-    path: "/etc/postgresql/15/main/"
-    state: directory
-  become: yes
-- name: Copy to /etc/postgresq/15/main
-  copy:
-    src: "/tmp/postgres/{{ item }}"
-    dest: "/etc/postgresql/15/main"
-    remote_src: true
-  become: true
-  with_items:
-    - pg_hba.conf
-    - postgresql.conf
-- name: Ensure a directory for private files exists
-  file:
-    path: "/etc/postgresql/15/main/private"
-    state: directory
-    mode: "0700"
-    owner: postgres
-    group: postgres
-  become: true
-- name: Copy certificates
-  copy:
-    src: "/etc/letsencrypt/live/postgres/{{ item }}"
-    dest: "/etc/postgresql/15/main/private"
-    mode: "0600"
-    owner: postgres
-    group: postgres
-    remote_src: true
-  become: true
-  with_items:
-    - fullchain.pem
-    - privkey.pem
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force postgres/*
+      become: yes
+    - name: Install postgres
+      package:
+        name:
+          - postgresql
+        state: latest
+      become: yes
+    - name: Ensure postgres directory structure exists
+      file:
+        path: "/etc/postgresql/15/main/"
+        state: directory
+      become: yes
+    - name: Copy to /etc/postgresq/15/main
+      copy:
+        src: "/tmp/postgres/{{ item }}"
+        dest: "/etc/postgresql/15/main"
+        remote_src: true
+      become: true
+      with_items:
+        - pg_hba.conf
+        - postgresql.conf
+    - name: Ensure a directory for private files exists
+      file:
+        path: "/etc/postgresql/15/main/private"
+        state: directory
+        mode: "0700"
+        owner: postgres
+        group: postgres
+      become: true
+    - name: Copy certificates
+      copy:
+        src: "/etc/letsencrypt/live/postgres/{{ item }}"
+        dest: "/etc/postgresql/15/main/private"
+        mode: "0600"
+        owner: postgres
+        group: postgres
+        remote_src: true
+      become: true
+      with_items:
+        - fullchain.pem
+        - privkey.pem
+    - name: Restart postgres
+      service:
+        name: postgresql
+        state: restarted
+      become: yes
index 140eb5369c759ab39520834255064bd50204a337..c263f223718c0ba933fe14697ea80a8652f7605d 100644 (file)
@@ -1,14 +1,21 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main --force \
-      sshd/*
-  become: yes
-- name: Copy to /etc/ssh
-  copy:
-    src: "/tmp/sshd/sshd_config"
-    dest: "/etc/ssh"
-    remote_src: true
-  become: true
+- hosts: servers
+  tasks:
+    - name: Checkout configuration
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server.git checkout main \
+          --force sshd/*
+      become: yes
+    - name: Copy to /etc/ssh
+      copy:
+        src: "/tmp/sshd/sshd_config"
+        dest: "/etc/ssh"
+        remote_src: true
+      become: true
+    - name: Restart sshd
+      service:
+        name: ssh
+        state: restarted
+      become: yes
index 5cdec9cef1f125dd6eeb6562dddfb40df157dcd5..35f293f37264748481d6fa548d616c2cc7d628ef 100644 (file)
@@ -1,50 +1,57 @@
 # Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
 # License: GPL-3.0 or later.
 
-- name: Checkout configuration files
-  command: |
-    git --work-tree=/tmp --git-dir=/srv/git/server_prod.git checkout main \
-      --force
-  become: yes
-- name: Ensure sites-available directory exists
-  file:
-    path: "/etc/nginx/sites-available"
-    state: directory
-  become: yes
-- name: Ensure sites-enabled directory exists
-  file:
-    path: "/etc/nginx/sites-enabled"
-    state: directory
-  become: yes
-- name: Copy to /etc/nginx/sites-available
-  copy:
-    src: "/tmp/nginx/{{ item }}"
-    dest: "/etc/nginx/sites-available"
-    remote_src: true
-  become: true
-  with_items:
-    - cv.ekhem.eu.org
-    - dobity.eu.org
-    - drive.dobity.eu.org
-    - ekhem.eu.org
-    - git.dobity.eu.org
-    - git.ekhem.eu.org
-    - matrix.dobity.eu.org
-    - pass.dobity.eu.org
-    - yt.dobity.eu.org
-- name: Symlink to /etc/nginx/sites-enabled
-  file:
-    src: "/etc/nginx/sites-available/{{ item }}"
-    dest: "/etc/nginx/sites-enabled/{{ item }}"
-    state: link
-  become: true
-  with_items:
-    - cv.ekhem.eu.org
-    - dobity.eu.org
-    - drive.dobity.eu.org
-    - ekhem.eu.org
-    - git.dobity.eu.org
-    - git.ekhem.eu.org
-    - matrix.dobity.eu.org
-    - pass.dobity.eu.org
-    - yt.dobity.eu.org
+- hosts: servers
+  tasks:
+    - name: Checkout configuration files
+      command: |
+        git --work-tree=/tmp --git-dir=/srv/git/server_prod.git checkout main \
+          --force
+      become: yes
+    - name: Ensure sites-available directory exists
+      file:
+        path: "/etc/nginx/sites-available"
+        state: directory
+      become: yes
+    - name: Ensure sites-enabled directory exists
+      file:
+        path: "/etc/nginx/sites-enabled"
+        state: directory
+      become: yes
+    - name: Copy to /etc/nginx/sites-available
+      copy:
+        src: "/tmp/nginx/{{ item }}"
+        dest: "/etc/nginx/sites-available"
+        remote_src: true
+      become: true
+      with_items:
+        - cv.ekhem.eu.org
+        - dobity.eu.org
+        - drive.dobity.eu.org
+        - ekhem.eu.org
+        - git.dobity.eu.org
+        - git.ekhem.eu.org
+        - matrix.dobity.eu.org
+        - pass.dobity.eu.org
+        - yt.dobity.eu.org
+    - name: Symlink to /etc/nginx/sites-enabled
+      file:
+        src: "/etc/nginx/sites-available/{{ item }}"
+        dest: "/etc/nginx/sites-enabled/{{ item }}"
+        state: link
+      become: true
+      with_items:
+        - cv.ekhem.eu.org
+        - dobity.eu.org
+        - drive.dobity.eu.org
+        - ekhem.eu.org
+        - git.dobity.eu.org
+        - git.ekhem.eu.org
+        - matrix.dobity.eu.org
+        - pass.dobity.eu.org
+        - yt.dobity.eu.org
+    - name: Restart nginx
+      service:
+        name: nginx
+        state: restarted
+      become: yes