Это - проблема обзора. Из учебного руководства по языку:
Классы, компоненты и узлы представляют новый объем. Марионетка в настоящее время динамично ограничена по объему, что означает, что иерархии объема создаются на основе того, где код оценен вместо того, где код определяется.
Так $myfwrules
ограничен по объему в класс, в котором это определяется. В Вашем случае Вы определяете объем его в класс webappfoo
, где это не знает о любом ранее определенном $myfwrules
. Вы можете bodge вокруг этого, но лучший подход мог бы быть должен использовать определения. Что-то вроде этого (непротестированный, YMMV, и т.д.):
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
}
Таким образом, у Вас есть допускающий повторное использование способ добавить правила в Ваши классы, не будучи должен определить переменные и беспокойство об объеме. Вы закончите с набором Exec
ресурсы (Exec["rule-webappfoo"]
, Exec["rule-postfix"]
) представление узла foo
ruleset.
Также посмотрите готово испеченные iptables модули.
Править: это - просто пример, чтобы продемонстрировать, как могли бы использоваться определения. Это не предназначено, чтобы быть решением без проблем. Для запуска существуют проблемы вокруг порядка, в котором правила могли бы быть применены (мог использовать before
/after
, возможно), и эффективность вызова /sbin/iptables
каждый раз.
Я не касался марионетки в течение некоторого времени, таким образом, мой синтаксис может быть немного ржавым. Должен "+>" быть "+ ="? Так или иначе Вы попробовали это?
class webappfoo { include apache } class webappfoo::myfwrules { $webappfoo_myfwrules = [ "-A INPUT -p tcp --state NEW -m tcp --dport 80 -j ACCEPT" ] } node webappserver { include iptables $webapplist = ["webappfoo", "webappbar" ] $webappserver_myfwrules => $iptables::iptables_myfwrules $webappserver_myfwrules += $webapplist ? { webappfoo => $webappfoo::myfwrules::webappfoo_myfwrules, webappbar => $webappbar::myfwrules::webappfoo_myfwrules, } }
Этот iptables модуль, кажется, единственный способ сделать то, что я хочу; это - в основном сценарий, который берет файлы в iptables.d/каталоге и создает/etc/sysconfig/iptables из него. Это, вероятно, что я собираюсь использовать; но я чувствую, что этот вид шаблона должен быть возможным в Марионетке самого.
Я решил использовать шаблоны и несколько конкатенация для создания правил iptables. например.
define iptables::rules {
file { "$local_rules_file":
ensure => "file",
content => template($iptables_start, "iptables/iptables.$name.erb", $iptables_stop)
}
}
Это не симпатично, и это требует специализированного iptables.hostname.erb файла для каждого компьютера. Но это глупо простой.
Также читайте на конфигурациях хранилища Марионетки, и несколько регистрируют конкатенацию.