Ansible ufw module ОШИБКА: не удалось найти профиль, соответствующий 'xxxxx'

Я работаю над настройкой правил UFW через Ansible. Я могу установить его, запустить и отрицать все. Затем я пытаюсь разрешить соединения из http, https и ssh. Все попытки добавить разрешение для этих элементов встречаются с ошибками, которые выглядят следующим образом:

failed: [lempy1] (item={u'service': u'http'}) => {"failed": true, "item": {"service": "http"}, "msg": "ERROR: Could not find a profile matching 'http'\n"}
failed: [lempy1] (item={u'service': u'https'}) => {"failed": true, "item": {"service": "https"}, "msg": "ERROR: Could not find a profile matching 'https'\n"}
failed: [lempy1] (item={u'service': u'ssh'}) => {"failed": true, "item": {"service": "ssh"}, "msg": "ERROR: Could not find a profile matching 'ssh'\n"}

Вся роль выглядит так:

Задачи /main.yml

     ---
    - name: Install ufw
      apt: name=ufw state=present
      tags:
        - security

    - name: Allow webservery things
      ufw:
        rule: allow
        name: '{{item.service}}'
      with_items:
        - service: http
        - service: https
        - service: ssh
      tags:
        - security

    - name: Start ufw
      ufw: state=enabled policy=deny
      tags:
        - security

Есть идеи, почему я не смогу разрешить эти услуги? Я могу добавить службы правильно, когда ssh'ing на сервер и работает sudo ufw allow http, так далее.

1 ответ

Решение

Как упомянуто в документации модуля ufw, параметр name (или app) использует приложения, зарегистрированные в /etc/ufw/applications.d которые имеют формат INI и выглядят примерно так:

[CUPS]
title=Common UNIX Printing System server
description=CUPS is a printing system with support for IPP, samba, lpd, and other protocols.
ports=631

Обычно вы можете использовать ufw allow application-profile чтобы разрешить приложение, определенное либо в /etc/ufw/applications.d или же /etc/services открыть iptables для вещей, которые не обязательно определены в /etc/ufw/applications.d,

К сожалению, модуль ufw Ansible вместо этого создает команду ufw в следующем формате:

/usr/sbin/ufw allow from any to any app 'application-profile'

Который использует только /etc/ufw/applications.d список и не буду читать /etc/services,

В вашем случае вы можете просто указать порты, так как они хорошо известны, потенциально используя именованную переменную для дальнейшего объяснения вашего Ansible кода:

- name: Allow webservery things
  ufw:
    rule: allow
    port: '{{ item }}'
  with_items:
    - '{{ http_port }}'
    - '{{ https_port }}'
    - '{{ ssh_port }}'
  tags:
    - security

А затем определите переменные где-нибудь (например, по умолчанию для вашей роли):

http_port: 80
https_port: 443
ssh_port: 22

Кроме того, вы можете заметить, что я упростила ваш список словарей одним ключом в более простой прямой список, который немного упростит вашу задачу.

В качестве альтернативы вы можете легко шаблонизировать профили приложений, используя шаблонный модуль Ansible.

Другие вопросы по тегам