Escenario: mi archivo de configuración está definido por un .erb
archivo que incluye el fragmento a continuación.
<% backupclients.each do |backup_files| -%>
Job {
Name = "Server"
JobDefs = "DefaultJob"
Client = <%= backup_files %>-fd
Pool = TeraMonth
Write Bootstrap = "/var/lib/bacula/<%= backup_files %>.bsr"
}
<% end -%>
El archivo de configuración del servidor necesita una entrada repetida para cada host cliente. Si tuviera que crear una matriz simple, esto funcionaría sin problemas. Sin embargo, lo que quiero hacer es que cada host se registre y luego recopile los datos utilizando el <<| |>>
pragma similar a lo que se haría con los nagios_*
tipos.
El ejemplo estándar para esto implica exportar un tipo.
class ssh {
@@sshkey { $hostname: type => dsa, key => $sshdsakey }
Sshkey <<| |>>
}
Sin embargo, no puedo entender cómo escribir un tipo o hacer referencia a él de una manera que me permita leer esa matriz de valores de la .erb
plantilla. ¿Hay alguna manera de usar los recursos exportados en combinación con un bucle variable en un .erb
archivo?
Respuestas:
Entonces, para responder su pregunta directamente, no creo que sea posible obtener una lista de recursos exportados directamente de erb. Esto se debe a la naturaleza de los recursos exportados. Para Puppet, son solo más recursos que deben crearse en el host.
Pero, hay una manera de lograr lo que estás buscando hacer. Lo hago en algunos lugares de mi entorno.
Aquí creamos un directorio de archivos, uno para cada host que queremos marcar como "cliente_bacula". Utilizamos las
purge
,force
yrecurse
las opciones para eliminar los archivos que no son administrados por la marioneta (es decir, si desea eliminar un sistema de esta "lista").A continuación, usamos un código Ruby en el .erb para escanear este directorio en busca de archivos y actuar sobre ellos:
fuente
ls /path/to/flag/files|while read hostname; do ssh $hostname ..; done
.Bueno, primero me di por vencido y configuré mi
@@
en el tipo de archivo real. Lo bueno es que esto todavía está usando las variables en el host del cliente.Esto me permite usar entradas en el archivo erb como:
y declaraciones en mis archivos site.pp como:
class { bacula-client: database => "true" }
Para manejar el directorio en sí:
La purga y la recidiva limpian todo lo que no está definido. Cuando desconecto un host,
puppetstoredconfigclean $hostname
limpiará los hechos y la próxima ejecución de títere en el director restablecerá la configuración de forma correcta.Finalmente, el software del director Bacula me permite hacer lo siguiente al final de mi archivo bacula-dir.conf:
Por lo tanto, todavía no parece haber una forma directa de usar una plantilla ERB en un conjunto de recursos recopilados, pero se pueden recopilar algunos tipos. Eso puede incluir tipos de Augeas para guardar todo en un archivo, o un truco de recopilar archivos en una configuración. Sin embargo, aún no incluye lo que estaba buscando en la pregunta.
fuente
He encontrado un método que utiliza el servicio PuppetDB que funciona bastante bien para esta situación, aunque es un poco hack. Para usar esto, necesitará que PuppetDB esté operativo (que ya debería tener ya que está utilizando recursos exportados) y la API de PuppetDB deberá estar siempre disponible desde puppetmaster (localhost).
Luego, querrá exportar todos los recursos que desea reunir a su matriz en un directorio dedicado en el sistema de archivos. Esta ruta de directorio se utilizará para identificar de forma exclusiva los recursos de destino.
Luego, en su plantilla, haga algo como esto:
Donde nodename es el FQDN del servidor, pathRegex es la ruta de búsqueda mencionada anteriormente, formateada como Ruby Regex, y retVal es la matriz completa. Esto aprovecha que la plantilla se procesa en el puppetmaster, por lo que no se requieren credenciales especiales de API. Esto también supone que el recurso namevar es la ruta de acceso completa de los archivos de destino, si tiene nombres de nombre complejos y utiliza el atributo de ruta, se requerirá una lógica más compleja. También tenga en cuenta que esto está devolviendo todos los recursos, tanto exportados como locales. Los datos devueltos tienen muchos atributos que pueden usarse para una lógica más compleja si es necesario.
Un poco hacky, pero funciona bien.
fuente