如何通过Puppet配置Ubuntu UFW



我是Puppet的新手,我在运行Puppet Agent的一个主机的Puppet Config中遇到了一些问题。我们在所有系统上都使用Ubuntu 20.04和Puppet CE 7.12.1。

在我们的Puppet服务器(主机名:puppet(上,我正试图为我们的主机eb-web(运行Puppet Agent(编写Puppet配置。我想配置UFW(非复杂防火墙((https://help.ubuntu.com/community/UFW)在eb-web上使用木偶模块kogitoapp/ufw1.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': }
}

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

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


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

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吗?

此层次结构数据。。。

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

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

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

Hiera最突出的用途是为类(而不是资源(参数提供数据,一些类使用它来支持间接资源声明。您通常将表示一个或多个资源的数据放入类参数中,然后声明该类会导致它声明所描述的资源。您正在使用的ufw类通过其参数rules(注意拼写(提供了此选项,该参数要求数据采用哈希的形式,在外部级别具有资源名称键,在内部级别具有ufw_rule资源的资源名称/值映射。如果你想利用它,那么数据的结构应该是这样的:

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

当然,您也可以直接在类声明中分配参数值,正如您的另一个答案所示,但这需要使用类似资源的类声明。应尽可能避免类似资源的类声明。声明类时,首选includerequirecontain

第一件事是看看Puppet锻造厂的例子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',
},
}
}
}

花了一段时间试图解决这个问题,并回到第四个问题,解释为什么这个问题不起作用。我终于对我在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'

最新更新