Esta é uma questão de escopo. Do tutorial de idiomas :
Classes, components, and nodes introduce a new scope. Puppet is currently dynamically scoped, which means that scope hierarchies are created based on where the code is evaluated instead of where the code is defined.
Portanto, $myfwrules
está no escopo da classe em que está definido. No seu caso, você está definindo o escopo na classe webappfoo
, onde não tem conhecimento de qualquer $myfwrules
definido anteriormente. Você pode contornar isso , mas uma abordagem melhor pode ser usar definições . Algo parecido com isto (não testado, YMMV, etc):
class iptables {
define rule($rule) {
# $title is the 'name' of the resource, like ntpd in service { "ntpd": }
exec { "rule-$title":
command => "/sbin/iptables $rule"
}
}
}
class webappfoo {
include iptables
iptables::rule { "webappfoo":
rule => "-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT"
}
}
class postfix {
include iptables
iptables::rule { "postfix":
rule => "-A INPUT -p tcp --state NEW -m tcp --dport 25 -j ACCEPT"
}
}
node foo {
include webappfoo
include postfix
}
Dessa forma, você tem uma maneira reutilizável de adicionar regras às suas classes sem precisar definir variáveis e se preocupar com o escopo. Você acabará com um monte de Exec
resources ( Exec["rule-webappfoo"]
, Exec["rule-postfix"]
) representando o conjunto de regras do nó foo
.
Veja também os módulos iptables prontos .
Editar : este é apenas um exemplo para demonstrar como as definições podem ser usadas. Não é para ser uma solução sem problemas. Para começar, há problemas em torno da ordem em que as regras podem ser aplicadas (pode usar before
/ after
, talvez) e a eficiência de chamar /sbin/iptables
todas as vezes.