Comment configurer: datadir: lors de l'utilisation de Hiera avec Puppet et Vagrant

10

Je voudrais savoir comment mettre en place :datadir:dans hiera.yamlpour une utilisation optimale avec des marionnettes et Vagrant. Actuellement, j'utilise vagrant 1.5.0 avec virtualbox 4.2 sur Ubuntu 13.10 avec un invité Ubuntu 12.04 exécutant la marionnette 3.1.1

J'essaie de mettre en place un environnement similaire à cet article de blog, Puppet Best Practices: Environment specific configs . Plus précisément, mon Vagrantfile contient:

  config.vm.define "servername" do |servername|
    servername.vm.box = "precise-puppet-3"
    servername.vm.network "private_network", ip: "192.168.213.2",
      virtualbox__intnet: "networkname"

    # Provision with puppet.
    servername.vm.provision :puppet do |puppet|
      puppet.hiera_config_path = "puppet/hiera.yaml"
      puppet.manifests_path = "puppet/manifests"
      puppet.module_path = "puppet/modules"
      puppet.manifest_file  = "servername.pp"
      puppet.facter = {
        "vagrant" => "1",
        "server" => "servername",
      }
    end
  end

Je peux confirmer que hiera_config_pathc'est correct, car j'obtiens une erreur si je supprime hiera.yaml.

puppet/hiera.yaml contient:

---
:backends: yaml
:yaml:
  :datadir: "manifests/configuration"
:hierarchy:
  - "%{::clientcert}"
  - "%{::environment}"
  - "virtual_%{::is_virtual}"
  - common
:logger: console

Et puppet/manifests/configuration/common.yamlcontient en outre :

---
myvar: "test"

Tester cela depuis la ligne de commande:

$ hiera -c hiera.yaml myvar
test

Jusqu'ici tout va bien. Cependant, si j'essaie de tester cela à partir d'un fichier manifeste de marionnettes, la variable est introuvable et j'obtiens une erreur. Exemple de test:

$myvariable = hiera(myvar)
notice("My variable is: ${myvar}")

L'erreur est:

Error: Could not find data item myvar in any Hiera data file and no default supplied at...

Si je ssh dans ma machine via vagrant ssh, je peux voir que Vagrant monte mon répertoire manifeste dans / tmp / vagrant-puppet-2. Si je modifie le hiera.yamlfichier et le remplace :datadir:par le chemin complet /tmp/vagrant-puppet-2/manifests/configuration, mes manifestes Puppet peuvent accéder à mes données Hiera. Puis-je faire cela avec un chemin relatif, cependant?

greg_1_anderson
la source

Réponses:

9

J'ai trouvé la solution en documentant ma question. Changement: datadir: lire:

  :datadir: "%{settings::manifestdir}/configuration"

Puppet fournira le chemin d'accès au répertoire manifeste dans $ settings :: manifestdir. Le stockage des données Hiera dans le répertoire manifeste est utile car Vagrant montera ce répertoire explicitement avant d'exécuter Puppet dans le système invité, et d'autres répertoires que vous pourriez sélectionner à cet effet pourraient ne pas être disponibles.

greg_1_anderson
la source
Est-ce à dire que j'ai besoin de 2 hiera.yamlfichiers, un pour une utilisation avec vagabond et un pour une utilisation avec Puppet (en production)?
Felipe Alvarez
Je n'ai jamais eu qu'un seul fichier hiera.yaml. Je n'utilise plus cette configuration, mais je pense que la technique de cette réponse ne fonctionne plus dans les versions récentes de Puppet. Si vous rencontrez des problèmes, veuillez consulter certaines des autres réponses.
greg_1_anderson
2

La hiera.yamlspécification avec laquelle je travaille :datadir: /etc/puppet/hieraet je n'ai pas eu de chance de définir l' --yamldiroption comme certaines des autres réponses spécifiées. Cependant, j'ai réalisé après un certain temps que je pouvais simplement mapper mes hieradonnées à cet emplacement sur le vm invité:

config.vm.synced_folder "../puppet/hiera", "/etc/puppet/hiera"

Cela fonctionne bien :-)

Stig Brautaset
la source
C'était exactement la configuration que j'avais. J'ai créé un dossier mappé config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")et également spécifié puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"dans les strophes de configuration des marionnettes.
Felipe Alvarez
1

C'est ce que je fais dans mes propres expériences de marionnettes.

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "puppetlabs/debian-7.8-64-puppet" # source box on atlas
  config.vm.hostname = "wheezybox"                  # hostname of box

  # Include Hiera Data Directory (no automatic option for this)
  config.vm.synced_folder "../../hieradata", "/tmp/vagrant-puppet/hieradata"

  # Puppet Configuration
  config.vm.provision :puppet do |puppet|
    puppet.manifests_path    = "../../manifests/"
    puppet.manifest_file     = "site.pp"
    puppet.module_path       = ["../../modules/"]    # shared modules
    puppet.hiera_config_path = "../../hiera.yaml"    # hiera config file
    puppet.working_directory = "/tmp/vagrant-puppet" # default hiera path
    puppet.options           = "--verbose --debug"
  end
end

Mon hiera.yaml minimaliste ressemble à ceci:

---
:backends:
  - yaml
:yaml:
  :datadir: "hieradata"
:hierarchy:
  - "node/%{::hostname}"

Et à des fins d'illustration, ma structure de répertoires sur l'hôte (MacBook) ressemble à ceci:

    .
    ├── hiera.yaml
    ├── hieradata
    │   └── node
    │       ├── centos6box.yaml
    │       ├── precisebox.yaml
    │       └── wheezybox.yaml
    ├── manifests
    │   └── site.pp
    ├── modules -> ../puppet-common/modules/
    └── vagrants
        ├── README.md
        ├── centos6
        │   └── Vagrantfile
        ├── precise
        │   └── Vagrantfile
        └── wheezy
            └── Vagrantfile
Joaquin Menchaca
la source
0

Votre problème d'origine était / :datadirdoit être un chemin absolu. Hiera ne vous permet pas de spécifier des chemins relatifs pour le :datadir. Si vous pensez que cela devrait être autorisé, veuillez soumettre une demande de modification .

manifestdir est obsolète . Vous préférerez peut-être utiliser le yamldir à la place. Vous pouvez remplacer ce paramètre lorsque vous réussissez à appliquer la marionnette.

Pour vagabond:

 servername.vm.provision :puppet, :options => ["--yamldir some/absolute/path"]  do |puppet|
  puppet.hiera_config_path = "puppet/hiera.yaml"
  puppet.manifests_path = "puppet/manifests"
  puppet.module_path = "puppet/modules"
  puppet.manifest_file  = "servername.pp"
  puppet.facter = {
    "vagrant" => "1",
    "server" => "servername",
  }
end

MISE À JOUR : Étant donné que vous devez fournir un chemin absolu (et parce que vagabond), vous devez configurer votre propre dossier partagé afin que vous puissiez être explicite sur son emplacement et ne pas faire d'hypothèses sur un chemin défini vagabond pour l'exécution de marionnettes. Ajoutez ceci à votre Vagrantfile:

config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"

puis changez la première ligne ci-dessus en:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
ferventcoder
la source
Merci pour la référence à --yamldir; c'est très utile. Le problème, cependant, est que je dois utiliser un chemin d'accès relatif. Si je mets un chemin absolu, je devrais utiliser ["--yamldir / tmp / vagrant-puppet-2 / manifests / configuration"]; cependant, je ne peux pas croire que / tmp / vagrant-puppet-2 va être un chemin stable. Y a-t-il une variable que je peux référencer dans le Vagrantfile qui contient ce chemin? Ou puis-je définir une variable pour spécifier le chemin à utiliser au lieu de / tmp / vagrant-puppet-2? Tout ce qui s'éloigne des hypothèses sur les chemins que Vagrant va utiliser fonctionnerait.
greg_1_anderson
@ greg_1_anderson vous pouvez définir vos propres répertoires, de cette façon vous êtes explicite sur le répertoire et ne faites pas d'hypothèses sur vagabond. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder
Mis à jour la réponse. De plus, si vous pensez qu'un chemin relatif serait utile, veuillez créer un ticket sur tickets.puppetlabs.com/browse/HI - merci!
ferventcoder
Puppet autorise les chemins relatifs pour la configuration hiera datadir lors de l'exécution puppet apply. Le datadir sera relatif au répertoire courant où Puppet a été exécuté.
Nathan