Хотя я пытаюсь описать мой сервер в Ansible, мне очень нравится идея сформировать правила брандмауэра, чтобы включить только порты / протоколы, которые используются в группах хост / хост.
Представьте, что у меня есть брандмауэр на базе Linux, а за ним - веб-сервер, сервер mysql и ящик openvpn. Когда я настраиваю веб-сервер, я применяю к нему некоторые роли (http / https, ntp и т.д.), и я хотел бы добавить требуемые порты / протоколы в определение iptables окна брандмауэра. И если позже я отключу ntp, я бы хотел отключить связанные с ntp строки в iptables для этого поля.
Идея состоит в том, чтобы настроить брандмауэр, подключенный к включенным службам на ящиках за брандмауэром.
Итак, вопрос: можно ли сделать это красиво и элегантно?
Я почти всегда создаю свои собственные роли для развертывания служб и обычно помещаю правила брандмауэра для этих служб непосредственно в роль.
Вот пример для nginx:
В roles/nginx/tasks/firewall.yml
:
- name: Open ports with system-config-securitylevel
command: "lokkit -q -p {{item}}:tcp"
with_items: "{{nginx_firewall_open_services}}"
when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 5
tags: firewall
- name: Open ports with system-config-firewall
command: "lokkit -s {{item}}"
with_items: "{{nginx_firewall_open_services}}"
when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int == 6
tags: firewall
- name: Open ports with firewalld
firewalld: "service={{item}} permanent=true immediate=true state=enabled"
with_items: "{{nginx_firewall_open_services}}"
when: ansible_os_family == 'RedHat' and ansible_distribution_major_version|int >= 7
tags: firewall
В roles/nginx/defaults/main.yml
:
nginx_firewall_open_ports: [80, 443]
nginx_firewall_open_services: ["http", "https"]
Ты можешь использовать в when
заявление. Определите переменную, которая указывает, должна ли служба быть включена или нет, позже проверьте эту переменную в задаче.
Пример:
vars:
enable_ntpd: yes
tasks:
- name: enable ntpd service
service:
name: ntpd
enabled: yes
state: started
when: enable_ntpd
- name: disable ntpd service
service:
name: ntpd
enabled: no
state: stopped
when: not enable_ntpd
- name: enable firewall for ntpd
iptables:
chain: INPUT
protocol: udp
destination_port: 123
jump: ACCEPT
when: enable_ntpd
- name: disable firewall for ntpd
iptables:
chain: INPUT
protocol: udp
destination_port: 123
jump: DROP
when: not enable_ntpd
Примечание: я не очень хорошо знаком с модулем ansibles iptables, это может быть не лучший способ, но вы должны понять