--- - hosts: all vars: __sshd_test_backup_files: - /etc/ssh/sshd_config - /etc/ssh/sshd_config.d/00-ansible_system_role.conf - /etc/ssh/sshd_config_custom - /etc/ssh/sshd_config_custom_second - /tmp/ssh_host_ecdsa_key tasks: - name: "Backup configuration files" include_tasks: tasks/backup.yml - name: Ensure group 'nobody' exists group: name: nobody - name: Ensure the user 'nobody' exists user: name: nobody group: nobody comment: nobody create_home: no shell: /sbin/nologin - name: Configure alternative sshd_config file include_role: name: ansible-sshd vars: # just anything -- will not get processed by sshd sshd_config_file: /etc/ssh/sshd_config_custom sshd_config_owner: "nobody" sshd_config_group: "nobody" sshd_config_mode: "660" sshd_skip_defaults: true sshd: AcceptEnv: LANG Banner: /etc/issue Ciphers: aes256-ctr sshd_Compression: no - name: Configure second alternative sshd_config file include_role: name: ansible-sshd vars: # just anything -- will not get processed by sshd sshd_config_file: /etc/ssh/sshd_config_custom_second sshd_skip_defaults: true sshd: Banner: /etc/issue2 Ciphers: aes128-ctr sshd_MaxStartups: 100 - name: Now configure the main sshd_config file include_role: name: ansible-sshd vars: sshd_config_file: /etc/ssh/sshd_config sshd: Banner: /etc/issue Ciphers: aes192-ctr HostKey: - /tmp/ssh_host_ecdsa_key sshd_PasswordAuthentication: no - name: Verify the options are correctly set block: - meta: flush_handlers - name: Print current configuration file slurp: src: /etc/ssh/sshd_config_custom register: config - name: Get stat of the configuration file stat: path: /etc/ssh/sshd_config_custom register: config_stat - name: Print second configuration file slurp: src: /etc/ssh/sshd_config_custom_second register: config2 - name: Print the main configuration file slurp: src: /etc/ssh/sshd_config register: config3 - name: Check content of first configuration file assert: that: - "'AcceptEnv LANG' in config.content | b64decode" - "'Banner /etc/issue' in config.content | b64decode" - "'Ciphers aes256-ctr' in config.content | b64decode" - "'HostKey' not in config.content | b64decode" - "'Compression no' in config.content | b64decode" - "'MaxStartups 100' not in config.content | b64decode" - name: Check content of second configuration file assert: that: - "'Banner /etc/issue2' in config2.content | b64decode" - "'Ciphers aes128-ctr' in config2.content | b64decode" - "'HostKey' not in config2.content | b64decode" - "'MaxStartups 100' in config2.content | b64decode" - "'Compression no' not in config2.content | b64decode" - name: Check content of the main configuration file assert: that: - "'Banner /etc/issue' in config3.content | b64decode" - "'Ciphers aes192-ctr' in config3.content | b64decode" - "'HostKey /tmp/ssh_host_ecdsa_key' in config3.content | b64decode" - "'PasswordAuthentication no' in config3.content | b64decode" - "'MaxStartups 100' not in config3.content | b64decode" - "'Compression no' not in config3.content | b64decode" - name: Check the generated config has requested properties assert: that: - config_stat.stat.exists - config_stat.stat.gr_name == 'nobody' - config_stat.stat.pw_name == 'nobody' - config_stat.stat.mode == '0660' tags: tests::verify - name: "Restore configuration files" include_tasks: tasks/restore.yml