Depender de um recurso somente se existir em Puppet

4

Eu tenho uma classe para habilitar o firewall nos nós (usando o ufw, no Ubuntu):

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"]]
  }
}

Isso funciona bem. Nos nós em que incluo essa classe, o firewall está ativado.

Então eu tenho outra classe, para habilitar o 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"]]
  }
}

Como você pode ver, ele não apenas ativa o OpenSSH, mas também abre o firewall para ele. O problema é quando o OpenSSH é usado em um servidor que não possui um firewall. Lá eu fico:

warning: Configuration could not be instantiated: Could not find dependency Package[ufw] for Exec[allow-openssh] at /etc/puppet/manifests/classes/openssh.pp:19; using cached catalog

Existe uma maneira de requerer um recurso para que seja executado primeiro, mas se ele não estiver presente, apenas elimine o recurso atual?

    
por pupeno 12.02.2010 / 16:24

1 resposta

4

Eu faria uma aula separada no mesmo manifesto:

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"]]
  }
}

que você incluir tanto quando ambos ssh e ufw estão lá, ou sempre e deve Bork quando ufw não está lá, mas deixando a class openssh funcionando.

    
por 13.02.2010 / 10:15