Как вызвать функцию марионетки из модуля, отличного от модуля, в котором она определена - PullRequest
3 голосов
/ 22 марта 2019

Я определил кукольную функцию check_value в модуле test_one

test_one
 |- functions
     |- check_value.pp

и объявление функции:

test_one::check_value(String $check) >> String {
    ...
}

Я объявил класс test_functions в том же самомmodule.

test_one
 |- functions
     |- check_value.pp
 |- manifests
     |- test_functions.pp

Кажется, все идеально, и я могу вызвать эту функцию check_value из класса test_functions в том же модуле и получить извлекаемое значение.

Однако,если я вызываю эту функцию из другого модуля, я получаю Evaluation Error: Unknown function: ...

test_two
 |- manifests
     |- test_external_function.pp

В классе test_external_function я пробовал несколько способов вызова check_value, но безуспешно:

1. $x = test_one::check_value("t")


2. include test_one
   $x = check_value("t")  


3. include test_one
   $x = test_one::check_value("t")

Все испытания провалились.Можно ли вызывать и использовать эти кукольные (не рубиновые) функции из другого модуля?Я не мог найти способ.Google пока не помогает!

Согласно документации кукол, это возможно: Функции кукол

Функции загружаются автоматически и становятся доступными для других модулей.если эти модули не определяют зависимости.Как только функция написана и доступна (в модуле, где ее может найти автозагрузчик), вы можете вызвать эту функцию в любом манифесте Puppet, в котором содержится содержащий модуль как зависимость, а также из основного манифеста.

1 Ответ

2 голосов
/ 22 марта 2019

Это связано с относительно новым требованием, введенным в кодировке Puppet, которое задокументировано здесь . В частности:

Обратите внимание, что если модуль имеет список зависимостей в своем файле metadata.json, он загружает пользовательские функции только из этих конкретных зависимостей.

Обычно при генерации модуля через PDK или puppet module generate создается заполнитель metadata.json с puppetlabs/stdlib в качестве зависимости. Обычно это нормально на практике, но это нарушит автозагрузку пользовательских функций из других модулей.

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

"dependencies": [
  { "name": "org_name/test_one", "version_requirement": ">= 1.0.0 < 2.0.0" },
]

с полной документацией по определению зависимостей здесь .

...