只有在Puppet中存在资源时才需要

我有一个在节点上启用防火墙的类(在Ubuntu中使用ufw):

class ufw { package { ["ufw"]: ensure => latest } exec { "enable-firewall": command => "/usr/bin/yes | /usr/sbin/ufw enable", unless => "/usr/sbin/ufw status | grep \"Status: active\"", require => [Package["ufw"]] } } 

这工作正常。 在包含该类的节点上,启用防火墙。

然后我有另一个课程,用于启用OpenSSH:

 class openssh { package { "openssh-server": ensure => latest } service { ssh: enable => true, ensure => running, require => [Package["openssh-server"]] } exec { "allow-openssh": command => "/usr/sbin/ufw allow OpenSSH", unless => "/usr/sbin/ufw status | grep \"OpenSSH.*ALLOW.*Anywhere\\|Status: inactive\"", require => [Package["ufw"], Exec["enable-firewall"]] } } 

正如你所看到的,它不仅启用了OpenSSH,而且为它打开了防火墙。 问题是当在没有防火墙的服务器中使用OpenSSH时。 在那里我得到:

警告:configuration无法实例化:在/etc/puppet/manifests/classes/openssh.pp:19找不到Exec [allow-openssh]的依赖包[ufw] 使用caching的目录

有没有办法需要一个资源,以便它首先执行 ,但如果它不存在,只需要将当前的资源放在一起?

我会在同一个清单中做一个单独的类:

 class openssh::ufw { exec { "allow-openssh": command => "/usr/sbin/ufw allow OpenSSH", unless => "/usr/sbin/ufw status | grep \"OpenSSH.*ALLOW.*Anywhere\\|Status: inactive\"", require => [Package["ufw"], Exec["enable-firewall"], Package["openssh-server"], Service["ssh"]] } } 

你可以在ssh和ufw都存在的情况下包含它,或者在ufw不在的时候它应该是bork,但是让这个class openssh继续工作。