--- - name: Require supported server firewall backend tags: [services, packages] ansible.builtin.assert: that: - server_firewall_backend == 'firewalld' fail_msg: >- server_firewall_backend must be firewalld for the Rocky server profile. - name: Require server container secret variables tags: [dotfiles, dotfiles:server, services] ansible.builtin.assert: that: - (vault_navidrome_db_password | default('')) | length > 0 - (vault_postgres_root_password | default('')) | length > 0 fail_msg: >- Server container secrets are missing. Define vault_navidrome_db_password and vault_postgres_root_password in secrets/vault.yml or another vars source. - name: Configure DuckDNS updater tags: [dotfiles, dotfiles:server, duckdns] ansible.builtin.import_tasks: duckdns.yml - name: Ensure server directories exist tags: [dotfiles, services] ansible.builtin.file: path: "{{ item.path }}" state: directory owner: "{{ item.owner }}" group: "{{ item.group }}" mode: "{{ item.mode }}" loop: >- {{ (server_directories | default([])) + ( server_syncthing_directories | default([]) if server_syncthing_enabled | default(true) | bool else [] ) }} loop_control: label: "{{ item.path }}" - name: Copy server dotfiles tags: [dotfiles, dotfiles:server] ansible.builtin.copy: src: "{{ playbook_dir }}/../dotfiles/server/{{ item.src }}" dest: "{{ server_user_home }}/{{ item.dest }}" owner: "{{ server_username }}" group: "{{ server_user_group }}" mode: "{{ item.mode }}" loop: "{{ server_dotfiles | default([]) }}" loop_control: label: "{{ item.dest }}" - name: Render server templates tags: [dotfiles, dotfiles:server] ansible.builtin.template: src: "{{ item.src }}" dest: "{{ item.dest if item.dest.startswith('/') else server_user_home ~ '/' ~ item.dest }}" owner: "{{ item.owner | default(server_username) }}" group: "{{ item.group | default(server_user_group) }}" mode: "{{ item.mode }}" loop: "{{ server_templates | default([]) }}" loop_control: label: "{{ item.dest }}" no_log: "{{ item.no_log | default(false) }}" - name: Disable SSH root login on server tags: [services] ansible.builtin.lineinfile: path: /etc/ssh/sshd_config regexp: '^\s*PermitRootLogin\s+' line: "PermitRootLogin {{ server_sshd_settings.PermitRootLogin }}" state: present validate: "sshd -t -f %s" notify: Reload SSH service - name: Restrict SSH login to allowed users on server tags: [services] ansible.builtin.lineinfile: path: /etc/ssh/sshd_config regexp: '^\s*AllowUsers\s+' line: "AllowUsers {{ server_sshd_allow_users | join(' ') }}" state: present validate: "sshd -t -f %s" notify: Reload SSH service when: (server_sshd_allow_users | default([])) | length > 0 - name: Allow server services through firewalld tags: [services, packages] ansible.posix.firewalld: service: "{{ item }}" zone: "{{ server_firewalld_zone }}" state: enabled permanent: true immediate: true loop: "{{ server_firewalld_services | default([]) }}" loop_control: label: "{{ item }}" when: server_firewall_backend == 'firewalld' - name: Allow server ports through firewalld tags: [services, packages] ansible.posix.firewalld: port: "{{ item }}" zone: "{{ server_firewalld_zone }}" state: enabled permanent: true immediate: true loop: "{{ server_firewalld_ports | default([]) }}" loop_control: label: "{{ item }}" when: server_firewall_backend == 'firewalld' - name: Remove disabled server ports from firewalld tags: [services, packages] ansible.posix.firewalld: port: "{{ item }}" zone: "{{ server_firewalld_zone }}" state: disabled permanent: true immediate: true loop: "{{ server_firewalld_absent_ports | default([]) }}" loop_control: label: "{{ item }}" when: server_firewall_backend == 'firewalld'