Vagrant 的 puppet provisioner 无法正确读取 hiera.yaml 后端?

Vagrant 的 puppet provisioner 无法正确读取 hiera.yaml 后端?

我遇到了一个 puppet 问题,该问题特定于 Vagrant 使用 manifests/modules/hiera-config 及其 puppet 配置器的方式,因为“puppet apply site.pp”在生成的 vagrant 部署 VM 中运行良好(在客户操作系统本身本地应用时)。在包含 Vagrantfile 的目录中,我有一个“puppet_files”子目录,其中包含将复制到 VM 上的 /etc/puppet 的清单、模块和 hiera 文件(我使用带有“file”指令的 puppet 模块将这些文件复制到那里)。

我的主机环境是OSX,我正在使用vagrant在VirtualBox上部署Centos 6。

背景信息:

当我输入“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 中指定的位置复制源目录/文件。在 VM 本身上,puppet 目录被适当地挂载为 /vagrant/puppet_files。以下是 Vagrantfile 中与 puppet 配置相关的部分:

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 VM 中本地/手动应用时效果很好)。

问题:

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 中给出了正确的相对路径)并根据某种默认值进行操作?

底线:如果我在 Linux 环境中的 VM 上本地应用“puppet apply site.pp”,它可以完美运行,但它无法通过 puppet 配置器“以 Vagrant 方式”运行。我肯定错过了有关 Vagrant 的 hiera 配置如何工作的某些信息。

答案1

好吧,看来我遇到了两个不同的问题。最大的问题是,尽管我创建了一个名为“hieraconfig”的模块,它会将我预先创建的 hiera.yaml 和 common.json 文件复制到 /etc/puppet,但调用 hiera 的 jboss 模块会先执行(尽管我在清单中将它包含在 hieraconfig 之后 - 见下文)。我尝试修复此问题,首先在 site.pp 清单中评估 hierasetup,但它仍然首先运行 jboss 模块:

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

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

include ::hierasetup
include ::jboss

我目前还没有解决这个问题的方法。但至少我知道失败的部分原因是,当从 jboss 模块调用 hiera 时,/etc/puppet/hiera.yaml 和 /etc/puppet/hieradata/common.json 甚至不在 VM 上,因为 hierasetup 尚未运行。我暂时使用 Vagrant 的脚本配置程序而不是 puppet 来复制文件。

第二个问题是,因为我认为这些文件一直存在,所以我对“puppet.hiera_config_path”应该做什么感到很困惑。通过多次反复尝试,我发现了以下内容:

  1. puppet.manifests_路径puppet.模块路径, 和 puppet.hiera_配置路径仅指向主机上的路径(在我的情况下是 OSX)。如果您使用相对路径,请不要误以为它是相对于 VM 上的 /vagrant 挂载,而不是相对于主机上包含 Vagrantfile 的目录(尽管这显然是挂载到 /vagrant 的内容)。

  2. 其中每一个_小路变量,当且仅当它们在 Vagrantfile 中实际设置时(否则将搜索默认的 puppet 目录),将导致 Vagrant 将模块、清单和 hiera 配置复制到/tmp/vagrant-puppet[-X] (-X 可能是一个额外的数字后缀,如 /tmp/vagrant-puppet-1)并告诉 puppet 在 /tmp 下查找它们。

    如果你有你的木偶文件已经在虚拟机上您想要使用,但设置_小路变量,那么 Vagrant 的 puppet 命令将找不到它们,因为当您设置它们时,它会将 puppet 重定向到 /tmp/vagrant-puppet[-X]。您无法在 VM 上更改此目标,尽管“vagrant up”输出将通知您它们被映射到何处,如下所示:

    默认:/tmp/vagrant-puppet-1/manifests => /Users//vm_stuff/vagrant-fresh/puppet_files/manifests

    默认:/tmp/vagrant-puppet-1/modules-0 => /Users//vm_stuff/vagrant-fresh/puppet_files/modules

    => 箭头后的路径是您使用 Vagrantfile 中的 _path 变量指定的主机上的源目录。 => 箭头前的路径是 VM 上将复制源目录内容的位置。

    如果你希望 Vagrant 让 Puppet 在默认目录中查找你已经放置在 VM 上的文件(你不需要 Vagrant 将它们复制到 /tmp 中),那么不要指定任何_小路Vagrant 中的变量。或者,如果默认位置或 /tmp 位置都不令人满意,您可以通过使用以下代码明确指定查找每个变量的位置来完全覆盖默认的 Vagrant 行为puppet.选项 变量,如下所示:

    puppet.options =“--hiera_config=/path/to/hiera.yaml--modulepath'/path/to/modules/--manifestdir /path/to/manifests/”

如果出现任何故障,并且您已将 --verbose && --debug 设置作为 puppet.options 的一部分(可能也会显示没有设置的内容),您将收到一个错误,显示通过 ssh 发送到客户虚拟机的实际 puppet 命令,如下所示:

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 指向此命令中的正确位置/文件,它就应该可以毫无问题地读取您的配置。我暂时遇到了一个问题(在我发现 VM 上不存在 /etc/puppet/hieradata/common.json 之前),它会读取 hiera.yaml,但随后由于 common.json 缺失而失败。

虽然 hiera 看起来在非常具体的位置,但这取决于你是否设置“puppet.hiera_配置路径“或者不,除非您手动覆盖puppet.options。

相关内容