diff --git a/create-container-vlan-60.yml b/create-container-vlan-60.yml new file mode 100644 index 0000000..8a37064 --- /dev/null +++ b/create-container-vlan-60.yml @@ -0,0 +1,76 @@ +--- +- name: Деплой LXC с контролем уникальности MAC + hosts: localhost + become: yes + gather_facts: no + vars: + target_name: "default-container" + template_snap: "pool/lxc/template-debian12@snap0" + target_ds: "pool/lxc/{{ target_name }}" + base_lxc_path: "/var/lib/lxc/{{ target_name }}" + vlan_id: 60 + + tasks: + - name: 1. Валидация входных данных + fail: + msg: "Укажите имя: -e 'target_name=имя'" + when: target_name == "default-container" + + - name: 2. Генерация детерминированного MAC-адреса + # Берем первые 6 символов sha256 от имени и разбиваем по 2 символа + set_fact: + generated_mac: "00:16:3e:{{ (target_name | checksum) | truncate(6, False, '') | batch(2) | map('join') | join(':') }}" + + - name: 3. Сбор существующих MAC-адресов в системе + # Ищем строки lxc.net.0.hwaddr во всех конфигах /var/lib/lxc/*/config + shell: "grep -h 'lxc.net.0.hwaddr' /var/lib/lxc/*/config | awk '{print $3}' || true" + register: existing_macs + changed_when: false + + - name: 4. Проверка на дубликат (если это новый контейнер) + fail: + msg: "Конфликт! MAC {{ generated_mac }} уже занят другим контейнером." + # Проверяем, есть ли сгенерированный мак в списке, + # НО игнорируем проверку, если мы просто пересобираем текущий контейнер + when: + - generated_mac in existing_macs.stdout_lines + - not (ansible_check_mode or (base_lxc_path + '/config') is file) + + - name: 5. Создание ZFS клона + community.general.zfs: + name: "{{ target_ds }}" + origin: "{{ template_snap }}" + state: present + extra_zfs_properties: + mountpoint: legacy + + - name: 6. Подготовка директории + file: + path: "{{ base_lxc_path }}" + state: directory + + - name: 7. Запись конфига с фиксированным MAC + copy: + dest: "{{ base_lxc_path }}/config" + content: | + lxc.include = /usr/share/lxc/config/common.conf + lxc.arch = x86_64 + lxc.idmap = u 0 1000000 65536 + lxc.idmap = g 0 1000000 65536 + lxc.net.0.type = veth + lxc.net.0.link = br0 + lxc.net.0.flags = up + lxc.net.0.name = eth0 + lxc.net.0.veth.vlan.id = {{ vlan_id }} + lxc.net.0.hwaddr = {{ generated_mac }} + lxc.uts.name = {{ target_name }} + lxc.rootfs.path = zfs:{{ target_ds }} + + - name: 8. Запуск контейнера + community.general.lxc_container: + name: "{{ target_name }}" + state: started + + - name: Итог + debug: + msg: "Контейнер {{ target_name }} запущен с MAC: {{ generated_mac }} в VLAN {{ vlan_id }}" diff --git a/create-mail-srv-vlan-60.yml b/create-mail-srv-vlan-60.yml new file mode 100644 index 0000000..4d30864 --- /dev/null +++ b/create-mail-srv-vlan-60.yml @@ -0,0 +1,76 @@ +--- +- name: Деплой почтового LXC с примонтированным датасетом + hosts: localhost + become: yes + gather_facts: no + vars: + target_name: "bit-mail-srv" + vlan_id: 60 + # Пути ZFS + root_ds: "pool/lxc/{{ target_name }}" + mail_data_ds: "pool/bit-mail-data" + template_snap: "pool/lxc/template-debian12@snap0" + # Лимиты + root_quota: "10G" + + tasks: + - name: 1. Генерация MAC-адреса + set_fact: + generated_mac: "00:16:3e:{{ (target_name | checksum) | truncate(6, False, '') | batch(2) | map('join') | join(':') }}" + + - name: 2. Создание системного ZFS клона (rootfs) + community.general.zfs: + name: "{{ root_ds }}" + origin: "{{ template_snap }}" + state: present + extra_zfs_properties: + mountpoint: legacy + quota: "{{ root_quota }}" + + - name: 3. Подготовка датасета для почты + community.general.zfs: + name: "{{ mail_data_ds }}" + state: present + extra_zfs_properties: + mountpoint: "/{{ mail_data_ds }}" # Монтируем в корень хоста + + - name: 3.1 Права для непривилегированного контейнера (mail:8) + file: + path: "/{{ mail_data_ds }}" + owner: 1000008 + group: 1000008 + mode: '0775' + + - name: 5. Запись конфига с монтированием /var/mail + copy: + dest: "/var/lib/lxc/{{ target_name }}/config" + content: | + lxc.include = /usr/share/lxc/config/common.conf + # Настройки автозапуска + lxc.start.auto = 1 + lxc.start.delay = 5 + lxc.start.order = 10 + lxc.arch = x86_64 + lxc.idmap = u 0 1000000 65536 + lxc.idmap = g 0 1000000 65536 + lxc.net.0.type = veth + lxc.net.0.link = br0 + lxc.net.0.flags = up + lxc.net.0.name = eth0 + lxc.net.0.veth.vlan.id = {{ vlan_id }} + lxc.net.0.hwaddr = {{ generated_mac }} + lxc.uts.name = {{ target_name }} + lxc.rootfs.path = zfs:{{ root_ds }} + + # Монтирование внешнего датасета в контейнер + # синтаксис: путь_на_хосте точка_в_контейнере тип опции + lxc.mount.entry = /{{ mail_data_ds }} var/mail none bind,create=dir 0 0 + + - name: 6. Запуск контейнера + community.general.lxc_container: + name: "{{ target_name }}" + state: started + + - name: Итог + debug: + msg: "Почтовый сервер {{ target_name }} запущен. Почта в {{ mail_data_ds }} -> /var/mail" diff --git a/deploy_mail_server.yml b/deploy_mail_server.yml new file mode 100644 index 0000000..b0fca46 --- /dev/null +++ b/deploy_mail_server.yml @@ -0,0 +1,5 @@ +- name: Настройка почтового сервера внутри LXC + hosts: mail # Имя хоста из инвентаря + become: yes + roles: + - mail_server diff --git a/deploy_printer_srv.yml b/deploy_printer_srv.yml index ab69ee3..dfc7235 100644 --- a/deploy_printer_srv.yml +++ b/deploy_printer_srv.yml @@ -1,5 +1,5 @@ - name: Настройка сервера печати в LXC - hosts: all + hosts: bit-srv-prn become: yes vars: printer_name: "HP" diff --git a/roles/mail_server/handlers/main.yml b/roles/mail_server/handlers/main.yml new file mode 100644 index 0000000..e1b9e1b --- /dev/null +++ b/roles/mail_server/handlers/main.yml @@ -0,0 +1,9 @@ +--- +- name: restart_postfix + service: name=postfix state=restarted + +- name: restart_dovecot + service: name=dovecot state=restarted + +- name: restart_opendkim + service: name=opendkim state=restarted diff --git a/roles/mail_server/tasks/main.yml b/roles/mail_server/tasks/main.yml new file mode 100644 index 0000000..883cc0e --- /dev/null +++ b/roles/mail_server/tasks/main.yml @@ -0,0 +1,58 @@ +--- +- name: 1. Установка почтового стека + apt: + name: + - postfix + - postfix-ldap + - dovecot-imapd + - dovecot-lmtpd + - dovecot-ldap + - opendkim + - opendkim-tools + - postfix-policyd-spf-python + - libsasl2-modules-ldap + state: present + update_cache: yes + +- name: 1.1 Установка Rspamd и Redis + apt: + name: + - rspamd + - redis-server # Redis нужен Rspamd для кеширования и обучения + state: present + +- name: 1.2 Обеспечение работы Redis + service: + name: redis-server + state: started + enabled: yes + + + +- name: 2. Настройка прав на /var/mail (для ZFS датасета) + # Так как контейнер unprivileged (idmap), владелец на хосте должен быть 1000000 + 8 (mail) + delegate_to: localhost + file: + path: /pool/bit-mail-data + owner: 1000008 + group: 1000008 + mode: '0775' + state: directory + +- name: 3. Конфигурация Postfix (main.cf) + template: + src: postfix_main.cf.j2 + dest: /etc/postfix/main.cf + notify: restart_postfix + +- name: 4. Настройка OpenDKIM + template: + src: opendkim.conf.j2 + dest: /etc/opendkim.conf + notify: restart_opendkim + +- name: 5. Настройка Dovecot для работы с LDAP + template: + src: dovecot-ldap.conf.ext.j2 + dest: /etc/dovecot/dovecot-ldap.conf.ext + notify: restart_dovecot