1 votes

Puppet:Could not find default node or by name with node test2.

J'ai installé Puppet 3.1.1 sur un serveur Ubuntu.

Mon dossier de manifestes ressemblait à ça :

 nodes
    test1.pp
 site.pp

Le contenu de site.pp était :

# site.pp
import "nodes/*.pp"

Le nœud test1 a fonctionné correctement.

Puis j'ai créé un nouveau fichier nommé test2.pp . Le contenu était le même que celui de test1.pp, à l'exception du nom du nœud, et je l'ai ajouté dans le dossier des nœuds.

Donc le dossier manifests est devenu ceci :

 nodes
    test1.pp
    test2.pp
 site.pp

J'ai ensuite couru puppet agent --test sur le nœud test2.

L'agent a pu échanger des clés SSL avec le maître de Puppet, mais j'ai reçu un message d'erreur :

Could not find default node or by name with test2

Si je ne crée pas un nouveau test2.pp et ajoutez simplement le contenu dans le fichier test1.pp aucune erreur n'apparaît.

Je pense donc que Puppet ne va pas importer dynamiquement un nouveau fichier pp après le démarrage du maître Puppet.

Est-il possible de définir des nœuds dans des fichiers pp individuels et de les importer dynamiquement ?

N'hésitez pas à me faire part de vos suggestions.


Le contenu des deux fichiers pp :

node 'test1' {
  include tmp::params
  tmp::gtp { 'node1':
    name            => 'node1',
    version         => '6.0.0.0',
    ip              => '168.1.193.97',
    port            => '1255',
  }
}

node 'test2' {
  include tmp::params
  tmp::gtp { 'node2':
    name            => 'node2',
    version         => '6.0.0.0',
    ip              => '168.1.193.98',
    port            => '1255',
  }
}

3voto

Shane Madden Points 112034

Je recommanderais de s'éloigner des définitions de nœuds manifestes pour passer à Hiera. Vous devrez modifier un peu les choses pour ne plus avoir ce type défini appelé directement depuis votre noeud, mais il semble que ce type ne soit pas utilisé plusieurs fois dans un catalogue de toute façon, donc la conversion en classe devrait fonctionner correctement.

Ainsi, avec un hiera.yaml comme ça

---
:backends:
  - yaml

:hierarchy:
  - '%{::clientcert}'
  - 'os-%{::osfamily}'
  - common

:yaml:
   :datadir: /etc/puppet/hieradata

Et un site.pp avec juste :

hiera_include(classes)

..vos nœuds seront lus à partir de fichiers YAML dans /etc/puppet/hieradata . Pour l'exemple, nous dirons que vous voulez tmp::params sur chaque noeud qui rapporte à Puppet, mais peut-être que vous voulez tmp::gtp seulement sur certains nœuds. Et vous voulez définir de manière centralisée les version mais laisse les autres paramètres à définir par nœud. Nous mettrons donc tmp::params et le version paramètre /etc/puppet/hieradata/common.yaml :

classes:
  - tmp::params

tmp::gtp::version: 6.0.0.0

Vous aurez alors un fichier pour chaque nœud.

/etc/puppet/hieradata/test1.yaml :

classes:
  - tmp::gtp

tmp::gtp::name : node1
tmp::gtp::ip   : 168.1.193.97
tmp::gtp::port : 1255

/etc/puppet/hieradata/test2.yaml :

classes:
  - tmp::gtp

tmp::gtp::name : node2
tmp::gtp::ip   : 168.1.193.98
tmp::gtp::port : 1255

Et oui, les modifications des fichiers Hiera seront prises en compte sans redémarrage du service. Ça semble être ce dont vous avez besoin ?

Modifier pour utiliser Hiera afin de configurer plusieurs instances d'un type défini, vous devrez procéder comme suit :

/etc/puppet/hieradata/test1.yaml :

classes:
  - gtpsetup

gtp_instances:
  - node1_instance1
  - node1_instance2

gtp_instanceconfig:
  node1_instance1:
    ip      : 168.1.193.97
    port    : 1255
    version : 5.3.2.1

  node1_instance2:
    ip      : 168.1.193.97
    port    : 1268
    version : 6.0.0.0

/etc/puppet/modules/gtpsetup/manifests/init.pp :

class gtpsetup {
  gtp_instances = hiera('gtp_instances')
  gtp_instanceconfig = hiera('gtp_instanceconfig')

  define gtp_instance {
    # this is using your existing defined type, but you can just move the stuff it's doing to here.
    tmp::gtp { $title:
      name    => $title,
      version => gtp_instanceconfig[$title]['version'],
      ip      => gtp_instanceconfig[$title]['ip'],
      port    => gtp_instanceconfig[$title]['port'],
    }
  }

  gtp_instance { $gtp_instances: }
}

1voto

asciiphil Points 2946

Shane a donné une excellente réponse avec une meilleure façon d'aborder votre problème, mais je veux aborder la question suivante : "Je pense donc que Puppet n'importera pas dynamiquement un nouveau fichier pp après le démarrage du maître Puppet."

C'est un peu vrai. Lorsque Puppet démarre, il lit tous ses fichiers de configuration et commence à les surveiller pour détecter les changements. Lorsque le contenu de l'un de ces fichiers est mis à jour, Puppet relit le fichier. Puppet dispose également d'un ensemble d'emplacements standard pour les fichiers qu'il consulte lorsqu'il en a besoin, ainsi si vous ajoutez une nouvelle classe foo::bar à un noeud dans un fichier qu'il surveille, il cherchera un fichier nommé foo/manifests/bar.pp (o foo/manifests/bar.rb ) dans son $modulepath même s'il n'avait pas besoin de ce fichier au démarrage.

C'est important, import ne sont évaluées que lorsque le fichier dans lequel elles se trouvent est analysé. Lorsque le maître Puppet a démarré, il a lu son fichier site.pp a vu le import et n'a trouvé que nodes/test1.pp donc les seuls fichiers dont il surveillait les changements étaient site.pp y nodes/test1.pp . Il n'a jamais vu nodes/test2.pp .

Une solution de contournement serait de simplement touch site.pp après avoir ajouté un nouveau fichier au nodes répertoire. Cela amènera le maître de Puppet à relire site.pp ce qui l'amènera à retraiter les import et il verra alors le nouveau fichier.

À long terme, cependant, il est préférable de suivre les recommandations de Shane et de séparer vos données de votre code. Si vous pouvez structurer vos définitions de manière à ne pas avoir besoin de la balise import vous serez mieux loti ; elle a toujours son utilité, mais de bien des manières import est une relique d'anciennes pratiques de Puppet qui ne sont plus pertinentes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X