From 90e35a58f0b67da4c530057801cf9efbd0dbf2d3 Mon Sep 17 00:00:00 2001 From: mrwho Date: Mon, 11 May 2026 15:54:07 +0300 Subject: [PATCH] initial commit --- .vscode/settings.json | 3 + inventory/prod/group_vars/all/users.yml | 40 ++ inventory/prod/group_vars/all/vars.yml | 37 ++ inventory/prod/group_vars/centos/vars.yml | 10 + inventory/prod/group_vars/debian/vars.yml | 10 + inventory/prod/group_vars/rocky9/vars.yml | 10 + inventory/prod/hosts.yml | 13 + playbooks/rocky9.yml | 14 + roles/rocky9/defaults/main.yml | 8 + roles/rocky9/handlers/main.yml | 0 roles/rocky9/tasks/create_users.yml | 37 ++ roles/rocky9/tasks/install_packages.yml | 92 ++++ roles/rocky9/tasks/main.yml | 41 ++ roles/rocky9/tasks/security_setup.yml | 15 + roles/rocky9/tasks/set_network_nic.yml | 29 ++ roles/rocky9/tasks/set_nic_names_eth.yml | 54 +++ roles/rocky9/tasks/sysctl_tuning.yml | 415 ++++++++++++++++++ roles/rocky9/templates/.bashrc.j2 | 30 ++ roles/rocky9/templates/70-eth0.link.j2 | 5 + roles/rocky9/templates/httpd-tune.conf.j2 | 3 + roles/rocky9/templates/ifcfg-eth0.j2 | 17 + roles/rocky9/templates/ip_bridge.conf.j2 | 5 + roles/rocky9/templates/ip_forward.conf.j2 | 14 + roles/rocky9/templates/ip_netfilter.conf.j2 | 27 ++ roles/rocky9/templates/ip_spoofing.conf.j2 | 4 + roles/rocky9/templates/kernel_tune.conf.j2 | 29 ++ roles/rocky9/templates/nginx.repo.j2 | 7 + .../rocky9/templates/permitrootlogin.conf.j2 | 1 + roles/rocky9/templates/prompt.sh.j2 | 2 + roles/rocky9/templates/tcp_tune.conf.j2 | 84 ++++ roles/rocky9/vars/main.yml | 2 + roles/root-cert/files/root_ca.crt | 12 + roles/root-cert/meta/main.yml | 27 ++ roles/root-cert/tasks/darwin.yml | 26 ++ roles/root-cert/tasks/debian.yml | 16 + roles/root-cert/tasks/main.yml | 15 + roles/root-cert/tasks/red_hat.yml | 21 + roles/root-cert/templates/server.py | 6 + roles/root-cert/tests/.gitlab-ci.yml | 105 +++++ roles/root-cert/tests/files/localhost.pem | 31 ++ roles/root-cert/tests/files/py-httpd.py | 13 + roles/root-cert/tests/files/root_ca.pem | 22 + roles/root-cert/tests/localhost | 1 + roles/root-cert/tests/test.yml | 7 + roles/root-cert/tests/test_vagrant.yml | 48 ++ roles/root-cert/tests/test_with_webserver.yml | 26 ++ roles/root-cert/vars/main.yml | 2 + 47 files changed, 1436 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 inventory/prod/group_vars/all/users.yml create mode 100644 inventory/prod/group_vars/all/vars.yml create mode 100644 inventory/prod/group_vars/centos/vars.yml create mode 100644 inventory/prod/group_vars/debian/vars.yml create mode 100644 inventory/prod/group_vars/rocky9/vars.yml create mode 100644 inventory/prod/hosts.yml create mode 100644 playbooks/rocky9.yml create mode 100644 roles/rocky9/defaults/main.yml create mode 100644 roles/rocky9/handlers/main.yml create mode 100644 roles/rocky9/tasks/create_users.yml create mode 100644 roles/rocky9/tasks/install_packages.yml create mode 100644 roles/rocky9/tasks/main.yml create mode 100644 roles/rocky9/tasks/security_setup.yml create mode 100644 roles/rocky9/tasks/set_network_nic.yml create mode 100644 roles/rocky9/tasks/set_nic_names_eth.yml create mode 100644 roles/rocky9/tasks/sysctl_tuning.yml create mode 100644 roles/rocky9/templates/.bashrc.j2 create mode 100644 roles/rocky9/templates/70-eth0.link.j2 create mode 100644 roles/rocky9/templates/httpd-tune.conf.j2 create mode 100644 roles/rocky9/templates/ifcfg-eth0.j2 create mode 100644 roles/rocky9/templates/ip_bridge.conf.j2 create mode 100644 roles/rocky9/templates/ip_forward.conf.j2 create mode 100644 roles/rocky9/templates/ip_netfilter.conf.j2 create mode 100644 roles/rocky9/templates/ip_spoofing.conf.j2 create mode 100644 roles/rocky9/templates/kernel_tune.conf.j2 create mode 100644 roles/rocky9/templates/nginx.repo.j2 create mode 100644 roles/rocky9/templates/permitrootlogin.conf.j2 create mode 100644 roles/rocky9/templates/prompt.sh.j2 create mode 100644 roles/rocky9/templates/tcp_tune.conf.j2 create mode 100644 roles/rocky9/vars/main.yml create mode 100644 roles/root-cert/files/root_ca.crt create mode 100644 roles/root-cert/meta/main.yml create mode 100644 roles/root-cert/tasks/darwin.yml create mode 100644 roles/root-cert/tasks/debian.yml create mode 100644 roles/root-cert/tasks/main.yml create mode 100644 roles/root-cert/tasks/red_hat.yml create mode 100644 roles/root-cert/templates/server.py create mode 100644 roles/root-cert/tests/.gitlab-ci.yml create mode 100644 roles/root-cert/tests/files/localhost.pem create mode 100644 roles/root-cert/tests/files/py-httpd.py create mode 100644 roles/root-cert/tests/files/root_ca.pem create mode 100644 roles/root-cert/tests/localhost create mode 100644 roles/root-cert/tests/test.yml create mode 100644 roles/root-cert/tests/test_vagrant.yml create mode 100644 roles/root-cert/tests/test_with_webserver.yml create mode 100644 roles/root-cert/vars/main.yml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c9ebf2d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:system" +} \ No newline at end of file diff --git a/inventory/prod/group_vars/all/users.yml b/inventory/prod/group_vars/all/users.yml new file mode 100644 index 0000000..2279a88 --- /dev/null +++ b/inventory/prod/group_vars/all/users.yml @@ -0,0 +1,40 @@ +--- +# ── Admin groups ─────────────────────────────────────────────────────────────── +# Add new users here. Each entry requires: +# username — Linux username +# ssh_key — public SSH key string (optional, but strongly recommended) +# +# To allow a group on a specific host/group, override `users_allowed_admin_groups` +# in the corresponding group_vars//vars.yml or host_vars//vars.yml. + +users_admin_groups: + super_admin: + - username: s.lebed + ssh_key: >- + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChuu3tibT89C77sjX19kqqfr3qqM1eknqipnvZzd23cZTn8ULyWLLmOSYiEuOP5fcz55PVOpe8k8eBC+JvCu+/W1XdPH/q7GCL00b0ANcMKMZHvi/zjFSZj7NoFeypVF4/dutTWudpftFdmfJdHt5wyFs37cVNc4WWbNSASQBHhzR3GSdq7h5H5Ed0ua6AIFNR9Mt0rFI5JYbMaU/mO5WvvrlIq4T1X1zpHUDPloFXmnWd+WPuGPR7ecHP0mmXYSoWDCjEBexCUiAPb9BhR7dbe9lDjWwDB3J9daKXQ9rFpZ6f91DyD6sImarJSmTYXHnAn3u/Hj3IW5TYW4XMypob+NIRa3o7Zuu0rZ2uqwFdSxe9sOJHkgxTxwnJpBxRsQCpAl4uyGGOmTUiYDY7rK86zk1e4xetwt7DS16WOqdrBSNw6sKmvAtkcxacmbOO68+ixmWERpbFXuJtuCQodOtgf+vGUbXASJ1RQtmrBP0qKbV+MYqMOLP1RPA6UUeYssA/lG0uO4u7xxAW30MExZjeETgzGONbSBshqwFt09aXYs57Esp+kn4cFYcYkhvbPeicFiaCwQ4RWd+iAryd6KFNFrc0o0TuqbwE+3Dba2dU3P2KQ+nVIYGeDs62OyYV0yCN0ZEHDzkJAsbqNMDVpwCv4YdZdg0iB40aednRzNYv3Q== s.lebed@gigacoms.ru + + - username: a.kazantsev + # Note: key comment says a.kazantsev — verify the key owner if needed + ssh_key: >- + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClB+roxcr/POfhJVq3jFIzZD36nRVhfYq9WaQBr6o2RvMHM+B/2yRM8OeN6jhhYYFB8z7X5o8j1/ZC2u/80LLJtEQ0s8DCb4l4Ie7IY3POBYlmwtvlnhNFsGlKoAoQr0jpPUwMiV7wdBtHYCqHJM69+VpWCnqOkI+hrdj5oxSm26g6AKL0lm9AJO8KnbIpUCHgnQ3EcPcfQE7OpspVP6nbp4SwipJbnG4yYeKB6l77ESUdCkgwwLCv4DCpxJ846J9aN39Bu273hmEoO6+Bw0wAPRruLp5/AzPni7frcncdGuPfOmi+RAoOsRqoO/c122soAbQn3074QtEKwuC+zFKH a.kazantsev@gigacoms.ru + + middle_admin: + [] + # Example: + # - username: m.ivanov + # ssh_key: "ssh-rsa AAAA..." + + junior_admin: + [] + # Example: + # - username: j.petrov + # ssh_key: "ssh-rsa AAAA..." + +# ── Default access policy ────────────────────────────────────────────────────── +# Which admin groups are provisioned on hosts by default. +# Override in group_vars//vars.yml or host_vars//vars.yml +# to restrict access on specific servers. +users_allowed_admin_groups: + - super_admin + - middle_admin + - junior_admin diff --git a/inventory/prod/group_vars/all/vars.yml b/inventory/prod/group_vars/all/vars.yml new file mode 100644 index 0000000..82daccc --- /dev/null +++ b/inventory/prod/group_vars/all/vars.yml @@ -0,0 +1,37 @@ +--- +# ── SSH connection ───────────────────────────────────────────────────────────── +# Credentials are injected from GitLab CI/CD Variables: +# ANSIBLE_SSH_USER — remote user +# ANSIBLE_SSHKEY_ID_RSA — private SSH key (записывается в ~/.ssh/id_rsa в before_script) +# ANSIBLE_BECOME_PASS — sudo password +ansible_user: "{{ lookup('env', 'ANSIBLE_SSH_USER') | mandatory }}" +ansible_become: true +ansible_become_method: sudo +ansible_become_pass: "{{ lookup('env', 'ANSIBLE_BECOME_PASS') | mandatory }}" + +ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" + +# Zabbix agent default settings +agent_major_version: "7.0" +agent_variant: "2" +agent_2_plugin_list: [''] +agent_param_server: + - 10.203.0.50 +agent_param_serveractive: + - 10.203.0.50 +agent_param_tlsconnect: unencrypted +agent_param_tlsaccept: + - unencrypted + +# Chrony NTP Client settings +chrony_log_enable: true +chrony_log: measurements statistics tracking +chrony_logdir: /var/log/chrony/ +chrony_ntp_servers: + - 10.203.2.11 + - 10.203.2.12 +chrony_rtcsync: true +chrony_timezone: Europe/Moscow +# Firewalld defaults +firewall_disable_conflicting_services: true +firewall_transactional_update_reboot_ok: true diff --git a/inventory/prod/group_vars/centos/vars.yml b/inventory/prod/group_vars/centos/vars.yml new file mode 100644 index 0000000..5c7a061 --- /dev/null +++ b/inventory/prod/group_vars/centos/vars.yml @@ -0,0 +1,10 @@ +--- +# ── CentOS 7 specifics ──────────────────────────────────────────────────────── +ansible_python_interpreter: /usr/bin/python3 + +# Group that grants sudo privileges on RHEL/CentOS +users_sudo_group: wheel + +# Restrict access example — uncomment to allow only super_admin on all CentOS hosts: +# users_allowed_admin_groups: +# - super_admin diff --git a/inventory/prod/group_vars/debian/vars.yml b/inventory/prod/group_vars/debian/vars.yml new file mode 100644 index 0000000..d5d6f44 --- /dev/null +++ b/inventory/prod/group_vars/debian/vars.yml @@ -0,0 +1,10 @@ +--- +# ── Debian 12 specifics ─────────────────────────────────────────────────────── +ansible_python_interpreter: /usr/bin/python3 + +# Group that grants sudo privileges on Debian/Ubuntu +users_sudo_group: sudo + +# Restrict access example — uncomment to allow only super_admin on all Debian hosts: +# users_allowed_admin_groups: +# - super_admin diff --git a/inventory/prod/group_vars/rocky9/vars.yml b/inventory/prod/group_vars/rocky9/vars.yml new file mode 100644 index 0000000..fb6feb2 --- /dev/null +++ b/inventory/prod/group_vars/rocky9/vars.yml @@ -0,0 +1,10 @@ +--- +# ── Rocky Linux 9 specifics ─────────────────────────────────────────────────── +ansible_python_interpreter: /usr/bin/python3 + +# Группа для sudo-привилегий на RHEL-совместимых системах +users_sudo_group: wheel + +# Переопределяем логику named-роли: RedHat.yml возвращает '2' для версий != 8, +# на Rocky 9 нужен python3-netaddr / python3-dns +named_python_version: "3" diff --git a/inventory/prod/hosts.yml b/inventory/prod/hosts.yml new file mode 100644 index 0000000..0e85524 --- /dev/null +++ b/inventory/prod/hosts.yml @@ -0,0 +1,13 @@ +--- +all: + children: + centos: + hosts: + router: + ansible_host: 172.20.21.100 + git: + ansible_host: 172.20.21.105 + vm01: + ansible_host: 80.211.195.127 + vm02: + ansible_host: 212.60.5.162 diff --git a/playbooks/rocky9.yml b/playbooks/rocky9.yml new file mode 100644 index 0000000..d1b6115 --- /dev/null +++ b/playbooks/rocky9.yml @@ -0,0 +1,14 @@ +--- +- name: Initial Rocky9 Configuration + + hosts: rocky9-template + # - 172.20.21.193 + become: true + vars: + ansible_ssh_user: root + ansible_ssh_password: nmklop90 + reboot_system: false + hostname: rocky9-template.local.mrwho.ru + roles: + - rocky9 + - root-cert diff --git a/roles/rocky9/defaults/main.yml b/roles/rocky9/defaults/main.yml new file mode 100644 index 0000000..87f668e --- /dev/null +++ b/roles/rocky9/defaults/main.yml @@ -0,0 +1,8 @@ +--- +hostname: centos01.local.mrwho.ru +ip4_addr: 172.20.21.101/24 +ip4_gate: 172.20.21.1 +ip4_dns: + - 172.20.21.1 + - 192.168.1.1 +reboot_system: false diff --git a/roles/rocky9/handlers/main.yml b/roles/rocky9/handlers/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/roles/rocky9/tasks/create_users.yml b/roles/rocky9/tasks/create_users.yml new file mode 100644 index 0000000..b5945a9 --- /dev/null +++ b/roles/rocky9/tasks/create_users.yml @@ -0,0 +1,37 @@ +--- +- name: Create users + ansible.builtin.user: + name: mrwho + comment: Great and mighty + # uid: 1001 + state: present + +- name: Add SSH key + ansible.posix.authorized_key: + user: mrwho + state: present + key: "{{ item }}" + with_file: + - mrwho.ssh.pub + +- name: Add to sudoers + community.general.sudoers: + name: mrwho + user: mrwho + commands: ALL + state: present + +- name: Update mrwho .bashrc + ansible.builtin.template: + src: .bashrc.j2 + dest: /home/mrwho/.bashrc + owner: mrwho + mode: "0644" +# group: mrwho + +# - name: Update root .bashrc +# template: +# src: .bashrc.j2 +# dest: /root/.bashrc +# owner: root +# group: root diff --git a/roles/rocky9/tasks/install_packages.yml b/roles/rocky9/tasks/install_packages.yml new file mode 100644 index 0000000..6d69187 --- /dev/null +++ b/roles/rocky9/tasks/install_packages.yml @@ -0,0 +1,92 @@ +--- +# - name: Add Nginx Repo +# template: +# src: nginx.repo.j2 +# dest: /etc/yum.repos.d/nginx.repo +# owner: root +# group: root +# - name: Configure dnf to use fastest mirror +# ansible.builtin.lineinfile: +# path: /etc/dnf/dnf.conf +# regexp: '^fastestmirror=' +# line: 'fastestmirror=True' + +- name: Enable fastestmirror in DNF + community.general.ini_file: + path: /etc/dnf/dnf.conf + section: main + option: fastestmirror + value: "True" + state: present + +- name: Enable parallel downloads in DNF + community.general.ini_file: + path: /etc/dnf/dnf.conf + section: main + option: max_parallel_downloads + value: "10" + state: present + backup: yes + +- name: Ensure the crb repository is enabled + community.general.dnf_config_manager: + name: crb + state: enabled + +- name: Install EPEL repo + ansible.builtin.dnf: + name: + - epel-release + state: present + +- name: Upgrade all packages + ansible.builtin.dnf: + name: "*" + state: latest + +- name: Install soft + ansible.builtin.dnf: + name: + - net-tools + - mc + - cronie + - logrotate + - sudo + - traceroute + - tcpdump + - screen + - whois + - telnet + - sed + - tar + - unzip + - unrar + - gzip + - rsync + - sysstat + - dos2unix + - iperf3 + - wget + - ntsysv + - dmidecode + - nfs-utils + - git + - sos + - mtr + - lshw + - irqbalance + - iotop + - strace + - numactl + - lsof + - nano + - htop + - btop + - bind-utils + - psmisc + # - speedtest-cli + - python-pip + - open-vm-tools + - qemu-guest-agent + # - deltarpm + state: latest diff --git a/roles/rocky9/tasks/main.yml b/roles/rocky9/tasks/main.yml new file mode 100644 index 0000000..2379b2b --- /dev/null +++ b/roles/rocky9/tasks/main.yml @@ -0,0 +1,41 @@ +--- +- name: Set a hostname + ansible.builtin.hostname: + name: "{{ hostname }}" + +- name: Set Prompt + ansible.builtin.template: + src: prompt.sh.j2 + dest: /etc/profile.d/prompt.sh + owner: root + group: root + mode: "0644" + +# - name: Create users +# ansible.builtin.include_tasks: +# file: create_users.yml + +- name: Syctl tuning + ansible.builtin.include_tasks: + file: sysctl_tuning.yml + +# - name: Setup NIC to eth0 +# ansible.builtin.include_tasks: +# file: set_network_nic.yml + +- name: Setup NIC to eth0 + ansible.builtin.include_tasks: + file: set_nic_names_eth.yml + +- name: Install packages + ansible.builtin.include_tasks: + file: install_packages.yml + +- name: Setup secutity options + ansible.builtin.include_tasks: + file: security_setup.yml + +- name: Reboot System + ansible.builtin.reboot: + reboot_timeout: 60 + when: reboot_system is true diff --git a/roles/rocky9/tasks/security_setup.yml b/roles/rocky9/tasks/security_setup.yml new file mode 100644 index 0000000..ab7b814 --- /dev/null +++ b/roles/rocky9/tasks/security_setup.yml @@ -0,0 +1,15 @@ +--- +- name: Disable SELinux + ansible.posix.selinux: + state: disabled + +- name: Explicitly specifying positional matched groups in replacement + ansible.builtin.replace: + path: /etc/ssh/sshd_config + regexp: ^(ListenAddress[ ]+)[^\n]+$ + replace: \g<1>0.0.0.0 + +# - name: Disable Root Login +# template: +# src: permitrootlogin.conf.j2 +# dest: /etc/ssh/sshd_config.d/01-permitrootlogin.conf diff --git a/roles/rocky9/tasks/set_network_nic.yml b/roles/rocky9/tasks/set_network_nic.yml new file mode 100644 index 0000000..34c442e --- /dev/null +++ b/roles/rocky9/tasks/set_network_nic.yml @@ -0,0 +1,29 @@ +--- +- name: Create /etc/systemd/network dir + ansible.builtin.file: + path: /etc/systemd/network + state: directory + owner: root + group: root + mode: "0755" + +- name: Rename NIC to eth0 + ansible.builtin.template: + src: 70-eth0.link.j2 + dest: /etc/systemd/network/70-eth0.link + owner: root + group: root + mode: "0644" + +- name: Set network connection + community.general.nmcli: + conn_name: eth0 + ifname: eth0 + type: ethernet + mac: "{{ ansible_default_ipv4.macaddress }}" + method4: auto + method6: disabled + state: present + +# - name: MAC Address +# debug: msg="{{ ansible_default_ipv4.macaddress }}" diff --git a/roles/rocky9/tasks/set_nic_names_eth.yml b/roles/rocky9/tasks/set_nic_names_eth.yml new file mode 100644 index 0000000..e796579 --- /dev/null +++ b/roles/rocky9/tasks/set_nic_names_eth.yml @@ -0,0 +1,54 @@ +--- +- name: Формируем отсортированный список физических интерфейсов + ansible.builtin.set_fact: + # Сортировка гарантирует порядок: первый в списке станет eth0 + physical_interfaces: "{{ ansible_interfaces | json_query('[? !contains(`' + (ignored_interfaces | join(' ')) + '`, @)]') | sort }}" + +- name: Сохраняем сетевые настройки первого интерфейса (будущего eth0) + ansible.builtin.set_fact: + first_iface: "{{ physical_interfaces[0] }}" + current_ip: "{{ hostvars[inventory_hostname]['ansible_' + physical_interfaces[0].replace('-', '_')]['ipv4']['address'] }}" + current_mask: "{{ hostvars[inventory_hostname]['ansible_' + physical_interfaces[0].replace('-', '_')]['ipv4']['netmask'] }}" + current_gw: "{{ ansible_default_ipv4.gateway | default(omit) }}" + +- name: Настройка eth0 с сохранением текущего IP + community.general.nmcli: + conn_name: eth0 + ifname: eth0 + type: ethernet + mac: "{{ ansible_facts[first_iface]['macaddress'] }}" + ip4: "{{ current_ip }}/{{ current_mask }}" + gw4: "{{ current_gw }}" + state: present + autoconnect: true + +- name: Настройка остальных интерфейсов (eth1, eth2...) + community.general.nmcli: + conn_name: eth{{ item.0 + 1 }} + ifname: eth{{ item.0 + 1 }} + type: ethernet + mac: "{{ ansible_facts[item.1]['macaddress'] }}" + state: present + autoconnect: true + # Пропускаем первый (индекс 0), так как настроили его выше + loop: "{{ physical_interfaces[1:] | enumerate }}" + +- name: Применение настроек (поднятие eth0) + ansible.builtin.shell: nmcli device connect eth0 # noqa: command-instead-of-shell ignore-errors + async: 20 + poll: 0 + ignore_errors: true # noqa: ignore-errors + changed_when: true + +- name: Применение настроек для остальных интерфейсов + ansible.builtin.shell: nmcli device connect eth{{ item.0 + 1 }} # noqa: command-instead-of-shell ignore-errors + loop: "{{ physical_interfaces[1:] | enumerate }}" + ignore_errors: true # noqa: ignore-errors + changed_when: false + +- name: Перезапуск NetworkManager для чистоты + ansible.builtin.systemd: + name: NetworkManager + state: restarted + async: 30 + poll: 0 diff --git a/roles/rocky9/tasks/sysctl_tuning.yml b/roles/rocky9/tasks/sysctl_tuning.yml new file mode 100644 index 0000000..5dae293 --- /dev/null +++ b/roles/rocky9/tasks/sysctl_tuning.yml @@ -0,0 +1,415 @@ +--- +# Remove kernel.panic entry from /etc/sysctl.conf +- ansible.posix.sysctl: + name: kernel.panic + state: absent + sysctl_file: /etc/sysctl.conf +# Отключаем отслеживание ядром нажатие специальных сочетаний клавиш +- ansible.posix.sysctl: + name: kernel.sysrq + value: 0 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf + +# Добавление к файлу дампа ядра PID процесса +- ansible.posix.sysctl: + name: kernel.core_uses_pid + value: 1 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Здесь указывается максимальное количество байт в одном сообщении при передачи их между процессами +- ansible.posix.sysctl: + name: kernel.msgmnb + value: 65536 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Здесь определяется максимальный размер сообщения, которое может быть отправлено от одного процесса другому. +- ansible.posix.sysctl: + name: kernel.msgmax + value: 65536 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf + +# Максимальный размер (в байтах) на сегменте shared memory. +- ansible.posix.sysctl: + name: kernel.shmmax + value: 68719476736 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Общее количество разделяемой памяти (в страницах), какое все процессы на сервере могут использовать. +- ansible.posix.sysctl: + name: kernel.shmall + value: 4294967296 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf + +# Лимит одновременно открытых файлов в системе +- ansible.posix.sysctl: + name: fs.file-max + value: 1000000 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf + +# Максимальный размер буфера приема данных для всех соединений. +- ansible.posix.sysctl: + name: net.core.rmem_max + value: 33554432 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Максимальный размер буфера передачи данных для всех соединений. +- ansible.posix.sysctl: + name: net.core.wmem_max + value: 33554432 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Размер буфера приема данных по умолчанию для всех соединений. +- ansible.posix.sysctl: + name: net.core.rmem_default + value: 8388608 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Размер буфера передачи данных по умолчанию для всех соединений. +- ansible.posix.sysctl: + name: net.core.wmem_default + value: 4194394 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf +# Максимальный размер буфера приема данных для всех соединений. +- ansible.posix.sysctl: + name: net.core.optmem_max + value: 40960 + state: present + sysctl_file: /etc/sysctl.d/kernel_tune.conf + +# - name: Deploy kernel_tune.conf +# ansible.builtin.template: +# src: kernel_tune.conf.j2 +# dest: /etc/sysctl.d/kernel_tune.conf +# mode: "0644" + +#- name: Deploy tcp_tune.conf +# ansible.builtin.template: +# src: tcp_tune.conf.j2 +# dest: /etc/sysctl.d/tcp_tune.conf +# mode: "0644" + +# TCP syncookies - технология, позволяющая не забивать +# TCP стек, пока TCP сессия полностью не установится. +# Защита на случай TCP Syn атак +# Согласно рекомендациям разработчиков ядра, этот режим лучше отключить. +# http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt +- ansible.posix.sysctl: + name: net.ipv4.tcp_syncookies + value: 0 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf + +# Векторная (минимум, по умолчанию, максимум) переменная в файле tcp_rmem содержит 3 целых числа, определяющих размер буфера сокетов TCP/UDP. +# Минимум: каждый сокет TCP имеет право использовать эту память по факту своего создания. Возможность использования такого буфера гарантируется +# даже при достижении порога ограничения (moderate memory pressure). Размер минимального буфера по умолчанию составляет 8 Кбайт (8192). +# Значение по умолчанию: количество памяти, допустимое для буфера передачи сокета TCP по умолчанию. Это значение применяется взамен параметра +# /proc/sys/net/core/rmem_default, используемого другими протоколами. Значение используемого по умолчанию буфера обычно (по умолчанию) +# составляет 87830 байт. Это определяет размер окна 65535 с заданным по умолчанию значением tcp_adv_win_scale и tcp_app_win = 0, несколько +# меньший, нежели определяет принятое по умолчанию значение tcp_app_win. +# Максимум: максимальный размер буфера, который может быть автоматически выделен для приема сокету TCP. Это значение не отменяет максимума, +# заданного в файле /proc/sys/net/core/rmem_max. При “статическом” выделении памяти с помощью SO_RCVBUF этот параметр не имеет значения. +# На приём TCP пакетов +- ansible.posix.sysctl: + name: net.ipv4.tcp_rmem + value: 4096 8388608 16777216 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf# На передачу TCP пакетов +- ansible.posix.sysctl: + name: net.ipv4.tcp_wmem + value: 4096 4194394 16777216 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Для TCP протокола в целом +- ansible.posix.sysctl: + name: net.ipv4.tcp_mem + value: 8388608 12582912 16777216 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Для UDP протокола в целом +- ansible.posix.sysctl: + name: net.ipv4.udp_mem + value: 8388608 12582912 16777216 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +- ansible.posix.sysctl: + name: net.ipv4.udp_rmem_min + value: 16384 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +- ansible.posix.sysctl: + name: net.ipv4.udp_wmem_min + value: 16384 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать. +- ansible.posix.sysctl: + name: net.core.netdev_max_backlog + value: 500000 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Максимальное число запоминаемых запросов на соединение (TCP Syn), для которых не было получено подтверждения от подключающегося клиента. +- ansible.posix.sysctl: + name: net.ipv4.tcp_max_syn_backlog + value: 5480000 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Увеличим возможное количество сокетов в состоянии TIME_WAIT. +- ansible.posix.sysctl: + name: net.ipv4.tcp_max_tw_buckets + value: 5480000 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Разрешаем повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным. +- ansible.posix.sysctl: + name: net.ipv4.tcp_tw_reuse + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Разрешаем быструю утилизацию сокетов находящихся в состоянии TIME_WAIT +- ansible.posix.sysctl: + name: net.ipv4.tcp_tw_recycle + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Параметр tcp_fin_timeout определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. +# Партнер может не закрыть это соединение никогда. +- ansible.posix.sysctl: + name: net.ipv4.tcp_fin_timeout + value: 3 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Разрешить выборочные подтверждения протокола TCP. Опция необходима для эффективного использования всей доступной +# пропускной способности некоторых сетей +- ansible.posix.sysctl: + name: net.ipv4.tcp_sack + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Число попыток повтора передачи пакетов SYNACK для пассивных соединений TCP. +- ansible.posix.sysctl: + name: net.ipv4.tcp_synack_retries + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Определяет максимальное число допустимых в системе сокетов TCP, не связанных каким-либо идентификатором пользовательского файла (user file handle). +- ansible.posix.sysctl: + name: net.ipv4.tcp_max_orphans + value: 65536 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Определяется число неудачных попыток, после которого уничтожается соединение TCP, закрытое на локальной стороне. +- ansible.posix.sysctl: + name: net.ipv4.tcp_orphan_retries + value: 0 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Проверка наличия подключения по средствам keepalive сообщений. Активируется только для тех сокетов, которые были созданы с флагом SO_KEEPALIVE. +# Через какой промежуток времени после установки подключения начать слать keepalive сообщения (в сек) +- ansible.posix.sysctl: + name: net.ipv4.tcp_keepalive_time + value: 600 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Интервал, с которым слать keepalive пакеты (в сек) +- ansible.posix.sysctl: + name: net.ipv4.tcp_keepalive_intvl + value: 20 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# После скольки неудачных пробах считать соединение разорванным +- ansible.posix.sysctl: + name: net.ipv4.tcp_keepalive_probes + value: 2 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Запрещаем технологию slow start (малый размер окна) в TCP подключениях, +# в которых долгое время не было трафика. +- ansible.posix.sysctl: + name: net.ipv4.tcp_slow_start_after_idle + value: 0 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Увеличиваем диапазон локальных портов, доступных для установки исходящих подключений. +- ansible.posix.sysctl: + name: net.ipv4.ip_local_port_range + value: 2000 65000 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Разрешает временные метки протокола TCP. Их наличие позволяет управлять работой протокола в условиях серьезных нагрузок. +- ansible.posix.sysctl: + name: net.ipv4.tcp_timestamps + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Параметр отвечающий за алгоритмы сегментации TCP пакетов при передаче данных. +# Cubic - алгоритм для высоконагруженных систем, но более структурированный, нежели BIC. +# Включён по умолчанию в linux ядре начиная с версии 2.6.19 +# BBR - Алгоритм от Гугла, получайте максимальную скорость, если у вас широкий канал +- ansible.posix.sysctl: + name: net.ipv4.tcp_congestion_control + value: bbr + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Параметр определяет дисциплину обработки очередей +# FQ делят пропускную способность между всеми соединениями, даёт лучшую пропускную способность в связке с BBR +- ansible.posix.sysctl: + name: sysctl net.core.default_qdisc + value: fq + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Не сохранять результаты измерений TCP соединения в кеше при его закрытии +- ansible.posix.sysctl: + name: net.ipv4.tcp_no_metrics_save + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Разрешаем динамическое изменение размера окна TCP стека (окно увеличивается, если не было потерь +# пакетов при передаче в рамках TCP подключения) +- ansible.posix.sysctl: + name: net.ipv4.tcp_window_scaling + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Защита от TIME_WAIT атак. +- ansible.posix.sysctl: + name: net.ipv4.tcp_rfc1337 + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Не отвечаем на ICMP ECHO запросы, переданные на широковещательный адрес. +- ansible.posix.sysctl: + name: net.ipv4.icmp_echo_ignore_broadcasts + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Не отвечаем на ошибочно сформированные сообщения. +- ansible.posix.sysctl: + name: net.ipv4.icmp_ignore_bogus_error_responses + value: 1 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf +# Максимальное число открытых сокетов, ждущих соединения. +# Максимум в CentOS 7 +- ansible.posix.sysctl: + name: net.core.somaxconn + value: 65535 + state: present + sysctl_file: /etc/sysctl.d/tcp_tune.conf + +#- name: Deploy ip_spoofing.conf +# ansible.builtin.template: +# src: ip_spoofing.conf.j2 +# dest: /etc/sysctl.d/ip_spoofing.conf +# mode: "0644" +# Активируем защиту от IP-спуфинга. +- ansible.posix.sysctl: + name: net.ipv4.conf.default.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_spoofing.conf +- ansible.posix.sysctl: + name: net.ipv4.conf.all.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_spoofing.conf +- ansible.posix.sysctl: + name: net.ipv4.conf.lo.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_spoofing.conf + +#- name: Deploy ip_forward.conf +# ansible.builtin.template: +# src: ip_forward.conf.j2 +# dest: /etc/sysctl.d/ip_forward.conf +# mode: "0644" + +# Запрет на передачу пакетов через сервер (т.е. работу его как шлюза) +- ansible.posix.sysctl: + name: net.ipv4.ip_forward + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf + +# Запрет на маршрутизацию на основе соответствующей опции в пакете (безопасность) +- ansible.posix.sysctl: + name: net.ipv4.conf.default.accept_source_route + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf + +# Если в таблице маршрутизации есть маршрут на сеть, с которой пришёл пакет (src ip) +# и он ссылается на данный интерфейс, то такой пакет будет принят. +# остальные будут отброшены. +- ansible.posix.sysctl: + name: net.ipv4.conf.default.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf +- ansible.posix.sysctl: + name: net.ipv4.conf.all.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf +- ansible.posix.sysctl: + name: net.ipv4.conf.lo.rp_filter + value: 1 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf +- ansible.posix.sysctl: + name: net.ipv4.all.send_redirects + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf +- ansible.posix.sysctl: + name: net.ipv4.all.accept_redirects + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_forward.conf + +#- name: Deploy ip_bridge.conf +# ansible.builtin.template: +# src: ip_bridge.conf.j2 +# dest: /etc/sysctl.d/ip_bridge.conf +# mode: "0644" + +# Отключение фильтрации на br интерфейсах. необходимо в некоторых случаях, +# когда NAT не правильно отрабатывает по таким интерфейсам +- ansible.posix.sysctl: + name: net.bridge.bridge-nf-call-ip6tables + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_bridge.conf +- ansible.posix.sysctl: + name: net.bridge.bridge-nf-call-iptables + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_bridge.conf +- ansible.posix.sysctl: + name: net.bridge.bridge-nf-call-arptables + value: 0 + state: present + sysctl_file: /etc/sysctl.d/ip_bridge.conf + +#- name: Deploy httpd-tune.conf +# ansible.builtin.template: +# src: httpd-tune.conf.j2 +# dest: /etc/sysctl.d/httpd-tune.conf +# mode: "0644" +#limit for using memory +- ansible.posix.sysctl: + name: vm.overcommit_ratio + value: 100 + state: present + sysctl_file: /etc/sysctl.d/ip_httpd.conf + +- ansible.posix.sysctl: + name: vm.overcommit_memory + value: 2 + state: present + sysctl_file: /etc/sysctl.d/ip_httpd.conf diff --git a/roles/rocky9/templates/.bashrc.j2 b/roles/rocky9/templates/.bashrc.j2 new file mode 100644 index 0000000..06b075b --- /dev/null +++ b/roles/rocky9/templates/.bashrc.j2 @@ -0,0 +1,30 @@ +# .bashrc + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +# Uncomment the following line if you don't like systemctl's auto-paging feature: +# export SYSTEMD_PAGER= + +# User specific aliases and functions +if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]] +then + PATH="$HOME/.local/bin:$HOME/bin:$PATH" +fi +export PATH + +b=`tput bold` +n=`tput sgr0` +alias ls='ls --color=auto' +alias ll='ls -l' +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' + +echo -e "${b}Hostname:${n} `hostname` \t\t IP address: `/sbin/ifconfig | grep -v 127.0.0.1 | grep "inet " | awk -F: '{print $1}' | awk '{print $2}'`" +echo -e "${b}CPU load:${n} `cat /proc/loadavg | cut -d" " -f1-3`" +echo -e "${b}Uptime:${n} `uptime | cut -d" " -f 4-7 | cut -d"," -f1-2`" +echo -e "Free memory: `cat /proc/meminfo | grep MemFree | awk {'print int($2/1000)'}` MB \t\t Total memory: `cat /proc/meminfo | grep MemTotal | awk {'print int($2/1000)'}` MB" +echo -e "Proccess number: `cat /proc/loadavg | cut -d"/" -f2| cut -d" " -f1`\n" diff --git a/roles/rocky9/templates/70-eth0.link.j2 b/roles/rocky9/templates/70-eth0.link.j2 new file mode 100644 index 0000000..64ce708 --- /dev/null +++ b/roles/rocky9/templates/70-eth0.link.j2 @@ -0,0 +1,5 @@ +[Match] +MACAddress={{ ansible_default_ipv4.macaddress }} + +[Link] +Name=eth0 diff --git a/roles/rocky9/templates/httpd-tune.conf.j2 b/roles/rocky9/templates/httpd-tune.conf.j2 new file mode 100644 index 0000000..e6f21ca --- /dev/null +++ b/roles/rocky9/templates/httpd-tune.conf.j2 @@ -0,0 +1,3 @@ +#limit for using memory +vm.overcommit_ratio = 100 +vm.overcommit_memory = 2 diff --git a/roles/rocky9/templates/ifcfg-eth0.j2 b/roles/rocky9/templates/ifcfg-eth0.j2 new file mode 100644 index 0000000..d5e4e77 --- /dev/null +++ b/roles/rocky9/templates/ifcfg-eth0.j2 @@ -0,0 +1,17 @@ +TYPE = "Ethernet" +NAME = "eth0" +DEVICE = "eth0" +ONBOOT = "yes" + +PV4_FAILURE_FATAL="no" +IPV6INIT="no" +IPV6_AUTOCONF="no" +IPV6_DEFROUTE="no" +IPV6_FAILURE_FATAL="no" + +NM_CONTROLLED=no +BOOTPROTO=none +IPADDR=172.20.21.101 +NETMASK=255.255.255.0 +GATEWAY=172.20.21.1 + diff --git a/roles/rocky9/templates/ip_bridge.conf.j2 b/roles/rocky9/templates/ip_bridge.conf.j2 new file mode 100644 index 0000000..90bedaf --- /dev/null +++ b/roles/rocky9/templates/ip_bridge.conf.j2 @@ -0,0 +1,5 @@ +# Отключение фильтрации на br интерфейсах. необходимо в некоторых случаях, +# когда NAT не правильно отрабатывает по таким интерфейсам +net.bridge.bridge-nf-call-ip6tables = 0 +net.bridge.bridge-nf-call-iptables = 0 +net.bridge.bridge-nf-call-arptables = 0 diff --git a/roles/rocky9/templates/ip_forward.conf.j2 b/roles/rocky9/templates/ip_forward.conf.j2 new file mode 100644 index 0000000..e4a223c --- /dev/null +++ b/roles/rocky9/templates/ip_forward.conf.j2 @@ -0,0 +1,14 @@ +# Запрет на передачу пакетов через сервер (т.е. работу его как шлюза) +net.ipv4.ip_forward = 0 + +# Запрет на маршрутизацию на основе соответствующей опции в пакете (безопасность) +net.ipv4.conf.j2.default.accept_source_route = 0 + +# Если в таблице маршрутизации есть маршрут на сеть, с которой пришёл пакет (src ip) +# и он ссылается на данный интерфейс, то такой пакет будет принят. +# остальные будут отброшены. +net.ipv4.conf.default.rp_filter = 1 +net.ipv4.conf.all.rp_filter=1 +net.ipv4.conf.lo.rp_filter=1 +net.ipv4.all.send_redirects=0 +net.ipv4.all.accept_redirects=0 diff --git a/roles/rocky9/templates/ip_netfilter.conf.j2 b/roles/rocky9/templates/ip_netfilter.conf.j2 new file mode 100644 index 0000000..efb5037 --- /dev/null +++ b/roles/rocky9/templates/ip_netfilter.conf.j2 @@ -0,0 +1,27 @@ +# Увеличение лимита подключений, которые хранит conntrack (iptables) +net.netfilter.nf_conntrack_max=10485760 +net.nf_conntrack_max=10485760 + +# Сколько времени conntrack будет хранить в памяти информацию о сессии, если: +net.netfilter.nf_conntrack_generic_timeout=60 +net.netfilter.nf_conntrack_tcp_timeout_syn_sent=120 +net.netfilter.nf_conntrack_tcp_timeout_syn_recv=60 +net.netfilter.nf_conntrack_tcp_timeout_established=600 +net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120 +net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 +net.netfilter.nf_conntrack_tcp_timeout_last_ack=30 +net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 +net.netfilter.nf_conntrack_tcp_timeout_close=10 +net.netfilter.nf_conntrack_tcp_timeout_max_retrans=120 +net.netfilter.nf_conntrack_tcp_timeout_unacknowledged=300 +#net.netfilter.nf_conntrack_udp_timeout=20 +#net.netfilter.nf_conntrack_udp_timeout_stream=50 +net.netfilter.nf_conntrack_icmp_timeout=20 +net.netfilter.nf_conntrack_events_retry_timeout=5 + +#Soft irq budget TCP/UDP Tuning (default 300) +net.core.netdev_budget=600 + +# Lowering udp conntrack timeout to minimum +net.netfilter.nf_conntrack_udp_timeout=1 +net.netfilter.nf_conntrack_udp_timeout_stream=10 diff --git a/roles/rocky9/templates/ip_spoofing.conf.j2 b/roles/rocky9/templates/ip_spoofing.conf.j2 new file mode 100644 index 0000000..c165f28 --- /dev/null +++ b/roles/rocky9/templates/ip_spoofing.conf.j2 @@ -0,0 +1,4 @@ +# Активируем защиту от IP-спуфинга. +net.ipv4.conf.j2.default.rp_filter=1 +net.ipv4.conf.j2.all.rp_filter = 1 +net.ipv4.conf.j2.lo.rp_filter = 1 diff --git a/roles/rocky9/templates/kernel_tune.conf.j2 b/roles/rocky9/templates/kernel_tune.conf.j2 new file mode 100644 index 0000000..c7542a0 --- /dev/null +++ b/roles/rocky9/templates/kernel_tune.conf.j2 @@ -0,0 +1,29 @@ +# Отключаем отслеживание ядром нажатие специальных сочетаний клавиш +kernel.sysrq = 0 + +# Добавление к файлу дампа ядра PID процесса +kernel.core_uses_pid = 1 + +# Здесь указывается максимальное количество байт в одном сообщении при передачи их между процессами +kernel.msgmnb = 65536 +# Здесь определяется максимальный размер сообщения, которое может быть отправлено от одного процесса другому. +kernel.msgmax = 65536 + +# Максимальный размер (в байтах) на сегменте shared memory. +kernel.shmmax = 68719476736 +# Общее количество разделяемой памяти (в страницах), какое все процессы на сервере могут использовать. +kernel.shmall = 4294967296 + +# Лимит одновременно открытых файлов в системе +fs.file-max=1000000 + +# Максимальный размер буфера приема данных для всех соединений. +net.core.rmem_max=33554432 +# Максимальный размер буфера передачи данных для всех соединений. +net.core.wmem_max=33554432 +# Размер буфера приема данных по умолчанию для всех соединений. +net.core.rmem_default=8388608 +# Размер буфера передачи данных по умолчанию для всех соединений. +net.core.wmem_default=4194394 +# Максимальный размер буфера приема данных для всех соединений. +net.core.optmem_max=40960 diff --git a/roles/rocky9/templates/nginx.repo.j2 b/roles/rocky9/templates/nginx.repo.j2 new file mode 100644 index 0000000..cdf8b72 --- /dev/null +++ b/roles/rocky9/templates/nginx.repo.j2 @@ -0,0 +1,7 @@ +[nginx-stable] +name=Nginx Stable Repo +baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ +gpgcheck=1 +enabled=1 +gpgkey=https://nginx.org/keys/nginx_signing.key +module_hotfixes=true \ No newline at end of file diff --git a/roles/rocky9/templates/permitrootlogin.conf.j2 b/roles/rocky9/templates/permitrootlogin.conf.j2 new file mode 100644 index 0000000..7ff52c7 --- /dev/null +++ b/roles/rocky9/templates/permitrootlogin.conf.j2 @@ -0,0 +1 @@ +PermitRootLogin no diff --git a/roles/rocky9/templates/prompt.sh.j2 b/roles/rocky9/templates/prompt.sh.j2 new file mode 100644 index 0000000..90194f9 --- /dev/null +++ b/roles/rocky9/templates/prompt.sh.j2 @@ -0,0 +1,2 @@ +#!/bin/bash +export PS1="\[\e[31m\][\[\e[m\]\[\e[31m\]\t\[\e[m\]\[\e[31m\]]\[\e[m\][\[\e[37;40m\]\u\[\e[m\]@\[\e[37m\]\H\[\e[m\]][\[\e[36m\]\w\[\e[m\]]\\$ " diff --git a/roles/rocky9/templates/tcp_tune.conf.j2 b/roles/rocky9/templates/tcp_tune.conf.j2 new file mode 100644 index 0000000..6e65771 --- /dev/null +++ b/roles/rocky9/templates/tcp_tune.conf.j2 @@ -0,0 +1,84 @@ +# TCP syncookies - технология, позволяющая не забивать +# TCP стек, пока TCP сессия полностью не установится. +# Защита на случай TCP Syn атак +# Согласно рекомендациям разработчиков ядра, этот режим лучше отключить. +# http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt +net.ipv4.tcp_syncookies = 0 + +# Векторная (минимум, по умолчанию, максимум) переменная в файле tcp_rmem содержит 3 целых числа, определяющих размер буфера сокетов TCP/UDP. +# Минимум: каждый сокет TCP имеет право использовать эту память по факту своего создания. Возможность использования такого буфера гарантируется +# даже при достижении порога ограничения (moderate memory pressure). Размер минимального буфера по умолчанию составляет 8 Кбайт (8192). +# Значение по умолчанию: количество памяти, допустимое для буфера передачи сокета TCP по умолчанию. Это значение применяется взамен параметра +# /proc/sys/net/core/rmem_default, используемого другими протоколами. Значение используемого по умолчанию буфера обычно (по умолчанию) +# составляет 87830 байт. Это определяет размер окна 65535 с заданным по умолчанию значением tcp_adv_win_scale и tcp_app_win = 0, несколько +# меньший, нежели определяет принятое по умолчанию значение tcp_app_win. +# Максимум: максимальный размер буфера, который может быть автоматически выделен для приема сокету TCP. Это значение не отменяет максимума, +# заданного в файле /proc/sys/net/core/rmem_max. При “статическом” выделении памяти с помощью SO_RCVBUF этот параметр не имеет значения. +# На приём TCP пакетов +net.ipv4.tcp_rmem=4096 8388608 16777216 +# На передачу TCP пакетов +net.ipv4.tcp_wmem=4096 4194394 16777216 +# Для TCP протокола в целом +net.ipv4.tcp_mem=8388608 12582912 16777216 +# Для UDP протокола в целом +net.ipv4.udp_mem=8388608 12582912 16777216 +net.ipv4.udp_rmem_min=16384 +net.ipv4.udp_wmem_min=16384 +# Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать. +net.core.netdev_max_backlog=500000 +# Максимальное число запоминаемых запросов на соединение (TCP Syn), для которых не было получено подтверждения от подключающегося клиента. +net.ipv4.tcp_max_syn_backlog=5480000 +# Увеличим возможное количество сокетов в состоянии TIME_WAIT. +net.ipv4.tcp_max_tw_buckets=5480000 +# Разрешаем повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным. +net.ipv4.tcp_tw_reuse=1 +# Разрешаем быструю утилизацию сокетов находящихся в состоянии TIME_WAIT +net.ipv4.tcp_tw_recycle=1 +# Параметр tcp_fin_timeout определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. +# Партнер может не закрыть это соединение никогда. +net.ipv4.tcp_fin_timeout=3 +# Разрешить выборочные подтверждения протокола TCP. Опция необходима для эффективного использования всей доступной +# пропускной способности некоторых сетей +net.ipv4.tcp_sack=1 +# Число попыток повтора передачи пакетов SYNACK для пассивных соединений TCP. +net.ipv4.tcp_synack_retries=1 +# Определяет максимальное число допустимых в системе сокетов TCP, не связанных каким-либо идентификатором пользовательского файла (user file handle). +net.ipv4.tcp_max_orphans=65536 +# Определяется число неудачных попыток, после которого уничтожается соединение TCP, закрытое на локальной стороне. +net.ipv4.tcp_orphan_retries=0 +# Проверка наличия подключения по средствам keepalive сообщений. Активируется только для тех сокетов, которые были созданы с флагом SO_KEEPALIVE. +# Через какой промежуток времени после установки подключения начать слать keepalive сообщения (в сек) +net.ipv4.tcp_keepalive_time=600 +# Интервал, с которым слать keepalive пакеты (в сек) +net.ipv4.tcp_keepalive_intvl=20 +# После скольки неудачных пробах считать соединение разорванным +net.ipv4.tcp_keepalive_probes=2 +# Запрещаем технологию slow start (малый размер окна) в TCP подключениях, +# в которых долгое время не было трафика. +net.ipv4.tcp_slow_start_after_idle=0 +# Увеличиваем диапазон локальных портов, доступных для установки исходящих подключений. +net.ipv4.ip_local_port_range=2000 65000 +# Разрешает временные метки протокола TCP. Их наличие позволяет управлять работой протокола в условиях серьезных нагрузок. +net.ipv4.tcp_timestamps=1 +# Параметр отвечающий за алгоритмы сегментации TCP пакетов при передаче данных. +# Cubic - алгоритм для высоконагруженных систем, но более структурированный, нежели BIC. +# Включён по умолчанию в linux ядре начиная с версии 2.6.19 +# BBR - Алгоритм от Гугла, получайте максимальную скорость, если у вас широкий канал +net.ipv4.tcp_congestion_control=bbr +# Параметр определяет дисциплину обработки очередей +# FQ делят пропускную способность между всеми соединениями, даёт лучшую пропускную способность в связке с BBR +sysctl net.core.default_qdisc=fq +# Не сохранять результаты измерений TCP соединения в кеше при его закрытии +net.ipv4.tcp_no_metrics_save=1 +# Разрешаем динамическое изменение размера окна TCP стека (окно увеличивается, если не было потерь +# пакетов при передаче в рамках TCP подключения) +net.ipv4.tcp_window_scaling=1 +# Защита от TIME_WAIT атак. +net.ipv4.tcp_rfc1337=1 +# Не отвечаем на ICMP ECHO запросы, переданные на широковещательный адрес. +net.ipv4.icmp_echo_ignore_broadcasts=1 +# Не отвечаем на ошибочно сформированные сообщения. +net.ipv4.icmp_ignore_bogus_error_responses=1 +# Максимальное число открытых сокетов, ждущих соединения. +# Максимум в CentOS 7 +net.core.somaxconn=65535 diff --git a/roles/rocky9/vars/main.yml b/roles/rocky9/vars/main.yml new file mode 100644 index 0000000..a40c166 --- /dev/null +++ b/roles/rocky9/vars/main.yml @@ -0,0 +1,2 @@ +--- +ignored_interfaces: [lo, docker0, vbr0] diff --git a/roles/root-cert/files/root_ca.crt b/roles/root-cert/files/root_ca.crt new file mode 100644 index 0000000..e62dbae --- /dev/null +++ b/roles/root-cert/files/root_ca.crt @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBwzCCAWmgAwIBAgIQDeapQ/wjM1yz/QRwwRT0mTAKBggqhkjOPQQDAjBAMRow +GAYDVQQKExFjYS5sb2NhbC5tcndoby5ydTEiMCAGA1UEAxMZY2EubG9jYWwubXJ3 +aG8ucnUgUm9vdCBDQTAeFw0yNDA3MjcxNjAxNDVaFw0zNDA3MjUxNjAxNDVaMEAx +GjAYBgNVBAoTEWNhLmxvY2FsLm1yd2hvLnJ1MSIwIAYDVQQDExljYS5sb2NhbC5t +cndoby5ydSBSb290IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnC2HB5Ih +Ik8SgmL2ASqCWZlec6wYsjdM7uXQMVZgErAuBbGNyXvOXnM71QZb0NialIERZGkQ +/JH9vsocyt4fCKNFMEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8C +AQEwHQYDVR0OBBYEFFkP/3WZpLIWdD1+jsSWQiw5jfc3MAoGCCqGSM49BAMCA0gA +MEUCIQCt4C/qQvafzwA6ZRwUZ61RT4mFFQDCD+Lj7elYZ0lAQQIga4bQ2+BKP0ph +Kmj5a1Ngvep96WCg/j1jRNE/JR8mbv4= +-----END CERTIFICATE----- diff --git a/roles/root-cert/meta/main.yml b/roles/root-cert/meta/main.yml new file mode 100644 index 0000000..9f286fd --- /dev/null +++ b/roles/root-cert/meta/main.yml @@ -0,0 +1,27 @@ +galaxy_info: + author: mrwho + description: This role will install the Root CA Certificate on the target hosts + company: Gametize + + license: MIT + + min_ansible_version: 2.0 + + platforms: + - name: EL + versions: + - 6 + - 7 + - 8 + - 9 + - 10 + - name: Ubuntu + versions: + - trusty + - xenial + - bookworm + - trixie + galaxy_tags: + - ssl + +dependencies: [] diff --git a/roles/root-cert/tasks/darwin.yml b/roles/root-cert/tasks/darwin.yml new file mode 100644 index 0000000..8840c0f --- /dev/null +++ b/roles/root-cert/tasks/darwin.yml @@ -0,0 +1,26 @@ +--- +- set_fact: + install_root_cert_tmp_path: "{{ install_root_cert_tmp_folder }}/{{ install_root_cert_pem | basename }}" + +- block: + - name: Copy certificate to temporary location + copy: + src: "{{ install_root_cert_pem }}" + dest: "{{ install_root_cert_tmp_path }}" + + - name: Add certificate to Mac OS keychain + command: security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" "{{ install_root_cert_tmp_path }}" + + # - name: Add certificate to Mac OS (openssl) + # copy: + # src: "{{ install_root_cert_pem }}" + # dest: "/usr/local/etc/openssl/certs/{{ install_root_cert_pem | basename }}" + # owner: root + # group: wheel + # mode: "0644" + + always: + - name: Remove temporary certificate + file: + path: "{{ install_root_cert_tmp_path }}" + state: absent diff --git a/roles/root-cert/tasks/debian.yml b/roles/root-cert/tasks/debian.yml new file mode 100644 index 0000000..c97ceef --- /dev/null +++ b/roles/root-cert/tasks/debian.yml @@ -0,0 +1,16 @@ +--- +- name: Make sure the folder exists (Debian, Ubuntu) + file: + path: /usr/local/share/ca-certificates + state: directory + +# Note that the .crt is actually a .pem renamed +- name: Copy the certificate (Debian, Ubuntu) + copy: + src: "{{ install_root_cert_pem }}" + dest: "/usr/local/share/ca-certificates/{{ install_root_cert_pem | basename }}.crt" + register: result + +- name: Update CA Trust (Debian, Ubuntu) + command: update-ca-certificates + when: result is changed diff --git a/roles/root-cert/tasks/main.yml b/roles/root-cert/tasks/main.yml new file mode 100644 index 0000000..ba93b76 --- /dev/null +++ b/roles/root-cert/tasks/main.yml @@ -0,0 +1,15 @@ +--- +#- name: Check that the root certificate exists +# become: no +# local_action: "stat path={{ install_root_cert_pem }}" +# register: result +# failed_when: not result.stat.exists + +- include: debian.yml + when: ansible_os_family == "Debian" + +- include: red_hat.yml + when: ansible_os_family == "RedHat" + +- include: darwin.yml + when: ansible_os_family == "Darwin" diff --git a/roles/root-cert/tasks/red_hat.yml b/roles/root-cert/tasks/red_hat.yml new file mode 100644 index 0000000..a7e7f70 --- /dev/null +++ b/roles/root-cert/tasks/red_hat.yml @@ -0,0 +1,21 @@ +--- +- name: Make sure the folder exists (Red Hat) + file: + path: /etc/pki/ca-trust/source/anchors + state: directory + +- name: Copy PEM into folder (Red Hat) + copy: + src: "{{ install_root_cert_pem }}" + dest: "/etc/pki/ca-trust/source/anchors/{{ install_root_cert_pem | basename }}" + register: result + +- name: Update CA Trust (Red Hat) + command: update-ca-trust + when: result is changed + +- name: Update CA Trust (Red Hat < 7) + command: update-ca-trust enable + when: + - result is changed + - ansible_distribution_version|int < 7 diff --git a/roles/root-cert/templates/server.py b/roles/root-cert/templates/server.py new file mode 100644 index 0000000..e5e40c8 --- /dev/null +++ b/roles/root-cert/templates/server.py @@ -0,0 +1,6 @@ +import BaseHTTPServer, SimpleHTTPServer +import ssl + +httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 443), SimpleHTTPServer.SimpleHTTPRequestHandler) +httpd.socket = ssl.wrap_socket (httpd.socket, certfile='{{ certfile_pem }}', server_side=True) +httpd.serve_forever() diff --git a/roles/root-cert/tests/.gitlab-ci.yml b/roles/root-cert/tests/.gitlab-ci.yml new file mode 100644 index 0000000..7ba37b5 --- /dev/null +++ b/roles/root-cert/tests/.gitlab-ci.yml @@ -0,0 +1,105 @@ +### Environments + +test_centos7: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-centos7-ansible:latest + DOCKER_INIT: /usr/lib/systemd/systemd + DOCKER_RUN_OPTS: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + DOCKER_NAME: "gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF" + PLAYBOOK_EXTRA_VARS: "" + +test_centos6: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-centos6-ansible:latest + DOCKER_INIT: /sbin/init + DOCKER_RUN_OPTS: "" + DOCKER_NAME: "gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF" + PLAYBOOK_EXTRA_VARS: "" + +test_ubuntu1604: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-ubuntu1604-ansible:latest + DOCKER_INIT: /lib/systemd/systemd + DOCKER_RUN_OPTS: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + DOCKER_NAME: "gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF" + PLAYBOOK_EXTRA_VARS: "" + +test_ubuntu1404: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-ubuntu1404-ansible:latest + DOCKER_INIT: /sbin/init + DOCKER_RUN_OPTS: "" + DOCKER_NAME: gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF + PLAYBOOK_EXTRA_VARS: "" + +test_centos7_system_pip: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-centos7-ansible:latest + DOCKER_INIT: /usr/lib/systemd/systemd + DOCKER_RUN_OPTS: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + DOCKER_NAME: gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF + PLAYBOOK_EXTRA_VARS: --extra-vars "aws_sdk_pip_use_package_manager=true" + +test_centos6_system_pip: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-centos6-ansible:latest + DOCKER_INIT: /sbin/init + DOCKER_RUN_OPTS: "" + DOCKER_NAME: gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF + PLAYBOOK_EXTRA_VARS: --extra-vars "aws_sdk_pip_use_package_manager=true" + +test_ubuntu1604_system_pip: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-ubuntu1604-ansible:latest + DOCKER_INIT: /lib/systemd/systemd + DOCKER_RUN_OPTS: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + DOCKER_NAME: gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF + PLAYBOOK_EXTRA_VARS: --extra-vars "aws_sdk_pip_use_package_manager=true" + +test_ubuntu1404_system_pip: + <<: *test_definition + variables: + DOCKER_IMAGE: geerlingguy/docker-ubuntu1404-ansible:latest + DOCKER_INIT: /sbin/init + DOCKER_RUN_OPTS: "" + DOCKER_NAME: gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF + PLAYBOOK_EXTRA_VARS: --extra-vars "aws_sdk_pip_use_package_manager=true" + +### Test template + +.test_template: &test_definition + variables: + - DOCKER_NAME: "gitlab-ci-$CI_BUILD_ID-$CI_BUILD_REF" + before_script: + - docker pull $DOCKER_IMAGE + script: + - docker run --detach --volume="${PWD}":/etc/ansible/roles/role_under_test:ro --name $DOCKER_NAME $DOCKER_RUN_OPTS $DOCKER_IMAGE $DOCKER_INIT + # Ansible sytax check + - docker exec $DOCKER_NAME ansible-playbook $PLAYBOOK_EXTRA_VARS /etc/ansible/roles/role_under_test/tests/test.yml --syntax-check + # Test role + - docker exec $DOCKER_NAME ansible-playbook $PLAYBOOK_EXTRA_VARS /etc/ansible/roles/role_under_test/tests/test.yml + # Test role idempotence + - idempotence=$(mktemp) + - docker exec $DOCKER_NAME ansible-playbook $PLAYBOOK_EXTRA_VARS /etc/ansible/roles/role_under_test/tests/test.yml | tee -a ${idempotence} + - > + tail ${idempotence} + | grep -q 'changed=0.*failed=0' + && (echo 'Idempotence test: pass' && exit 0) + || (echo 'Idempotence test: fail' && exit 1) + # Test role + - docker exec $DOCKER_NAME sh -c 'echo import boto3 > test.py && python test.py' + after_script: + - docker kill $DOCKER_NAME + - docker rm $DOCKER_NAME + +### Stages/ Jobs Section + +stages: + - test diff --git a/roles/root-cert/tests/files/localhost.pem b/roles/root-cert/tests/files/localhost.pem new file mode 100644 index 0000000..f324be9 --- /dev/null +++ b/roles/root-cert/tests/files/localhost.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIICjjCCAfcCCQDEUcxgOWKv1DANBgkqhkiG9w0BAQsFADCBjTELMAkGA1UEBhMC +U0cxEjAQBgNVBAgTCVNpbmdhcG9yZTESMBAGA1UEBxMJU2luZ2Fwb3JlMRQwEgYD +VQQKEwtFeGFtcGxlIEluYzEqMCgGA1UECxMhRXhhbXBsZSBJbmMgQ2VydGlmaWNh +dGUgQXV0aG9yaXR5MRQwEgYDVQQDEwtleGFtcGxlLmNvbTAeFw0xNjEyMjAwODQy +MDFaFw0xOTEwMTAwODQyMDFaMIGIMQswCQYDVQQGEwJTRzESMBAGA1UECBMJU2lu +Z2Fwb3JlMRIwEAYDVQQHEwlTaW5nYXBvcmUxFDASBgNVBAoTC0V4YW1wbGUgSW5j +MScwJQYDVQQLEx5FeGFtcGxlIEluYyBUZXN0aW5nIERlcGFydG1lbnQxEjAQBgNV +BAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwC6+t0FO +Q6TLsFnihFemVh7fkezoL3Mnyjbr5Z83f+T9y7GO0CHtHWU9gFEufnztLwiKM7iB +TZob4CReOIFZC+sd790ScWeSwc319FQ9ZVVdOyRD4FYZ8nU5+t6iiY/Cg9PUCHYy +eyahySlBYIcoR1DvtmnUAi0Bd0DPgAppoW8CAwEAATANBgkqhkiG9w0BAQsFAAOB +gQDqcOoCmkori7CXraHt8Tsy2CS9LsJBAHXxqAIQp9Bz5LHprgN2j9pvpnlzVBp5 +ASMsUqLcgHlt3dtPCCkLL9quJLw2VvB3PI9WFWhY2qu/qsgVaZvxYe2jto/6M6oz +Vj5rtJgauo82gX9COafluiJqbBuJQsPRjUXZkUDUoMjIUA== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDALr63QU5DpMuwWeKEV6ZWHt+R7OgvcyfKNuvlnzd/5P3LsY7Q +Ie0dZT2AUS5+fO0vCIozuIFNmhvgJF44gVkL6x3v3RJxZ5LBzfX0VD1lVV07JEPg +VhnydTn63qKJj8KD09QIdjJ7JqHJKUFghyhHUO+2adQCLQF3QM+ACmmhbwIDAQAB +AoGBAIP1lO6v4NWBqnsEvQyyQnyP5mOEkElEgOXQoFmi4bDnw3zCBpXTNcUhZwFc +vNgNX68T5hFtdxuZ3doiHrAd4M2jaVh1AWNau3KJLRCer56s6XKkQGEUGhRKbvjj +mSRHgERZzIZWkn5cs4Itt7nDfN1GTB5Wy87PRL+OH/Zs8syBAkEA+jZ6Kyc6TgkQ +SB/QJg8OTRpaYzSuqNkjqjofWBhOzsi1gAxH4tdhpAmWl1zkK4n0sck+ZCX2nK6P +MbdmT/v3BwJBAMSgqv91kSSO8Vk85SvzGXm4QO6k8Nfss3XrrVzXGTVeC4coR9En +vCvinVT84fdGNXoBWdTs3TdIrFUAf/a5QFkCQDc+q/63LJJqQeQK0iR1Eo1Hkklx +KlcxikRdjOogg9X4Tsq063JUZ8SWMV++LMrILPTMIDBwiWDS0d8CRV7HnSUCQEdU +vhQEs43eqWGlPMIv47sLg8rPXWwHu6b4w6Cdi9CXeHkkvMD8uD/3avos71DEUJwd +J1ieQTZQD+yaTNHVrKkCQBNDOqKjIYGLJPbYCC+cOwcSmHTlOcT+tzVgTa1suGSt +dbAZ7O7PQLCCH0YSPIJvfH5/1L7TtN6ZXDvUPGUjnas= +-----END RSA PRIVATE KEY----- diff --git a/roles/root-cert/tests/files/py-httpd.py b/roles/root-cert/tests/files/py-httpd.py new file mode 100644 index 0000000..7294268 --- /dev/null +++ b/roles/root-cert/tests/files/py-httpd.py @@ -0,0 +1,13 @@ +# A simple script will that will serve files thru HTTPS, +# based on the directory which it's run from. + +import BaseHTTPServer, SimpleHTTPServer +import ssl +import os + +dir = os.path.dirname(__file__) +filename = os.path.join(dir, 'localhost.pem') + +httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 443), SimpleHTTPServer.SimpleHTTPRequestHandler) +httpd.socket = ssl.wrap_socket (httpd.socket, certfile=filename, server_side=True) +httpd.serve_forever() diff --git a/roles/root-cert/tests/files/root_ca.pem b/roles/root-cert/tests/files/root_ca.pem new file mode 100644 index 0000000..ac7ac94 --- /dev/null +++ b/roles/root-cert/tests/files/root_ca.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDkDCCAvmgAwIBAgIJAMPuDvEyWkWBMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD +VQQGEwJTRzESMBAGA1UECBMJU2luZ2Fwb3JlMRIwEAYDVQQHEwlTaW5nYXBvcmUx +FDASBgNVBAoTC0V4YW1wbGUgSW5jMSowKAYDVQQLEyFFeGFtcGxlIEluYyBDZXJ0 +aWZpY2F0ZSBBdXRob3JpdHkxFDASBgNVBAMTC2V4YW1wbGUuY29tMB4XDTE2MTIy +MDA4NDEzOVoXDTE5MTAxMDA4NDEzOVowgY0xCzAJBgNVBAYTAlNHMRIwEAYDVQQI +EwlTaW5nYXBvcmUxEjAQBgNVBAcTCVNpbmdhcG9yZTEUMBIGA1UEChMLRXhhbXBs +ZSBJbmMxKjAoBgNVBAsTIUV4YW1wbGUgSW5jIENlcnRpZmljYXRlIEF1dGhvcml0 +eTEUMBIGA1UEAxMLZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ +AoGBAPX9HdMy6ACFzuFex3HrILoTUHEymHaMRz711kqxivMPh4D5QDODMTCNHS7K +qPfoQIv4Ci0LioHNogeXOSp7mMorM+9IBlUEuA3m5k6+i9tHFbfUa0Nw50SzpiD3 +hLY5HFd3PcmMgHgtaw1TFOHm+3ksOMW7cnn7R/lo2LNxfR5XAgMBAAGjgfUwgfIw +HQYDVR0OBBYEFGB5QV3mg/Rxq4o8EA2rnfMpQtLDMIHCBgNVHSMEgbowgbeAFGB5 +QV3mg/Rxq4o8EA2rnfMpQtLDoYGTpIGQMIGNMQswCQYDVQQGEwJTRzESMBAGA1UE +CBMJU2luZ2Fwb3JlMRIwEAYDVQQHEwlTaW5nYXBvcmUxFDASBgNVBAoTC0V4YW1w +bGUgSW5jMSowKAYDVQQLEyFFeGFtcGxlIEluYyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxFDASBgNVBAMTC2V4YW1wbGUuY29tggkAw+4O8TJaRYEwDAYDVR0TBAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOBgQDPkWryqf6tBKXJudIEu3h1nehv7XCCcSH9Fr/I +dME8bwYrMiqGZfmjeaZf8S0eHd8a3scDo5D5NiLZh9va2POkDejBh/MDUQpDx06V +9XMCAa7aAFzvuoPyzCO1N95buhaVANLUkjVSTaPkTkZrsnE65Ot6KbClT4DxZvLE +dhqjnQ== +-----END CERTIFICATE----- diff --git a/roles/root-cert/tests/localhost b/roles/root-cert/tests/localhost new file mode 100644 index 0000000..03cac36 --- /dev/null +++ b/roles/root-cert/tests/localhost @@ -0,0 +1 @@ +localhost ansible_connection=local diff --git a/roles/root-cert/tests/test.yml b/roles/root-cert/tests/test.yml new file mode 100644 index 0000000..9c907b8 --- /dev/null +++ b/roles/root-cert/tests/test.yml @@ -0,0 +1,7 @@ +--- +- hosts: all + become: yes + vars: + install_root_cert_pem: files/root_ca.pem + roles: + - role_under_test diff --git a/roles/root-cert/tests/test_vagrant.yml b/roles/root-cert/tests/test_vagrant.yml new file mode 100644 index 0000000..cef4430 --- /dev/null +++ b/roles/root-cert/tests/test_vagrant.yml @@ -0,0 +1,48 @@ +--- +- hosts: all + become: yes + vars: + install_root_cert_pem: files/testing_root_cert.pem + + #roles: + # - install-root-cert + + tasks: + - name: Copy SSL certificate + become: yes + copy: + src: "files/{{ ansible_fqdn }}.pem" + dest: "/opt/{{ ansible_fqdn }}.pem" + owner: root + mode: 0600 + + - name: Copy server.py + become: yes + template: + src: files/py-httpd.py.j2 + dest: /opt/py-httpd.py + owner: root + mode: 755 + + - name: Copy systemd script for py-httpd.py + become: yes + copy: + src: files/py-httpd.service + dest: /etc/systemd/system/py-httpd.service + owner: root + mode: 0755 + + - name: Reload systemd + become: yes + command: systemctl daemon-reload + + - name: Start py-httpd.service + become: yes + service: + name: py-httpd + state: started + enabled: yes + + - get_url: + url: "https://{{ ansible_fqdn }}" + dest: . diff --git a/roles/root-cert/tests/test_with_webserver.yml b/roles/root-cert/tests/test_with_webserver.yml new file mode 100644 index 0000000..f55e4eb --- /dev/null +++ b/roles/root-cert/tests/test_with_webserver.yml @@ -0,0 +1,26 @@ +--- +- hosts: all + become: yes + tasks: + - name: Install curl (Debian) + apt: + name: curl + state: present + update_cache: yes + cache_valid_time: 3600 + when: ansible_os_family == 'Debian' + + - name: Install curl (RedHat) + yum: + name: curl + state: present + when: ansible_os_family == 'RedHat' + + - name: Copy server script and certificate + copy: + src: "{{ item }}" + dest: /opt/ + mode: 0600 + with_items: + - files/localhost.pem + - files/py-httpd.py diff --git a/roles/root-cert/vars/main.yml b/roles/root-cert/vars/main.yml new file mode 100644 index 0000000..7943137 --- /dev/null +++ b/roles/root-cert/vars/main.yml @@ -0,0 +1,2 @@ +--- +install_root_cert_tmp_folder: /tmp