web-dev-qa-db-ja.com

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]の依存関係Package [ufw]が見つかりませんでした。キャッシュされたカタログを使用する

最初にexecutedになるようにリソースを要求する方法はありますが、存在しない場合は、現在のリソースをすべてまとめて削除しますか?

4
pupeno

同じマニフェストで別のクラスを実行します:

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が機能している場合は失敗するはずです。

4
mat