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

Во время кухонной конвергенции, вызывающей куклу, я получил эту ошибку:

Error: Evaluation Error: Error while evaluating a Function Call, Could not find class ::alibi for ... at .. entry.pp 

alibi - это имя модуля и:

/tmp/kitchen>ll
total 8
drwxrwxr-x. 4 kitchen kitchen  80 Feb 26 14:14 hiera
 -rw-rw-r--. 1 kitchen kitchen 170 Feb 26 14:14 hiera.global.yaml
drwxrwxr-x. 2 kitchen kitchen 100 Feb 26 14:35 manifests
drwxrwxr-x. 4 kitchen kitchen  80 Feb 26 14:14 modules
-rw-rw-r--. 1 kitchen kitchen 901 Feb 26 13:53 puppet.conf
/tmp/kitchen>more  manifests/entry.pp manifests/init.pp
::::::::::::::
manifests/entry.pp
::::::::::::::
  hiera_include('classes')
::::::::::::::
manifests/init.pp
::::::::::::::

class alibi () {

    $instances = hiera_hash("alibi::instances", {})
    validate_hash($instances)
    create_resources("alibi::instance", $instances)

}
/tmp/kitchen>/tmp/kitchen>more hiera.global.yaml
---
:backends:
- yaml

:yaml:
 :datadir: "/tmp/kitchen/hiera"

:hierarchy:

- tests/%{hostname}
- origin/main

# options are native, deep, deeper
:merge_behavior: deeper
/tmp/kitchen>/tmp/kitchen>more hiera/origin/main.yaml
classes:
 - alibi

Команда

 export MANIFESTDIR='/tmp/kitchen/manifests'; sudo -E env 
 http_proxy=http://proxy-internet.localnet:3128 
 https_proxy=http://proxy-internet.localnet:3128  puppet apply 
 /tmp/kitchen/manifests/entry.pp --modulepath=/tmp/kitchen/modules 
 --fileserverconfig=/tmp/kitchen/fileserver.conf 
 --hiera_config=/tmp/kitchen/hiera.global.yaml --detailed-exitcodes -v 

Это нормально, если я использую init.pp вместо entry.pp (но hiera_include() не вызывается)

1 ответ

Решение

Ваш код должен быть правильно размещен в модулях. Когда Puppet ищет класс с именем alibi, он проверит каждый каталог в вашем модуле пути (неясно, что это в вашем случае, но, возможно, просто /tmp/kitchen/modules) для файла alibi/manifests/init.pp, Рабочий каталог и каталог манифеста не имеют значения, по крайней мере, в любой версии Puppet, которая должна использоваться где угодно.

Однако это конкретное имя является частным случаем, потому что оно будет интерпретироваться как имя основного класса модуля. Другие классы и определенные типы в том же модуле будут отображаться немного по-другому. Например, alibi::good будет сопоставлен с alibi/manifests/good.pp, а также alibi::alibi будет сопоставлен с alibi/manifests/alibi.pp,

Это нормально, если я использую init.pp вместо entry.pp (но hiera_include() не вызывается)

Ну да и нет. Puppet не полагается на соглашения о сопоставлении файлов и проверяет текущий каталог, когда вы явно указываете ему, какой файл оценивать. Поэтому, когда вы явно указываете init.pp к нему он находит и оценивает этот файл. Но нет, оценка этого файла сама по себе бесполезна: Puppet проанализирует объявление класса, но в этом манифесте нет ничего, что говорило бы о применении этого класса к целевому узлу.

Другие вопросы по тегам