Назад | Перейти на главную страницу

Межузловые модули / манифесты (?) С марионеткой: как этого добиться?

Я "играл" (ну, на самом деле детская игра) с марионеткой в ​​течение нескольких недель и не могу понять, как реализовать модуль, имя которого является клиентом; этот модуль будет вызываться как таковой:

client { "client-name":
    "apache-node" => "name-of-apache-node",
    "tomcat-node" => "name-of-tomcat-node",
    "https" => true,
    # probably other parameters, and other nodes may be implied as well
}

и это затем автоматически сгенерирует конфигурацию для всех соответствующих узлов и распространять конфигурацию.

Примечание: я НЕ хочу использовать внешние источники (LDAP или другие), просто марионетку: у меня достаточно трудностей с одной марионеткой, и я буду рассматривать это только тогда, когда у меня будет достаточно мастерства (сделайте это несколько месяцев, вероятно ...) .

Примечание 2: марионетка - это версия 2.6.12, фактер - версия 1.5.9.

Возможно ли это, или это несбыточная мечта?

Конечно, это должно работать.

Во-первых, вам нужно либо включить его где-нибудь, чтобы он применялся к обоим узлам, а затем отфильтровать конфигурацию, которая должна применяться к разным узлам (возможно, с большим case оператор), или иметь разные классы для стороны приложения tomcat и стороны apache (это, вероятно, было бы чище).

Вот подход, который я бы выбрал:

Настройте мультиклассовый модуль для своего клиентского приложения:

modules
 -> client-app
     -> manifests
         -> apache.pp
         -> tomcat.pp

Настройте эти классы с нужной конфигурацией:

class client-app::apache ($tomcatnodes = undef, $https = true) {
    package { 'apache2':
        ensure => present,
    }
    # ... etc etc
    # use a template file that utilizes the $tomcatnodes and $https
    # variables to set the config that you need
}

Затем прикрепите их к своим узлам:

node tomcatserver1 {
    class { 'client-app::tomcat':
        apachenode = 'apacheserver',
        https = true,
    }
}
node tomcatserver2 {
    class { 'client-app::tomcat':
        apachenode = 'apacheserver',
        https = true,
    }
}
node apacheserver {
    class { 'client-app::apache':
        tomcatnodes = [ 'tomcatserver1', 'tomcatserver2' ],
        https = true,
    }
}

Некоторые дополнительные материалы по этой реализации: см. Вот и Вот.