2012-03-01 5 views
5

У меня есть этот node.pp, и мне интересно, как марионетка собирается его исполнить.Puppet Execution Flow

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

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

$ puppetd -t -d 

Кукольный не выполняет его последовательно значение, он не выполняет SSH, а затем постфикса, ...

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

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

ответ

17

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

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

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

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

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

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

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

+2

Не могли бы вы определить, что такое * согласованный, но непредсказуемый заказ *? У нас много проблем, когда Puppet 2.6 просто перезагружает шаги и из-за некоторых недостающих зависимостей он терпит неудачу. Это непростительно. Могу ли я заставить какую-то перетасовку, чтобы мы могли проверить ее правильно? Я также слышал, что новая версия дает фиксированный заказ. – lzap

+0

Итак, скажем, у меня есть пакет для установки, который зависит от существующего репозитория в yum.repos.d. Как я могу обеспечить наличие установленного репозитория до того, как он попытается установить пакет? – Mojo

3

Отказ от ответственности: Я все еще довольно новое для кукольный :)

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

класса [ «JDK»] -> Класс [ «кот»]

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

+0

Итак, я думаю, я должен добавить следующие строки, чтобы убедиться, что зависимости применяются правильно. Класс ['apache'] -> Класс ['mysql'] -> Класс ['postfix'] -> Class ['ssh'] Есть ли другой подход для выполнения последовательного заказа без независимого независимого модуля, используя internal Require => Class ... – Maverick

+0

У вас есть это в обратном направлении. Класс ['a'] -> Класс ['b'] означает, что для класса b требуется класс a. Как мне это нравится, каждый пакет в его собственном модуле. Каждый модуль определяет собственные зависимости от других классов. Мне нравится использовать базовый класс uber для таких вещей, как ssh, который требуется всем. Для этого я использую этапы запуска, чтобы гарантировать, что он всегда работает первым. – czervik

+0

@czervik вы не хотите показывать, как вы включаете свой класс uber для таких вещей, как ssh, чтобы он включался в каждый другой класс? – memyself