使用 Hiera 与 Puppet 和 Vagrant 时如何设置 :datadir:

使用 Hiera 与 Puppet 和 Vagrant 时如何设置 :datadir:

我想知道如何设置:datadir:才能hiera.yaml最佳地使用 Puppet 和 Vagrant。目前我在 Ubuntu 13.10 上使用 vagrant 1.5.0 和 virtualbox 4.2,Ubuntu 12.04 客户机运行 puppet 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

到目前为止一切顺利。但是,如果我尝试从 Puppet 清单文件中测试这一点,则无法找到该变量,并且会出现错误。示例测试:

$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 数据。但是,我可以使用相对路径来执行此操作吗?

答案1

我在记录我的问题时找到了解决方案。将 :datadir: 更改为:

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

Puppet 将在 $settings::manifestdir 中提供清单目录的路径。将 Hiera 数据存储在清单目录中很有用,因为 Vagrant 将在客户系统中运行 Puppet 之前明确挂载此目录,而您为此目的选择的其他目录可能不可用。

答案2

hiera.yaml正在使用的指定:datadir: /etc/puppet/hiera,我没有--yamldir像其他答案所指定的那样设置选项。然而,过了一会儿我意识到我可以将我的层次数据映射到来宾虚拟机上的那个位置:

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

效果很好:-)

答案3

这就是我在自己的木偶实验中所做的事情。

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

答案4

您最初的问题是:datadir需要是绝对路径。Hiera 不允许您为 指定相对路径:datadir。如果您认为应该允许这样做,请提交更改请求

manifestdir 是已弃用. 您可能更喜欢使用亚姆尔迪尔相反。您可以在传递 puppet apply 时覆盖该设置。

对于流浪者来说:

 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 为 puppet 执行设置的路径做出假设。将其添加到您的Vagrantfile

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

然后将上面的第一行更改为:

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

相关内容