Как настроить: datadir: при использовании Hiera с Puppet и Vagrant

10

Я хотел бы знать , как настроить :datadir:в hiera.yamlдля оптимального использования с кукольным и Vagrant. В настоящее время я использую vagrant 1.5.0 с virtualbox 4.2 на Ubuntu 13.10 с гостем Ubuntu 12.04 под управлением puppet 3.1.1

Я пытаюсь настроить среду, аналогичную этой публикации в блоге, Puppet Best Practices: Конфиги, специфичные для среды . В частности, мой Vagrantfile содержит:

  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

Я могу подтвердить, что hiera_config_pathэто правильно, потому что я получаю ошибку, если удаляю hiera.yaml.

puppet/hiera.yaml содержит:

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

И, кроме того, puppet/manifests/configuration/common.yamlсодержит:

---
myvar: "test"

Тестирование это из командной строки:

$ hiera -c hiera.yaml myvar
test

Все идет нормально. Однако, если я попытаюсь проверить это из файла манифеста марионетки, переменная не найдена, и я получу ошибку. Пример теста:

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

Ошибка:

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

Если я захожу в мою машину через ssh vagrant ssh, я вижу, что Vagrant монтирует мой каталог манифеста в / tmp / vagrant-puppet-2. Если я редактирую hiera.yamlфайл и заменяю :datadir:его полным путем /tmp/vagrant-puppet-2/manifests/configuration, тогда мои манифесты Puppet могут получить доступ к моим данным Hiera. Могу ли я сделать это с относительным путем, хотя?

greg_1_anderson
источник

Ответы:

9

Я нашел решение, документируя мой вопрос. Изменить: datadir: читать:

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

Puppet предоставит путь к каталогу манифеста в $ settings :: manifestdir. Хранение данных Hiera в каталоге манифеста полезно, поскольку Vagrant явно подключит этот каталог перед запуском Puppet в гостевой системе, и другие каталоги, которые вы можете выбрать для этой цели, могут быть недоступны.

greg_1_anderson
источник
Означает ли это, что мне нужно 2 hiera.yamlфайла, один для использования с vagrant и один для использования с Puppet (в производстве)?
Фелипе Альварес
У меня был только один файл hiera.yaml. Я больше не использую эту настройку, но считаю, что методика в этом ответе больше не работает в последних версиях Puppet. Если у вас есть проблемы с этим, пожалуйста, посмотрите другие ответы.
greg_1_anderson
2

hiera.yamlЯ работаю с специфицирует :datadir: /etc/puppet/hieraи у меня не было никакой удачи с установкой --yamldirопции , как некоторые из других ответов , указанных. Однако через некоторое время я понял, что могу просто сопоставить свои hieradata с этим местом на гостевой виртуальной машине:

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

Это хорошо работает :-)

Стиг Браутасет
источник
Это была именно та установка, которая была у меня. Я создал сопоставленную папку config.vm.synced_folder("D:/branches/preprod/hieradata", "/etc/puppet/hieradata")и также указал puppet.hiera_config_path = "D:/branches/preprod/hiera.yaml"в строфах конфигурации марионетки.
Фелипе Альварес
1

Это то, что я делаю в своих собственных кукольных экспериментах.

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

Мой минималистский hiera.yaml выглядит так:

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

И в целях иллюстрации моя структура каталогов на хосте (MacBook) выглядит следующим образом:

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

Ваша первоначальная проблема заключалась в том, что это :datadirдолжен быть абсолютный путь. Hiera не позволяет вам указывать относительные пути для :datadir. Если вы считаете, что это должно быть разрешено, отправьте запрос на его изменение .

manifestdir устарел . Вы можете вместо этого использовать yamldir . Вы можете переопределить эту настройку, когда передадите куклу.

Для бродяги:

 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

ОБНОВЛЕНИЕ : Так как вам нужно указать абсолютный путь (и потому что vagrant), вы должны настроить свою собственную общую папку, чтобы вы могли четко указать, где она находится, и не делать предположений относительно пути vagrant set для выполнения марионеток. Добавьте это к вашему Vagrantfile:

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

а затем измените первую строку выше на:

servername.vm.provision :puppet, :options => ["--yamldir /hieradata"]  do |puppet|
ferventcoder
источник
Спасибо за ссылку на --yamldir; это очень полезно Проблема, однако, заключается в том, что мне нужно использовать относительный путь. Если я укажу абсолютный путь, мне придется использовать ["--yamldir / tmp / vagrant-puppet-2 / manifest / configuration"]; однако я не могу поверить, что / tmp / vagrant-puppet-2 будет стабильным путем. Есть ли переменная, на которую я могу ссылаться в Vagrantfile, которая содержит этот путь? Или я могу установить некоторую переменную, чтобы указать, какой путь использовать вместо / tmp / vagrant-puppet-2? Все, что уходит от предположений о том, какие пути будет использовать Vagrant, будет работать.
greg_1_anderson
@ greg_1_anderson вы можете установить свои собственные каталоги, таким образом, вы явно говорите о каталоге и не делаете предположений о vagrant. config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder
Обновил ответ. Также, если вы считаете, что относительный путь будет полезным, пожалуйста, создайте тикет на tickets.puppetlabs.com/browse/HI - спасибо!
ferventcoder
Puppet разрешает относительные пути для конфигурации hiera datadir при запуске puppet apply. Datadir будет относительно текущего каталога, в котором запускался Puppet.
Натан,