Кукольный поток выполнения

У меня есть этот node.pp, и мне интересно, как puppet собирается его выполнить.

node 'agent.puppet.demo' {
    include ssh
    include postfix
    include mysql
    include apache
}

На узле агента, когда я запускаю это:

$ puppetd -t -d

Марионетка не выполняет его последовательно, то есть сначала не выполняет ssh, затем postfix, ...

Кто-нибудь знает, почему это так? Это потому, что он называется «декларативным языком», где порядок выполнения не имеет большого значения?

Если это так, то я могу просто определенным образом объявить, что я хочу, и puppet поймет, как это выполнить?


person Carmen    schedule 01.03.2012    source источник


Ответы (2)


Отказ от ответственности: я являюсь одним из разработчиков Puppet.

Он будет выполнять его в согласованном, но непредсказуемом порядке, за исключением любых явных или неявных зависимостей в коде. Явные зависимости — это то, что вы указываете с помощью метапараметров subscribe или require. Неявные зависимости возникают из-за функции autorequire, которая делает такие вещи, как автоматическое применение файловых ресурсов в разумном порядке.

Причина этого не столько в том, что язык является декларативным, сколько в том, что язык является декларативным, потому что порядок не имеет значения для большинства вещей в лежащей в основе проблемной области.

Например, для большинства людей на самом деле нет большой связи между управлением ssh и управлением postfix — вы можете выполнять работу в любом порядке или даже одновременно, и все будет работать одинаково.

Это освобождает нас для улучшения вещей многими способами, которых нет в «все в линейном порядке». Например, мы работаем над пакетной установкой пакетов, сохраняя при этом явные зависимости вне пакетов.

Таким образом, порядок выполнения и зависимости соответствуют основной проблеме, и мы сохранили это свойство, чтобы иметь возможность делать более удивительные вещи.

Цель именно то, что вы говорите в конце: вы заявляете, что хотите, а мы позаботимся обо всех деталях, чтобы получить это там. Со временем мы надеемся стать намного умнее в отношении логических зависимостей, так что вам придется говорить еще меньше, чтобы получить и это.

person Daniel Pittman    schedule 01.03.2012
comment
Не могли бы вы дать определение постоянному, но непредсказуемому порядку? У нас возникает много проблем, когда Puppet 2.6 просто переупорядочивает шаги и из-за некоторых отсутствующих зависимостей происходит сбой. Это невозможно проверить. Могу ли я принудительно перетасовать, чтобы мы могли проверить это должным образом? Я также слышал, что новая версия дает фиксированный порядок. - person lzap; 18.09.2012
comment
Итак, скажем, например, у меня есть пакет для установки, который зависит от наличия репозитория в yum.repos.d. Как я могу принудительно установить репозиторий до того, как он попытается установить пакет? - person Mojo; 07.02.2014

Отказ от ответственности: я все еще довольно новичок в кукольном :)

Ключ в том, чтобы думать обо всем с точки зрения зависимостей. Для зависимостей классов мне нравится использовать синтаксис Class['a'] -> Class['b']. Скажем, у вас есть класс tomcat, для которого требуется класс jdk, который загружает/устанавливает sun jdk из оракула. В вашем классе tomcat вы можете указать это с помощью

Класс ['jdk'] -> Класс ['кот']

В качестве альтернативы вы можете объявить класс с метапараметром require вместо использования include.

person czervik    schedule 01.03.2012
comment
Итак, я думаю, мне нужно добавить следующие строки, чтобы убедиться, что зависимости применяются правильно. Class['apache'] -> Class['mysql'] -> Class['postfix'] -> Class['ssh'] Есть ли другой подход для выполнения последовательного порядка, не делая независимые модули взаимозависимыми, используя внутреннее Require=› Учебный класс ... - person Maverick; 10.10.2012
comment
У вас это наоборот. Class['a'] -> Class['b'] означает, что для класса b требуется класс a. Мне нравится это делать, каждый пакет в своем модуле. Каждый модуль определяет свои собственные зависимости от других классов. Мне нравится использовать базовый класс uber для таких вещей, как ssh, который требуется всем. Для этого я использую этапы выполнения, чтобы гарантировать, что он всегда запускается первым. - person czervik; 11.10.2012
comment
@czervik, не могли бы вы показать, как вы включаете свой класс uber для таких вещей, как ssh, чтобы он был включен в любой другой класс? - person memyself; 03.04.2014