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

Провайдер марионеток Vagrant неправильно читает бэкэнд hiera.yaml?

У меня есть проблема с марионеткой, которая специфична для способа, которым Vagrant использует манифесты / модули / hiera-config со своим инициатором марионеток, поскольку "puppet apply site.pp" отлично работает в результирующей развернутой виртуальной машине vagrant (при локальном применении в сама гостевая ОС). В каталоге с Vagrantfile у меня есть подкаталог «puppet_files» с манифестами, модулями и файлами hiera, которые будут скопированы в / etc / puppet на виртуальной машине (я использую модуль puppet с директивами «file» для копирования этих файлов туда ).

Моя хост-среда - OSX, и я использую vagrant для развертывания Centos 6 на VirtualBox.

Исходная информация:

Когда я набираю "vagrant up", я вижу следующее:

==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Mounting shared folders...
    default: /vagrant => /Users/juser/vm_stuff/vagrant-fresh
    default: /tmp/vagrant-puppet-1/manifests => /Users/juser/vm_stuff/vagrant-fresh/puppet_files/manifests
    default: /tmp/vagrant-puppet-1/modules-0 => /Users/juser/vm_stuff/vagrant-fresh/puppet_files/modules
==> default: Running provisioner: shell...

Таким образом, похоже, что он создает временные файлы в моей файловой системе OSX и копирует исходные каталоги / файлы из того места, где я указал в Vagrantfile. На самой виртуальной машине каталог марионеток соответствующим образом монтируется как / vagrant / puppet_files. Вот соответствующий раздел Vagrantfile для конфигурации марионетки:

config.vm.provision "puppet" do |puppet|
    puppet.manifests_path = "puppet_files/manifests"
    puppet.module_path    = "puppet_files/modules"
    puppet.hiera_config_path = "puppet_files/hiera_config/hiera.yaml"
    puppet.manifest_file  = "site.pp"
    puppet.options = "--verbose --debug"
  end

Site.pp имеет только две важные линии (вызывая два модуля):

include ::hierasetup
include ::jboss

А файл hiera.yaml выглядит так:

:backends:
        - json

:logger: console

:hierarchy:
        - "node/%{::fqdn}"
        - common

:json:
    :datadir: '/etc/puppet/hieradata/'

И мой модуль hierasetup (называемый в site.pp) также копирует файл json hiera в /etc/puppet/hieradata/common.json. И, к вашему сведению, модуль jboss - это модуль, который пытается использовать hiera с «hiera_hash» и «create_resources» (который отлично работает при локальном / ручном применении в виртуальной машине Linux).

Эта проблема:

У Vagrant нет проблем с импортом манифестов и модулей и даже с применением манифеста, но он постоянно не может прочитать мой файл hiera.yaml (правильно?), Потому что если бы он это сделал, он бы увидел, что я указал json, а не yaml в качестве бэкэнда:

Debug: importing '/tmp/vagrant-puppet-1/modules-0/hierasetup/manifests/init.pp' in environment production
Debug: Automatically imported hierasetup from hierasetup into production
Debug: importing '/tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp' in environment production
Debug: Automatically imported jboss from jboss into production
Debug: hiera(): Hiera YAML backend starting
Debug: hiera(): Looking up jbossas in YAML backend
Debug: hiera(): Looking for data source common
Debug: hiera(): Cannot find datafile /var/lib/hiera/common.yaml, skipping

Error: create_resources(): second argument must be a hash at /tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp:14 on node josh-new.morgan.haib.org
Wrapped exception:
create_resources(): second argument must be a hash

Error: create_resources(): second argument must be a hash at /tmp/vagrant-puppet-1/modules-0/jboss/manifests/init.pp:14 on node josh-new.morgan.haib.org
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

puppet apply --verbose --debug --modulepath '/tmp/vagrant-puppet-1/modules-0:/etc/puppet/modules' --hiera_config=/tmp/vagrant-puppet-1/hiera.yaml --manifestdir /tmp/vagrant-puppet-1/manifests --detailed-exitcodes /tmp/vagrant-puppet-1/manifests/site.pp || [ $? -eq 2 ]

Почему он ищет common.yaml, а не /etc/puppet/hieradata/common.json? Почему он думает, что это серверная часть YAML, а не JSON? Он не читает мой файл hiera.yaml (которому я указал правильный относительный путь в Vagrantfile) и не работает с какими-то значениями по умолчанию?

Нижняя граница: «Puppet apply site.pp» отлично работает, если я нахожусь в среде Linux на виртуальной машине, применяя его локально, но он не работает «бродячим способом» с инициатором марионетки. Должно быть, мне что-то не хватает о том, как конфигурация hiera работает для Vagrant.

Итак, похоже, я столкнулся с двумя разными проблемами. Самая большая проблема заключалась в том, что, хотя у меня был созданный мной модуль под названием "hieraconfig", который копировал мои предварительно созданные файлы hiera.yaml и common.json в / etc / puppet, модуль jboss, который вызывает hiera, выполнялся первым (хотя я включил это после hieraconfig в манифесте - см. ниже). Я попытался исправить это, чтобы сначала оценить hierasetup в манифесте site.pp, но он все равно сначала запустил модуль jboss:

stage { 'pre':
  before => Stage['main']
}

# add the hierasetup module to the new 'pre' run stage
class { 'hierasetup':
  stage => 'pre'
}

include ::hierasetup
include ::jboss

У меня нет текущего исправления для этого. Но, по крайней мере, я знаю, что часть отказа заключалась в том, что /etc/puppet/hiera.yaml и /etc/puppet/hieradata/common.json даже не присутствовали на виртуальной машине, когда hiera вызывалась из модуля jboss, поскольку hierasetup еще не бегал. Я сделал эту работу временно, используя средство подготовки сценариев Vagrant вместо марионетки, чтобы скопировать файлы для меня.

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

  1. puppet.manifests_path, puppet.modules_path, и puppet.hiera_config_path указывает только на пути на хост-машине (в моем случае на OSX). Не обманывайтесь, думая, что если вы используете относительные пути, они относятся к монтированию / vagrant на виртуальной машине, а не к каталогу, содержащему ваш Vagrantfile на хост-машине (хотя это, очевидно, то, что монтируется к / бродяга).

  2. Каждый из тех _дорожка переменные, ЕСЛИ и ТОЛЬКО ЕСЛИ они фактически установлены в Vagrantfile (в противном случае будут выполняться поиск в каталогах марионеток по умолчанию), заставит Vagrant скопировать модули, манифесты и конфигурацию hiera в подкаталоги под / tmp / vagrant-puppet [-X] (с -X, возможно, является дополнительным суффиксом числа, например / tmp / vagrant-puppet-1) и скажите puppet искать их в / tmp.

    Если у вас есть файлы марионеток уже на ВМ который вы хотите использовать, но установите _дорожка переменных, то команда puppet Vagrant их не найдет, потому что она перенаправляет puppet в / tmp / vagrant-puppet [-X], когда вы их устанавливаете. Вы не можете изменить это место назначения на виртуальной машине, хотя вывод "vagrant up" уведомит вас, где они отображаются, следующим образом:

    по умолчанию: / tmp / vagrant-puppet-1 / manifest => / Users // vm_stuff / vagrant-fresh / puppet_files / manifest

    по умолчанию: / tmp / vagrant-puppet-1 / modules-0 => / Users // vm_stuff / vagrant-fresh / puppet_files / modules

    Путь после стрелки => - это исходный каталог на вашем хост-компьютере, который вы указали с помощью переменных _path в Vagrantfile. Путь перед стрелкой => - это место на виртуальной машине, куда будет скопировано содержимое исходного каталога.

    Если вы вместо этого предпочитаете, чтобы Vagrant выглядел марионеткой в ​​каталогах по умолчанию для файлов, которые вы уже разместили на виртуальной машине (которые вам не нужно копировать Vagrant для вас в / tmp), не указывайте никаких _дорожка переменные в Vagrant. В качестве альтернативы, если ни расположение по умолчанию, ни расположение / tmp не являются удовлетворительными, вы можете полностью переопределить поведение Vagrant по умолчанию, явно указав, где искать каждое с помощью puppet.options переменная, например:

    puppet.options = "--hiera_config = / путь / к / hiera.yaml --modulepath '/ путь / к / модулям / --manifestdir / путь / к / манифестам /"

Если что-то не удается и вы установили --verbose && --debug как часть puppet.options (возможно, он будет отображаться и без них), вы получите сообщение об ошибке, показывающее фактическую команду puppet, отправленную через ssh на гостевую виртуальную машину, как это:

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

puppet apply --verbose --debug --modulepath '/tmp/vagrant-puppet-1/modules-0:/etc/puppet/modules' --manifestdir /tmp/vagrant-puppet-1/manifests --hiera_config=/tmp/vagrant-puppet-1/hiera.yaml --detailed-exitcodes /tmp/vagrant-puppet-1/manifests/site.pp || [ $? -eq 2 ]

Пока --hiera_config указывает на правильное местоположение / файл в этой команде, он должен без проблем прочитать вашу конфигурацию. У меня возникла временная проблема (до того, как я обнаружил, что /etc/puppet/hieradata/common.json отсутствует на виртуальной машине), где он прочитал hiera.yaml, но затем не смог из-за отсутствия common.json.

Все сказано и сделано, хотя hiera смотрит в очень определенных местах в зависимости от того, настроили ли вы "puppet.hiera_config_path"или нет, если вы вручную не переопределите puppet.options.