如何在Puppet-provisioned Vagrant项目中跨环境共享清单

时间:2015-10-03 15:09:52

标签: vagrant manifest puppet environment

考虑以下Puppet-provisioned Vagrant项目目录结构:

environments/
  dev/
    manifests/
      site.pp   <- Some standard Puppet stuff in here.
  prod/
    manifests/
      site.pp   <- Very similar to dev/manifests/site.pp, but with some prod differences
manifests/
  default.pp    <- Empty, but a place I'd like to keep common parts of the site.pp files
modules/
Vagrantfile     <- See below.
Puppetfile

和以下(简化)Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

envs = ["local", "dev"]

Vagrant.configure(2) do |config|
  config.vm.box = "puppetlabs/centos-7.0-64-puppet"

  envs.each do |env|
    config.vm.define env do |node|
      node.vm.provision "puppet" do |puppet|
        puppet.environment_path = "environments"
        puppet.module_path = "modules"
        puppet.environment = env
      end
    end
  end
end

如果我想将两个site.pp文件的公共部分分解为单个文件,我可以使用哪些选项?

我尝试了以下策略无济于事:

1 - 从单个项目范围的清单中“继承”每个环境的一个清单

经过一番阅读后,我甚至不确定这是可能的。曾经有import命令,我觉得这可能是我想要的,但在较新版本的Puppet中已被弃用。

2 - 每个环境单个项目范围的清单和一个Hiera文件

我认为这是两个选项中最不具吸引力的,因为它意味着区分环境的唯一方法是通过数据,有些事情只是通过清单中的差异来更好地表达。

然而我甚至无法让它发挥作用。鉴于environment.confdev/文件夹中的以下prod/个文件:

manifest = ../../manifests/default.pp

给我一​​个关于无法找到default.pp文件的错误。

基本上我需要一种方法来阻止环境之间的重复。我的项目实际上比上面的更复杂,因为清单变得相当庞大和笨重,而且我有两个以上的环境。我也觉得我在这里使用Vagrant这一事实(它有自己的方式将选项传递给Puppet)使事情变得复杂。

任何帮助都会在这里受到赞赏。

1 个答案:

答案 0 :(得分:1)

所以,这就是我的目标。不是我原本想要的,但我仍然是Puppet的新手,甚至不相信我想要的是可能的。

我决定使用hiera数据来区分环境,现在使用单个清单(default.pp)。这两个site.pp文件是完全空的,并且仅作为占位符存在,因此Git保留devprod个文件夹。我没有将environment.conf文件指向清单,而是将以下内容添加到Vagrantfile

puppet.manifest_file = "default.pp"

我也已经开始将东西放入他们自己的模块中,而不是拥有巨大的整体清单。