Назад | Перейти на главную страницу

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

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

Я пытаюсь создать среду, похожую на это сообщение в блоге, Рекомендации по работе с Puppet: конфигурации для конкретной среды. В частности, мой 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...

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

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

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

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

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

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

Это прекрасно работает :-)

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

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

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

manifestdir - это устарел. Вы можете предпочесть использовать Ямлдир вместо. Вы можете переопределить этот параметр при передаче марионеточного применения.

Для бродяг:

 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

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

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

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

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