initial commit

This commit is contained in:
mrwho 2026-05-11 15:54:07 +03:00
parent 13a28dda88
commit 90e35a58f0
47 changed files with 1436 additions and 0 deletions

3
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"python-envs.defaultEnvManager": "ms-python.python:system"
}

View file

@ -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/<group>/vars.yml or host_vars/<host>/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/<os_group>/vars.yml or host_vars/<host>/vars.yml
# to restrict access on specific servers.
users_allowed_admin_groups:
- super_admin
- middle_admin
- junior_admin

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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"

13
inventory/prod/hosts.yml Normal file
View file

@ -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

14
playbooks/rocky9.yml Normal file
View file

@ -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

View file

@ -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

View file

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 }}"

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -0,0 +1,5 @@
[Match]
MACAddress={{ ansible_default_ipv4.macaddress }}
[Link]
Name=eth0

View file

@ -0,0 +1,3 @@
#limit for using memory
vm.overcommit_ratio = 100
vm.overcommit_memory = 2

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1 @@
PermitRootLogin no

View file

@ -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\]]\\$ "

View file

@ -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

View file

@ -0,0 +1,2 @@
---
ignored_interfaces: [lo, docker0, vbr0]

View file

@ -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-----

View file

@ -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: []

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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()

View file

@ -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

View file

@ -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-----

View file

@ -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()

View file

@ -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-----

View file

@ -0,0 +1 @@
localhost ansible_connection=local

View file

@ -0,0 +1,7 @@
---
- hosts: all
become: yes
vars:
install_root_cert_pem: files/root_ca.pem
roles:
- role_under_test

View file

@ -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: .

View file

@ -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

View file

@ -0,0 +1,2 @@
---
install_root_cert_tmp_folder: /tmp