Jak skonfigurować: datadir: podczas używania Hiera z Puppet i Vagrant

10

Chciałbym wiedzieć, jak skonfigurować :datadir:w hiera.yamlcelu optymalnego wykorzystania z Lalki i Vagrant. Obecnie używam vagrant 1.5.0 z virtualbox 4.2 na Ubuntu 13.10 z gościem Ubuntu 12.04 z marionetką 3.1.1

Próbuję skonfigurować środowisko podobne do tego postu na blogu, Puppet Best Practices: Specyficzne dla środowiska konfiguracje . W szczególności mój plik Vagrantfile zawiera:

  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

Mogę potwierdzić, że hiera_config_pathjest poprawny, ponieważ po usunięciu pojawia się błąd hiera.yaml.

puppet/hiera.yaml zawiera:

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

Ponadto puppet/manifests/configuration/common.yamlzawiera:

---
myvar: "test"

Testowanie tego z wiersza poleceń:

$ hiera -c hiera.yaml myvar
test

Na razie w porządku. Jeśli jednak spróbuję to przetestować z poziomu pliku manifestu lalek, zmiennej nie można znaleźć i pojawia się błąd. Przykładowy test:

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

Błąd jest następujący:

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

Jeśli ssh do mojej maszyny za pośrednictwem vagrant ssh, widzę, że Vagrant instaluje mój katalog manifestu w / tmp / vagrant-puppet-2. Jeśli zmienię hiera.yamlplik i zastąpię :datadir:pełną ścieżką /tmp/vagrant-puppet-2/manifests/configuration, moje manifesty Marionetkowe będą miały dostęp do moich danych Hiera. Czy mogę to zrobić za pomocą ścieżki względnej?

greg_1_anderson
źródło

Odpowiedzi:

9

Znalazłem rozwiązanie podczas dokumentowania mojego pytania. Zmień: datadir: do odczytu:

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

Puppet poda ścieżkę do katalogu manifestu w $ settings :: manifestdir. Przechowywanie danych Hiera w katalogu manifestu jest przydatne, ponieważ Vagrant zamontuje ten katalog jawnie przed uruchomieniem Puppet w systemie gościa, a inne katalogi wybrane w tym celu mogą być niedostępne.

greg_1_anderson
źródło
Czy to oznacza, że ​​potrzebuję 2 hiera.yamlplików, jednego do użycia z włóczęgą, a drugiego do użycia z Puppet (w produkcji)?
Felipe Alvarez
Miałem tylko jeden plik hiera.yaml. Nie używam już tego zestawu, ale wierzę, że technika opisana w tej odpowiedzi nie działa już w najnowszych wersjach Puppet. Jeśli masz z tym problem, zapoznaj się z innymi odpowiedziami.
greg_1_anderson
2

hiera.yamlPracuję z Określa, :datadir: /etc/puppet/hieraa ja nie miałem szczęścia do ustawiania --yamldiropcji, jak niektóre z innych odpowiedzi podanych. Jednak po chwili zdałem sobie sprawę, że mogę po prostu zmapować moje hieradata do tej lokalizacji w vm gościa:

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

Działa to ładnie :-)

Stig Brautaset
źródło
To był dokładnie zestaw, który miałem. Utworzyłem zmapowany folder, config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")a także określiłem puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"w sekcjach konfiguracji lalek.
Felipe Alvarez
1

To właśnie robię we własnych eksperymentach z marionetkami.

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

Mój minimalistyczny hiera.yaml wygląda następująco:

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

W celach ilustracyjnych moja struktura katalogów na hoście (MacBook) wygląda następująco:

    .
    ├── 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
źródło
0

Twoim pierwotnym problemem było / jest to, że :datadirmusi to być ścieżka bezwzględna. Hiera nie pozwala na określenie ścieżek względnych dla :datadir. Jeśli uważasz, że powinno to być dozwolone, prześlij prośbę o zmianę .

manifestdir jest przestarzały . Zamiast tego możesz użyć yamldir . Możesz zastąpić to ustawienie, gdy przejdziesz zastosować marionetkę.

Dla włóczęgów:

 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

AKTUALIZACJA : Ponieważ musisz podać ścieżkę bezwzględną (i dlatego, że włóczęga), powinieneś skonfigurować swój własny folder współdzielony, abyś mógł jasno określić, gdzie on jest, i nie przyjmować założeń na ścieżce ustawiania włóczęgi do wykonania marionetki. Dodaj to do Vagrantfile:

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

a następnie zmień pierwszy wiersz powyżej na:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
ferventcoder
źródło
Dzięki za odniesienie do --yamldir; to jest bardzo pomocne. Problem polega jednak na tym, że muszę użyć ścieżki względnej. Gdybym podał ścieżkę bezwzględną, musiałbym użyć ["--yamldir / tmp / vagrant-puppet-2 / manifests / configuration"]; nie mogę jednak ufać, że / tmp / vagrant-puppet-2 będzie stabilną ścieżką. Czy istnieje zmienna, do której mogę się odwoływać w pliku Vagrantfile zawierającym tę ścieżkę? Czy mogę ustawić jakąś zmienną, aby określać, jakiej ścieżki użyć zamiast / tmp / vagrant-puppet-2? Wszystko, co wymyka się od zakładania, jakie ścieżki Vagrant zamierza wykorzystać, działałoby.
greg_1_anderson
@ greg_1_anderson możesz ustawić własne katalogi, w ten sposób wyrażasz się jasno o katalogu i nie zakładasz włóczęgów. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder
Zaktualizowałem odpowiedź. Również jeśli uważasz, że ścieżka względna byłaby pomocna, utwórz bilet na stronie bilety.puppetlabs.com/browse/HI - dzięki!
ferventcoder
Puppet dopuszcza ścieżki względne dla konfiguracji hiera datadir podczas działania puppet apply. Datadir będzie względny do bieżącego katalogu, w którym uruchomiono Puppet.
Nathan