No se pudo encontrar la clase y, sin embargo, está allí.

31

Al hacer una puppet agentllamada desde una nueva imagen, recibo un err: Could not find class custommoderror. El módulo en sí es el /etc/puppet/modules/custommodmismo que todos los otros módulos que estamos llamando, pero este es obstinante.

[site.pp]

node /clunod-wk\d+\.sub\.example\.local/ {
      include base
      include curl
      include custommod
      class{ "custommod::apps": frontend => "false}
      [...]
}

Cuando el puppetmaster se ejecuta con salida de depuración, encuentra claramente la información para base y curl:

debug: importing '/etc/puppet/modules/base/manifests/init.pp' in environment production
debug: Automatically imported base from base into production
debug: importing '/etc/puppet/modules/curl/manifests/init.pp' in environment production
debug: Automatically imported curl from curl into production
err: Could not find class custommod for clunod-wk0130.sub.example.local at /etc/puppet/manifests/site.pp:84 on node clunod-wk0130.sub.example.local

La línea 84 es include custommod

Un directorio abreviado y estructura de archivos:

/etc/puppet
   |- manifests
   |     |- site.pp
   |
   |- modules
         |- base
         |    |- manifests
         |          |- init.pp
         |
         |- curl
         |    |- manifests
         |          |- init.pp
         |   
         |- custommod
              |- files 
              |     |- apps
              |         |- [...]
              |
              |- manifests
                    |- init.pp
                    |- apps.pp

Verifiqué la ortografía:}

El contenido del init.ppdirectorio custommod es completamente irrelevante:

class custommod {
}

La intención es crear una clase vacía para el archivo apps.pp, que es donde está la carne.

class custommod::apps {

    [lots of stuff]
}

Solo que nunca llega al archivo de aplicaciones. Si comento el include custommod, el error anterior se genera en la class{ "custommod::apps": frontend => "false}línea en su lugar.

¿Qué me falta en mi búsqueda para averiguar cómo se genera este error? Tengo que tener en cuenta que este repositorio funciona bien si se ejecuta localmente a través de puppet apply.

sysadmin1138
fuente
¿Tomó un pico en el archivo yaml del cliente para ver si su clase está presente?
Zoredache
@Zoredache El directorio / var / lib / puppet / client_yaml / está vacío en el cliente. El cliente está recibiendo un could not retrieve catalog from remote server:error, lo que probablemente sea la razón.
sysadmin1138
Hrm .. recreó su diseño básico y la estructura de importación y no pudo reproducir el problema (en 2.7.1). Debería ser seguro dejar de incluir el vacío custommod, tal vez incluso intente eliminarlo por init.ppcompleto, ya que no debería ser necesario.
Shane Madden
@ShaneMadden Después de intentarlo, mi siguiente paso es lanzarlo stracee intentar averiguar qué archivos está intentando leer de esa manera.
sysadmin1138

Respuestas:

32

Entonces ... esto es un poco embarazoso, pero ...

Ambientes

Justo en mi /etc/puppet.confarchivo está esto:

[master]
  manifest=$confdir/manifests/site.pp
  modulepath=$confdir/environments/$environment/modules:$confdir/modules

Después de lanzarlo stracepara descubrir dónde estaba buscando archivos, noté algo. Estaba buscando custommod debajo /etc/puppet/environments/production/modules, y como había un directorio allí (vacío), no fue a verificar/etc/puppet/modules . Aparentemente, al importar un módulo, verifica la presencia de directorio, en lugar de la presencia de archivo (init.pp).

Elimine ese directorio vacío, las cosas comienzan a funcionar.

Ejecute el agente de marionetas utilizando un entorno diferente, las cosas comienzan a funcionar.

Moraleja de la historia:

Las rutas de Puppet Environment no actúan como bash $ PATH.

sysadmin1138
fuente
8
Y en caso de que alguien no haya definido su ruta de módulo explícitamente en puppet.conf, y quieran descubrir la ruta de módulo de puppet sin recurrir a strace, también pueden ejecutar puppet config print modulepath.
Alison R.
1
¿Se ha informado esto a puppetlabs?
Felipe Alvarez
3
El modulepath ahora activa una advertencia de desuso.
Magellan
4

Me encontré con este mismo problema, pero tuve una solución diferente

Si genera un módulo de títeres así:

puppet module generate foo-example_module

Creará un módulo example_modulecon el foonombre del espacio. Todos los manifiestos estarán dentro de un directorio llamadofoo-example_module

El nombre de la clase definida en init.pp debe ser el mismo que el nombre de la carpeta.

Solución simple:

mv foo-example_module example_module

Si ejecuta puppet-lint, le avisará con el siguiente mensaje:

ERROR: example_module not in autoload module layout on line 42

Si usa un Puppetfile con r10k o librarian-puppet, es posible que también necesite eliminar el espacio de nombre para que los archivos se coloquen sin el prefijo 'foo' en el directorio de módulos.

antes de:

mod 'foo-example_module',
    :git => [email protected]:foo/example_module'

después:

mod 'example_module',
    :git => [email protected]:foo/example_module'
Spuder
fuente
0

Se encontró con un problema similar con Puppet 3.7.1 para Fedora: no se pudo encontrar la clase Puppet para my.server

Solución:

sudo ln -s /my/local/copy/puppet/modules /etc/puppet/

Entonces funciona.

Haibo Liu
fuente
0

Tuve un problema similar. En mi caso, el nombre de la clase era "onehost :: change_IoT_password_reminder". Después de usar strace, descubrí que Puppet estaba buscando un archivo de módulos / onehost / manifiestos / change_iot_password_reminder.pp. Parece que usar letras mayúsculas en los nombres de clase no es una buena idea, incluso si no es la primera letra de la clase.

Geoff Crompton
fuente