如何设置:datadir:将Hiera与Puppet和Vagrant一​​起使用时


10

我想知道如何建立:datadir:hiera.yaml与日伪和流浪最佳利用。目前,我在运行木偶3.1.1的Ubuntu 12.04来宾上,在Ubuntu 13.10上将vagrant 1.5.0与virtualbox 4.2一起使用

我正在尝试建立一个类似于此博客文章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

到现在为止还挺好。但是,如果我尝试从up清单文件中进行测试,则找不到该变量,并且会出现错误。测试示例:

$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数据。我可以使用相对路径吗?

Answers:


9

我在记录问题时找到了解决方案。更改:datadir:读取:

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

Puppet将在$ settings :: manifestdir中提供清单清单的路径。将Hiera数据存储在清单目录中非常有用,因为Vagrant会在来宾系统中运行Puppet之前显式安装此目录,并且为此目的选择的其他目录可能不可用。


这是否意味着我需要2个hiera.yaml文件,一个用于vagrant,一个用于Puppet(在生产中)?
费利佩·阿尔瓦雷斯

我只有一个hiera.yaml文件。我不再使用此设置,但我认为此答案中的技术在Puppet的最新版本中不再起作用。如果您遇到问题,请参阅其他答案。
greg_1_anderson

2

hiera.yaml我与指定的工作:datadir: /etc/puppet/hiera,我曾与设置没有运气--yamldir的选择,因为一些指定的其他的答案。但是,一段时间后,我意识到我可以将hieradata映射到来宾vm上的该位置:

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

更新:由于您需要提供一个绝对路径(并且由于存在流浪汉),因此您应该设置自己的共享文件夹,这样您就可以清楚地知道共享文件夹的位置,而不必为执行木偶的流浪汉设置路径做任何假设。将此添加到您的Vagrantfile

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

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

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

感谢您对--yamldir的引用;这非常有帮助。但是,问题是我需要使用相对路径。如果输入绝对路径,则必须使用[“ --yamldir / tmp / vagrant-puppet-2 / manifests / configuration”]; 但是,我不相信/ tmp / vagrant-puppet-2将是稳定的道路。我可以在包含此路径的Vagrantfile中引用一个变量吗?还是可以设置一些变量来指定要使用的路径而不是/ tmp / vagrant-puppet-2?对Vagrant将使用的路径进行假设的任何方法都是可行的。
greg_1_anderson

@ greg_1_anderson,您可以设置自己的目录,这样您就可以清楚地了解目录,而无需对流浪汉做任何假设。config.vm.synced_folder "puppet/manifests/configuration", "/hieradata"
ferventcoder

更新了答案。另外,如果您认为相对路径会有所帮助,请在tickets.puppetlabs.com/browse/HI创建票证-谢谢!
ferventcoder

当运行时,Puppet确实允许hiera datadir配置的相对路径puppet apply。datadir将相对于运行Puppet的当前目录。
内森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.