So richten Sie Folgendes ein: datadir: Wenn Sie Hiera mit Puppet und Vagrant verwenden


10

Ich würde gerne wissen , wie einzurichten :datadir:in hiera.yamlfür eine optimale Nutzung mit Puppet und Vagrant. Derzeit verwende ich Vagrant 1.5.0 mit Virtualbox 4.2 unter Ubuntu 13.10 mit einem Ubuntu 12.04-Gast, auf dem Puppet 3.1.1 ausgeführt wird

Ich versuche, eine Umgebung einzurichten, die diesem Blog-Beitrag " Puppet Best Practices: Umgebungsspezifische Konfigurationen" ähnelt . Insbesondere enthält meine Vagrant-Datei:

  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

Ich kann bestätigen, dass das hiera_config_pathkorrekt ist, da beim Löschen eine Fehlermeldung angezeigt wird hiera.yaml.

puppet/hiera.yaml enthält:

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

Und puppet/manifests/configuration/common.yamlenthält außerdem:

---
myvar: "test"

Testen Sie dies über die Befehlszeile:

$ hiera -c hiera.yaml myvar
test

So weit, ist es gut. Wenn ich jedoch versuche, dies aus einer Puppet-Manifestdatei heraus zu testen, kann die Variable nicht gefunden werden, und es wird eine Fehlermeldung angezeigt. Beispieltest:

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

Der Fehler ist:

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

Wenn ich über ssh in meinen Computer ssh vagrant ssh, kann ich sehen, dass Vagrant mein Manifest-Verzeichnis unter / tmp / vagrant-puppet-2 bereitstellt. Wenn ich die hiera.yamlDatei bearbeite und durch :datadir:den vollständigen Pfad ersetze /tmp/vagrant-puppet-2/manifests/configuration, können meine Puppet-Manifeste auf meine Hiera-Daten zugreifen. Kann ich dies jedoch mit einem relativen Pfad tun?

Antworten:


9

Ich habe die Lösung gefunden, als ich meine Frage dokumentiert habe. Ändern: datadir: zu lesen:

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

Puppet gibt den Pfad zum Manifestverzeichnis in $ settings :: manifestdir an. Das Speichern der Hiera-Daten im Manifest-Verzeichnis ist nützlich, da Vagrant dieses Verzeichnis explizit bereitstellt, bevor Puppet im Gastsystem ausgeführt wird, und andere Verzeichnisse, die Sie möglicherweise für diesen Zweck auswählen, möglicherweise nicht verfügbar sind.


Bedeutet dies, dass ich 2 hiera.yamlDateien benötige , eine für die Verwendung mit Vagrant und eine für die Verwendung mit Puppet (in der Produktion)?
Felipe Alvarez

Ich hatte immer nur eine hiera.yaml-Datei. Ich verwende dieses Setup nicht mehr, aber ich glaube, dass die Technik in dieser Antwort in neueren Versionen von Puppet nicht mehr funktioniert. Wenn Sie Probleme damit haben, lesen Sie bitte einige der anderen Antworten.
Greg_1_anderson

2

Das, mit dem hiera.yamlich arbeite, spezifiziert :datadir: /etc/puppet/hieraund ich hatte kein Glück, die --yamldirOption als einige der anderen angegebenen Antworten festzulegen. Nach einer Weile wurde mir jedoch klar, dass ich meine Hieradaten einfach diesem Ort auf der Gast-VM zuordnen konnte:

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

Das funktioniert gut :-)


Dies war genau das Setup, das ich hatte. Ich habe einen zugeordneten Ordner erstellt config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")und auch puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"in den Strophen der Puppenkonfiguration angegeben .
Felipe Alvarez

1

Das mache ich in meinen eigenen Marionettenexperimenten.

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

Meine minimalistische hiera.yaml sieht so aus:

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

Zur Veranschaulichung sieht meine Verzeichnisstruktur auf dem Host (MacBook) folgendermaßen aus:

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

Ihr ursprüngliches Problem war / ist, dass :datadirdies ein absoluter Weg sein muss. In Hiera können Sie keine relativen Pfade für die angeben :datadir. Wenn Sie der Meinung sind, dass dies zulässig sein sollte, senden Sie bitte einen Antrag auf Änderung .

manifestdir ist veraltet . Möglicherweise bevorzugen Sie stattdessen Yamldir . Sie können diese Einstellung überschreiben, wenn Sie die Puppenanwendung bestehen.

Für Landstreicher:

 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

UPDATE : Da Sie einen absoluten Pfad angeben müssen (und weil vagrant), sollten Sie Ihren eigenen freigegebenen Ordner einrichten, damit Sie explizit angeben können, wo er sich befindet, und keine Annahmen über einen vagrant festgelegten Pfad für die Puppenausführung treffen. Fügen Sie dies zu Ihrem hinzu Vagrantfile:

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

und ändern Sie dann die erste Zeile oben in:

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

Vielen Dank für den Hinweis auf --yamldir; das ist sehr hilfreich. Das Problem ist jedoch, dass ich einen relativen Pfad verwenden muss. Wenn ich einen absoluten Pfad eingeben würde, müsste ich ["--yamldir / tmp / vagrant-Marionette-2 / Manifeste / Konfiguration"] verwenden; Ich kann jedoch nicht darauf vertrauen, dass / tmp / vagrant-puppet-2 ein stabiler Pfad sein wird. Gibt es eine Variable, auf die ich in der Vagrant-Datei verweisen kann, die diesen Pfad enthält? Oder kann ich eine Variable festlegen, um festzulegen, welcher Pfad anstelle von / tmp / vagrant-puppet-2 verwendet werden soll? Alles, was davon abweicht, Annahmen darüber zu treffen, welche Pfade Vagrant verwenden wird, würde funktionieren.
Greg_1_anderson

@ greg_1_anderson Sie können Ihre eigenen Verzeichnisse festlegen. Auf diese Weise können Sie das Verzeichnis explizit angeben und keine Annahmen über Vagabunden treffen. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
Ferventcoder

Die Antwort wurde aktualisiert. Auch wenn Sie der Meinung sind, dass ein relativer Pfad hilfreich wäre, erstellen Sie bitte ein Ticket unter tickets.puppetlabs.com/browse/HI - danke!
Ferventcoder

Puppet erlaubt beim Ausführen relative Pfade für die Hiera-Datadir-Konfiguration puppet apply. Das Datenverzeichnis ist relativ zum aktuellen Verzeichnis, in dem Puppet ausgeführt wurde.
Nathan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.