--- # tasks file for ensure_sudo - name: Assert Target OS Is Supported when: - ansible_facts["system"] is defined ansible.builtin.assert: fail_msg: "Unsupported OS: {{ ansible_facts['distribution'] | default('unknown') }}" quiet: true that: - ansible_facts["system"] == 'Linux' - >- ansible_facts["distribution"] in ['AlmaLinux', 'CentOS', 'Debian', 'Fedora', 'OracleLinux', 'Rocky', 'Ubuntu'] - name: Include Vendor / Version Specific Variables ansible.builtin.include_vars: file: '{{ lookup("first_found", findme) }}' name: ensure_sudo vars: findme: files: - '{{ ansible_facts["distribution"] }}-{{ ansible_facts["distribution_major_version"] }}-{{ ansible_facts["architecture"] }}.yml' - '{{ ansible_facts["distribution"] }}-{{ ansible_facts["distribution_major_version"] }}-default.yml' - '{{ ansible_facts["distribution"] }}-default.yml' - '{{ ansible_facts["os_family"] }}-{{ ansible_facts["distribution_major_version"] }}-{{ ansible_facts["architecture"] }}.yml' - '{{ ansible_facts["os_family"] }}-{{ ansible_facts["distribution_major_version"] }}-default.yml' - '{{ ansible_facts["os_family"] }}-default.yml' - default.yml paths: [../vars/] errors: ignore - name: Package Discovery when: - ansible_facts["packages"] is not defined ansible.builtin.package_facts: - name: Service Discovery when: - ansible_facts["services"] is not defined ansible.builtin.service_facts: - name: Ensure Packages when: - ensure_sudo is defined - ensure_sudo.package_list is defined - ensure_sudo.package_list is iterable ansible.builtin.package: name: '{{ item.name }}' state: '{{ item.state }}' loop: '{{ ensure_sudo.package_list }}' loop_control: label: '{{ item.name }} will be {{ item.state }}' notify: [Ensure_Sudo.Package_Facts, Ensure_Sudo.Service_Facts] - name: Ensure Configurations when: - ensure_sudo is defined - ensure_sudo.template_list is defined - ensure_sudo.template_list is iterable ansible.builtin.template: backup: 'no' dest: '{{ item.dest }}' group: '{{ item.group | default(omit) }}' mode: '{{ item.mode | default(omit) }}' owner: '{{ item.owner | default(omit) }}' selevel: '{{ item.selevel | default(omit) }}' serole: '{{ item.serole | default(omit) }}' setype: '{{ item.setype | default(omit) }}' seuser: '{{ item.seuser | default(omit) }}' src: '{{ item.src }}' loop: '{{ ensure_sudo.template_list }}' loop_control: label: '{{ item.dest }} will be ensured' notify: - Ensure_Sudo.Package_Facts - Ensure_Sudo.Service_Facts - Ensure_Sudo.Service_Reload - Ensure_Sudo.Service_Restart - name: Ensure Services when: - ensure_sudo is defined - ensure_sudo.service_list is defined - ensure_sudo.service_list is iterable ansible.builtin.service: enabled: '{{ item.enabled }}' name: '{{ item.name }}' state: '{{ item.state }}' loop: '{{ ensure_sudo.service_list }}' loop_control: label: '{{ item.name }} will be {{ item.state }}' notify: [Ensure_Sudo.Package_Facts, Ensure_Sudo.Service_Facts] - name: Find Directories Over Log Retention Window Under /var/log/sudo-io when: - ensure_sudo is defined - sudo_log_retention is defined - sudo_log_retention is regex('^[0-9]*[smhdw]$') ansible.builtin.find: age: '{{ sudo_log_retention }}' file_type: directory follow: 'no' paths: [/var/log/sudo-io/] recurse: 'yes' register: ensure_sudo_results - name: And Drop Them when: - ensure_sudo is defined - sudo_log_retention is defined - sudo_log_retention is regex('^[0-9]*[smhdw]$') - item.path is regex('^/var/log/sudo-io/([0-9]|[A-Z])([0-9]|[A-Z])/([0-9]|[A-Z])([0-9]|[A-Z])/([0-9]|[A-Z])([0-9]|[A-Z])$') ansible.builtin.file: path: '{{ item.path }}' state: absent loop: '{{ ensure_sudo_results.files }}' loop_control: label: '{{ item.path }} to be removed' - name: Flush Handlers ansible.builtin.meta: flush_handlers - name: Assert Sudoers Configuration Syntax ansible.builtin.stat: path: /etc/sudoers register: _sudoers_stat - name: Assert Sudoers File Exists And Has Secure Permissions when: - _sudoers_stat.stat is defined ansible.builtin.assert: fail_msg: "/etc/sudoers does not exist or has invalid mode" quiet: true that: - _sudoers_stat.stat.exists - _sudoers_stat.stat.mode in ['0440', '0400', '0600']