如何通过 Puppet 配置 Ubuntu UFW?

How do I configure Ubuntu UFW through Puppet?

我对 Puppet 很陌生,我在使用我们的一位主机 运行ning Puppet Agent 的 Puppet 配置时遇到了一些问题。 我们在所有系统上使用 Ubuntu 20.04 和 Puppet CE 7.12.1。

在我们的 Puppet 服务器(主机名:puppet)上,我正在尝试为我们的主机 eb-web(即 运行 宁一个 Puppet 代理)编写 Puppet 配置。 我想配置 UFW(简易防火墙)(https://help.ubuntu.com/community/UFW) on eb-web using the Puppet Module kogitoapp/ufw version 1.0.3 (https://forge.puppet.com/modules/kogitoapp/ufw) 以允许通过 HTTP 流量。

我们的 Puppet 服务器配置为使用 Hiera 来保存我们的事实。到目前为止,我已经创建了以下配置文件: 文件:/etc/puppetlabs/code/environments/production/hiera.yaml

version: 5
defaults:
  # The default value for "datadir" is "data" under the same directory as the hiera.yaml
  # file (this file)
hierarchy:
  - name: "Per-node data (yaml version)"
    path: "nodes/%{::trusted.certname}.yaml"
  - name: "Per-role data"
    path: "roles/%{::role}"
  - name: "Other YAML hierarchy levels"
    paths:
      - "common.yaml"

文件:/etc/puppetlabs/code/environments/production/data/common.yaml

# empty at the moment

文件: /etc/puppetlabs/code/environments/production/manifests/site.pp

node default {
  hiera_include('roles')
}

文件:/etc/puppetlabs/code/environments/production/data/nodes/eb-web.evolvedbinary.com.yaml

roles:
   - roles::www

ufw::ufw_rule:
  name: 'Allow HTTP'
  action: allow
  to_ports_app: 80
  proto: tcp

文件:/etc/puppetlabs/code/environments/production/modules/roles/manifests/www.pp

class roles::www {
    include profiles::ufw
    # include profiles::nginx
}

文件:/etc/puppetlabs/code/environments/production/modules/profiles/manifests/ufw.pp

class profiles::ufw {
  class{ '::ufw': }
}

我还通过 运行ning 在 Puppet 服务器上安装了 ufw 模块:

sudo /opt/puppetlabs/bin/puppet module install kogitoapp-ufw --version 1.0.3


如果我现在切换到 eb-web 主机并尝试通过 运行ning 请求 Puppet Agent 从 Puppet 服务器应用配置:

sudo /opt/puppetlabs/bin/puppet agent --no-daemonize --test

然后我看到以下输出,我认为这表明所有内容都已应用:

ubuntu@eb-web:~$ sudo /opt/puppetlabs/bin/puppet agent --no-daemonize --test
Info: Using environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for eb-web.evolvedbinary.com
Info: Applying configuration version '1639003464'
Notice: Applied catalog in 0.60 seconds
ubuntu@eb-web:~$ 

在此之后,如果我检查:sudo ufw status,这似乎表明 Puppet 尚未配置用于 HTTP 的端口 80:

Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)


“更新(2021 年 12 月 20 日)”

在尝试解决此问题后,我成功了,但是,我犯了一个错误并将规则添加到 ufw.pp file,这不是我想要的正确方法。在从 ufw.pp 文件中取出规则并将它们放入 eb-web.evolvedbinary.com.yaml 文件后,ufw port 80 现在被拒绝了。我尝试过使用 status: enablestatus: allow ,我也尝试过 ensure: present ,以及尝试其他我 100% 都记不住的组合,所有这些都在 eb-web.evolvedbinary.com.yaml 文件中。 ufw.pp 文件当前看起来像:

class profiles::ufw {
  class{ 'ufw':
 } 
}

eb-web.evolvedbinary.com.yaml 文件如下所示:

---
roles:
   - roles::www
ufw::rule:
  'Allow HTTP':
    action: allow
    to_ports_app: 80
    proto: tcp
include nginx:
nginx::nginx_server:
   'www.evolvedbinary.com':
   ssl: true
   www_root: '/var/www/www.evolvedbinary.com'

当我在 eb-web 主机(傀儡代理)上 运行 sudo /opt/puppetlabs/bin/puppet agent --no-daemonize --test 时,我没有看到任何错误,但是,当我 运行 sudo ufw status 我见:

Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere                   # allow_puppet
80                         REJECT      Anywhere                   # Allow HTTP
22 (v6)                    ALLOW       Anywhere (v6)              # allow_puppet
80 (v6)                    REJECT      Anywhere (v6)              # Allow HTTP

我不确定如何在 eb-web.evolvedbianry.com.yaml 文件中使用 hiera 启用端口 80。

有人可以帮我弄清楚如何使用 Puppet 配置 UFW 吗?

第一件事是查看 Puppet forge 上的示例 https://forge.puppet.com/modules/kogitoapp/ufw#basic,我可能暂时将 hiera 放在一边以使调试更容易。

尝试将其放入 /etc/puppetlabs/code/environments/production/modules/profiles/manifests/ufw.pp

class profiles::ufw {
  class {'ufw':
    rules => {
      'Allow HTTP' => {
        'action'       => 'allow',
        'to_ports_app' => 80,
        'proto         => 'tcp',
      },
    }
  }
}

这个 Hiera 数据...

ufw::ufw_rule:
  name: 'Allow HTTP'
  action: allow
  to_ports_app: 80
  proto: tcp

... 似乎是试图在您的 hiera 数据中声明模块的 ufw_rule 资源类型的实例。您不能以这种方式声明资源(并且该资源类型是名称为 ufw_rule 而不是 ufw::ufw_rule 的插件类型)。资源声明进入您的清单。例如,您可以将其放入 profiles/manifests/ufw.pp:

ufw_rule { 'Allow HTTP':
  action       => 'allow',
  to_ports_app => 80,
  proto        => 'tcp',
}

Hiera 最突出的用途是为 class(但不是资源)参数提供数据,一些 classes 使用它来支持间接资源声明。您通常将代表一个或多个资源的数据放入 class 参数中,然后声明 class 导致它声明如此描述的资源。您正在使用的 ufw class 通过其参数 rules(注意拼写)提供此选项,它期望数据以散列的散列形式出现,在外层具有资源名称键,并且ufw_rule 内层资源的资源名称/值映射。如果你想利用它,那么数据的结构应该是这样的:

ufw::rules:
  'Allow HTTP':
    action: allow
    to_ports_app: 80
    proto: tcp

当然,您也可以直接在 class 声明中分配参数值,如您的其他答案所示,但这需要使用类似资源的 class 声明。应尽可能避免类似资源的 class 声明。首选 includerequirecontain 来声明 classes.

在花了一些时间尝试解决这个问题后,又回过头来看看为什么这不起作用。我最终在 eb-web.evolvedbinary.com.yaml 中纠正了我的错误。我需要添加 include ufw 并将 ufw::rule 更改为 ufw::rules。在完成这些更改后,端口 80 现在可以正常工作了。 eb-web.evolvedbinary.com.yaml 文件现在看起来像:

---
roles:
   - roles::www
include ufw:
ufw::rules:
   'Allow HTTP':
      action: allow
      to_ports_app: 80
      proto: tcp
include nginx:
nginx::nginx_server:
   'www.evolvedbinary.com':
   ssl: true
   www_root: '/var/www/www.evolvedbinary.com'