Как использовать ansible для конфигурации Firewalld?

Как можно автоматически открывать порт в firewalld на основе последнего добавленного порта в конфигурации HaProxy? 
Я делаю автоматизацию для HaProxy, чтобы управлять конфигурацией через GitLab. Уже автоматизировал конфигурацию HaProxy - добавление в гите обновляет конфиг с автоматическим тестированием, перезагрузкой или откатом при ошибке. Теперь хочу автоматизировать открытие порта в firewalld, который добавлен в конфиг HaProxy. Как это можно реализовать?
  • 16 января 2024 г. 19:40
Ответы на вопрос 2
Для управления Firewalld в Ansible существует специальный модуль `firewalld`, который позволяет управлять правилами файервола, включая добавление/удаление портов, услуг и зон.

Допустим, вы хотите открыть определённый порт в firewalld, вы можете использовать следующую задачу в Ansible playbook:

```yaml
- name: Открыть порт в Firewalld
  ansible.posix.firewalld:
    port: "8080/tcp"
    permanent: true
    state: enabled
    immediate: true
    zone: public
```

Чтобы автоматически открывать порт в Firewalld на основе последнего добавленного порта в конфигурации HAProxy, вы должны выполнить несколько шагов:

1. Парсинг конфигурационного файла HAProxy, чтобы извлечь нужный порт.
2. Использование извлечённого значения порта в задаче Ansible для обновления Firewalld.

Для парсинга конфигурационного файла HAProxy вы можете использовать командную строку или написать скрипт на языке Python или другом, который сможет распарсить файл и найти последний добавленный порт.

В качестве конкретного примера в Ansible, можете использовать модуль `lineinfile` для поиска последнего добавленного порта в файле конфигурации и регистрации этого значения в переменную. Вот пример задачи, которая использует `shell` модуль для поиска и `set_fact` для назначения переменной:

```yaml
- name: Получить последний добавленный порт в HAProxy конфиг
  shell: "grep 'bind \*:' /etc/haproxy/haproxy.cfg | tail -1 | awk -F':' '{print $2}'"
  register: haproxy_port

- name: Установить значение извлеченного порта в переменную
  set_fact:
    new_haproxy_port: "{{ haproxy_port.stdout | regex_search('(\\d+)') | first }}"

- name: Открыть последний добавленный порт в HAProxy на Firewalld
  ansible.posix.firewalld:
    port: "{{ new_haproxy_port }}/tcp"
    permanent: true
    state: enabled
    immediate: true
    zone: public
  when: new_haproxy_port is defined and new_haproxy_port | length > 0
```

Обратите внимание, что `grep`, `tail`, и `awk` используются для извлечения номера порта из последней строки в конфигурационном файле, который содержит `bind *:`. Потом устанавливается факт в Ansible, который используется в последующих задачах для управления Firewalld.

Такой подход требует, чтобы структура вашего файла конфигурации HAProxy была довольно стандартной и под каждый уникальный случай скорее всего потребуется свой парсер.

Кроме того, вы должны убедиться, что порт, который вы добавляете, является уникальным. Если же порты могут добавляться не только в конец файла, то необходим более сложный механизм для их отслеживания, возможно, с использованием системы контроля версий (например, Git hooks) и его логов для определения недавно добавленных портов.
Не должны Ансибл волновать никакие "уже существующие порты". Всё необходимое для использования в модуле фаерволла должно быть перечислено в инвентори, а не добываться через задний проход башизмами с регулярками.
Похожие вопросы