仅当 Puppet 中存在资源时才依赖该资源

仅当 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 时。我得到:

警告:无法实例化配置:无法在 /etc/puppet/manifests/classes/openssh.pp:19 上找到 Exec[allow-openssh] 的依赖包 [ufw];使用缓存目录

有没有办法要求资源,以便它执行首先,但如果不存在,就把当前资源全部删除?

答案1

我将在同一个清单中做一个单独的课程:

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 不存在但仍在工作时,它应该会失效class openssh

相关内容