Марионетка: совместное использование информации между классами

function s()
{
    screen -t "$@" /usr/bin/ssh "$@"
}

Соединитесь с хостом на новой экранной вкладке с именем устройства как заголовок вкладки.

1
задан 22 August 2009 в 11:07
4 ответа

Это - проблема обзора. Из учебного руководства по языку:

Классы, компоненты и узлы представляют новый объем. Марионетка в настоящее время динамично ограничена по объему, что означает, что иерархии объема создаются на основе того, где код оценен вместо того, где код определяется.

Так $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"]) представление узла fooruleset.

Также посмотрите готово испеченные iptables модули.

Править: это - просто пример, чтобы продемонстрировать, как могли бы использоваться определения. Это не предназначено, чтобы быть решением без проблем. Для запуска существуют проблемы вокруг порядка, в котором правила могли бы быть применены (мог использовать before/after, возможно), и эффективность вызова /sbin/iptables каждый раз.

3
ответ дан 3 December 2019 в 18:19
  • 1
    Да, но... iptables был примером. Существуют другие случаи I' m заинтересованный. И так или иначе, я don' t хотят, чтобы Марионетка выполнила/sbin/iptables - it' s не идемпотент, в первую очередь - я хочу, чтобы это генерировало/etc/sysconfig/iptables, так, чтобы я мог принять решение запустить его, или Онтарио. –  niXar 22 August 2009 в 01:48
  • 2
    Мой ответ был примером также: ~) можно создать файлы при наличии определения, генерируют фрагменты, которые собраны другим исполнительным процессом. Это немного ужасно, но о единственном пути в данный момент; Ваша добавляющая массив мечта просто can' t быть сделанным, потому что путь обзор работает. –  markdrayton 22 August 2009 в 08:23

Я не касался марионетки в течение некоторого времени, таким образом, мой синтаксис может быть немного ржавым. Должен "+>" быть "+ ="? Так или иначе Вы попробовали это?

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,
    }
}
0
ответ дан 3 December 2019 в 18:19

Этот iptables модуль, кажется, единственный способ сделать то, что я хочу; это - в основном сценарий, который берет файлы в iptables.d/каталоге и создает/etc/sysconfig/iptables из него. Это, вероятно, что я собираюсь использовать; но я чувствую, что этот вид шаблона должен быть возможным в Марионетке самого.

0
ответ дан 3 December 2019 в 18:19

Я решил использовать шаблоны и несколько конкатенация для создания правил iptables. например.

define iptables::rules {
  file { "$local_rules_file":
    ensure  => "file",
    content => template($iptables_start, "iptables/iptables.$name.erb", $iptables_stop)
  }
}

Это не симпатично, и это требует специализированного iptables.hostname.erb файла для каждого компьютера. Но это глупо простой.

Также читайте на конфигурациях хранилища Марионетки, и несколько регистрируют конкатенацию.

1
ответ дан 3 December 2019 в 18:19
  • 1
    Да, сохраненная конфигурация является на самом деле способом пойти, it' s просто, что описание в документе было так неясно, что я никогда не понимал, как это работало. –  niXar 9 September 2009 в 12:13

Теги

Похожие вопросы