Scénario: mon fichier de configuration est défini par un .erb
fichier qui inclut l'extrait ci-dessous.
<% 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 -%>
Le fichier de configuration du serveur nécessite une entrée répétée pour chaque hôte client. Si je devais créer un tableau simple, cela fonctionnerait sans problème. Ce que je veux faire, cependant, c'est que chaque hôte s'enregistre lui-même, puis recueille les données en utilisant le <<| |>>
pragma similaire à ce que l'on ferait avec les nagios_*
types.
L' exemple standard pour cela implique l'exportation d'un type.
class ssh {
@@sshkey { $hostname: type => dsa, key => $sshdsakey }
Sshkey <<| |>>
}
Cependant, je ne peux pas vraiment comprendre comment écrire un type ou le référencer d'une manière qui me permettrait de lire ce tableau de valeurs à partir du .erb
modèle. Existe-t-il un moyen d'utiliser les ressources exportées en combinaison avec une boucle variable dans un .erb
fichier?
Réponses:
Donc, pour répondre directement à votre question, je ne pense pas qu'il soit possible d'obtenir une liste des ressources exportées directement depuis erb. Cela est dû à la nature des ressources exportées. Pour Puppet, ce sont juste plus de ressources qui doivent être créées sur l'hôte.
Mais, il existe un moyen d'accomplir ce que vous cherchez à faire. Je le fais à quelques endroits de mon environnement.
Ici, nous créons un répertoire de fichiers, un pour chaque hôte que nous voulons marquer comme "bacula_client". Nous utilisons les
purge
,force
et lesrecurse
options pour supprimer les fichiers qui ne sont pas gérés par des marionnettes (si vous voulez supprimer un système de cette « liste »).Ensuite, nous utilisons du code Ruby dans le .erb pour rechercher des fichiers dans ce répertoire et agir sur eux:
la source
ls /path/to/flag/files|while read hostname; do ssh $hostname ..; done
.Eh bien, j'ai d'abord abandonné et défini mon
@@
type de fichier réel. L'avantage est que cela utilise toujours les variables sur l'hôte client.Cela me permet d'utiliser des entrées dans le fichier erb telles que:
et déclarations dans mes fichiers site.pp tels que:
class { bacula-client: database => "true" }
Pour gérer le répertoire lui-même:
Purger et recurse nettoie tout ce qui n'est pas défini. Lorsque je mets un hôte hors ligne,
puppetstoredconfigclean $hostname
nettoie les faits et la prochaine série de marionnettes sur le directeur réinitialise la configuration de manière appropriée.Enfin, le logiciel directeur Bacula lui-même me permet de faire ce qui suit à la fin de mon fichier bacula-dir.conf:
Donc, il ne semble toujours pas y avoir de moyen direct d'utiliser un modèle ERB sur un ensemble de ressources collectées, mais on peut collecter des types. Cela peut inclure des types Augeas pour tout mettre dans un seul fichier, ou un hack de collecte de fichiers dans une configuration. Cependant, cela ne comprend pas encore ce que je cherchais sur la question.
la source
J'ai trouvé une méthode utilisant le service PuppetDB qui fonctionne assez bien dans cette situation, bien qu'elle soit un peu hackeuse. Pour l'utiliser, vous devrez avoir PuppetDB opérationnel (que vous devriez déjà avoir car vous utilisez des ressources exportées) et l'API PuppetDB devra être consultable auprès du puppetmaster (localhost).
Ensuite, vous voudrez exporter toutes les ressources que vous souhaitez rassembler dans votre tableau dans un répertoire dédié sur le système de fichiers. Ce chemin de répertoire sera utilisé pour identifier de manière unique les ressources cibles.
Ensuite, dans votre modèle, faites quelque chose comme ceci:
Où nodename est le nom de domaine complet du serveur, pathRegex est le chemin de recherche mentionné ci-dessus, formaté en Ruby Regex et retVal est le tableau terminé. Cela permet de tirer parti du traitement du modèle sur le marionnettiste, de sorte que les informations d'identification API spéciales ne sont pas requises. Cela suppose également que la ressource namevar est le chemin d'accès complet des fichiers cibles, si vous avez des namevars complexes et utilisez l'attribut path une logique plus complexe sera requise. Notez également que cela renvoie toutes les ressources, à la fois exportées et locales. Les données renvoyées ont de nombreux attributs qui peuvent être utilisés pour une logique plus complexe si nécessaire.
Un peu hacky, mais ça marche bien.
la source