我有一个在节点上启用防火墙的类(在 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 时。我得到:
警告:无法实例化配置:在 /etc/puppet/manifests/classes/openssh.pp:19 找不到 Exec[allow-openssh] 的依赖包 [ufw];使用缓存目录
有没有办法要求一个资源,以便它首先执行,但如果它不存在,只需将当前资源全部删除?
我会在同一个清单中做一个单独的类:
当 ssh 和 ufw 都存在时,您将包含它,或者总是包含它,当 ufw 不存在但离开工作时它应该会停止
class openssh
工作。