Come impostare: datadir: quando si utilizza Hiera con Puppet e Vagrant


10

Mi piacerebbe sapere come impostare :datadir:in hiera.yamlper un uso ottimale con marionette e Vagrant. Attualmente sto usando Vagrant 1.5.0 con Virtualbox 4.2 su Ubuntu 13.10 con un guest Ubuntu 12.04 che esegue Puppet 3.1.1

Sto cercando di creare un ambiente simile a questo post del blog, Puppet Best Practices: Configurazioni specifiche per l'ambiente . In particolare, il mio Vagrantfile contiene:

  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

Posso confermare che hiera_config_pathè corretto, perché ottengo un errore se cancello hiera.yaml.

puppet/hiera.yaml contiene:

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

E, inoltre, puppet/manifests/configuration/common.yamlcontiene:

---
myvar: "test"

Test questo dalla riga di comando:

$ hiera -c hiera.yaml myvar
test

Fin qui tutto bene. Tuttavia, se provo a provare questo all'interno di un file manifest fantoccio, la variabile non può essere trovata e viene visualizzato un errore. Esempio di test:

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

L'errore è:

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

Se mi collego alla mia macchina tramite vagrant ssh, posso vedere che Vagrant sta montando la mia directory manifest su / tmp / vagrant-puppet-2. Se modifico il hiera.yamlfile e lo sostituisco :datadir:con il percorso completo /tmp/vagrant-puppet-2/manifests/configuration, i manifest di Puppet possono accedere ai miei dati Hiera. Posso farlo con un percorso relativo, però?

Risposte:


9

Ho trovato la soluzione mentre documentavo la mia domanda. Modifica: datadir: leggere:

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

Puppet fornirà il percorso alla directory manifest in $ settings :: manifestdir. Memorizzare i dati Hiera nella directory manifest è utile perché Vagrant monterà esplicitamente questa directory prima di eseguire Puppet nel sistema guest e altre directory che potresti selezionare a questo scopo potrebbero non essere disponibili.


Questo significa che ho bisogno di 2 hiera.yamlfile, uno per l'uso con Vagrant e uno per l'uso con Puppet (in produzione)?
Felipe Alvarez,

Ho sempre avuto un solo file hiera.yaml. Non sto più usando questa configurazione, ma credo che la tecnica in questa risposta non funzioni più nelle ultime versioni di Puppet. In caso di problemi, consultare alcune delle altre risposte.
greg_1_anderson,

2

La hiera.yamlsto lavorando con specifica :datadir: /etc/puppet/hierae non ho avuto fortuna con l'impostazione della --yamldiropzione come alcune delle altre risposte specificati. Tuttavia, dopo un po 'mi sono reso conto che potevo semplicemente mappare i miei geradati in quella posizione sul guest vm:

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

Funziona bene :-)


Questo era esattamente il set up che avevo. Ho creato una cartella mappata config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")e anche specificato puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"nelle stanze di configurazione fantoccio.
Felipe Alvarez,

1

Questo è quello che sto facendo nei miei esperimenti di marionette.

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

Il mio minimalista hiera.yaml si presenta così:

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

E a scopo illustrativo, la mia struttura di directory sull'host (MacBook) è simile al seguente:

    .
    ├── 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

0

Il problema originale era / è che :datadirdeve essere un percorso assoluto. Hiera non consente di specificare percorsi relativi per :datadir. Se ritieni che ciò dovrebbe essere consentito, invia una richiesta per modificarlo .

manifestdir è deprecato . In alternativa, potresti preferire utilizzare yamldir . È possibile ignorare tale impostazione quando si applica il burattino.

Per vagabondo:

 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

AGGIORNAMENTO : poiché è necessario fornire un percorso assoluto (e perché vagrant), è necessario impostare la propria cartella condivisa in modo da poter essere espliciti su dove si trova e non fare ipotesi su un percorso set vagabondo per l'esecuzione di marionette. Aggiungi questo al tuo Vagrantfile:

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

e quindi modificare la prima riga sopra in:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|

Grazie per il riferimento a --yamldir; è molto utile. Il problema, tuttavia, è che devo usare un percorso relativo. Se inserissi un percorso assoluto, dovrei usare ["--yamldir / tmp / vagrant-puppet-2 / manifestests / configuration"]; tuttavia, non posso fidarmi che / tmp / vagrant-puppet-2 sarà un percorso stabile. Esiste una variabile a cui posso fare riferimento nel Vagrantfile che contiene questo percorso? O posso impostare qualche variabile per stabilire quale percorso usare al posto di / tmp / vagrant-puppet-2? Tutto ciò che si allontana dal fare ipotesi su quali percorsi utilizzerà Vagrant funzionerebbe.
greg_1_anderson,

@ greg_1_anderson puoi impostare le tue directory, in questo modo sei esplicito sulla directory e non fare ipotesi su vagabondo. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder,

Aggiornato la risposta. Inoltre, se ritieni che il relativo percorso sia utile, crea un biglietto su tickets.puppetlabs.com/browse/HI - grazie!
ferventcoder,

Puppet consente percorsi relativi per la configurazione del datadir hiera durante l'esecuzione puppet apply. Il datadir sarà relativo alla directory corrente in cui è stato eseguito Puppet.
Nathan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.