如何在 Puppet 提供的 Vagrant 项目中跨环境共享清单
How to share manifests across environments in Puppet-provisioned Vagrant project
考虑以下 Puppet 提供的 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 - 每个环境一个清单,"Inherits" 来自单个项目范围的清单
经过一些阅读,我什至不确定这是可能的。曾经有一个 import
命令,我觉得它可能是我一直在寻找的东西,但在较新版本的 Puppet 中已被弃用。
2 - 每个环境一个项目范围的清单和一个 Hiera 文件
我认为这是两个选项中最没有吸引力的一个,因为它意味着区分环境的唯一方法是通过数据,而且有些东西可以用清单中的差异更好地表达。
但是我什至无法让它工作。给定 dev/
和 prod/
文件夹中的以下 environment.conf
个文件:
manifest = ../../manifests/default.pp
提示我无法找到 default.pp
文件。
基本上我需要一种方法来停止环境之间的重复。我的项目实际上比上面的更复杂,因为清单变得相当大而且笨重,而且我有两个以上的环境。我也觉得我在这里使用 Vagrant(它有自己的方式将选项传递给 Puppet)使事情变得更加复杂。
如有任何帮助,我们将不胜感激。
所以,这就是我的想法。不是我最初想要的,但我对 Puppet 还是个新手,甚至不相信我想要的是可能的。
我决定使用 hiera 数据来区分环境,现在使用单个清单 (default.pp
)。两个 site.pp
文件完全是空的,仅用作占位符,因此 Git 保留 dev
和 prod
文件夹。我没有将 environment.conf
文件指向清单,而是将以下内容添加到 Vagrantfile
:
puppet.manifest_file = "default.pp"
我也开始将东西放入他们自己的模块中,而不是拥有一个巨大的单一清单。
考虑以下 Puppet 提供的 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 - 每个环境一个清单,"Inherits" 来自单个项目范围的清单
经过一些阅读,我什至不确定这是可能的。曾经有一个 import
命令,我觉得它可能是我一直在寻找的东西,但在较新版本的 Puppet 中已被弃用。
2 - 每个环境一个项目范围的清单和一个 Hiera 文件
我认为这是两个选项中最没有吸引力的一个,因为它意味着区分环境的唯一方法是通过数据,而且有些东西可以用清单中的差异更好地表达。
但是我什至无法让它工作。给定 dev/
和 prod/
文件夹中的以下 environment.conf
个文件:
manifest = ../../manifests/default.pp
提示我无法找到 default.pp
文件。
基本上我需要一种方法来停止环境之间的重复。我的项目实际上比上面的更复杂,因为清单变得相当大而且笨重,而且我有两个以上的环境。我也觉得我在这里使用 Vagrant(它有自己的方式将选项传递给 Puppet)使事情变得更加复杂。
如有任何帮助,我们将不胜感激。
所以,这就是我的想法。不是我最初想要的,但我对 Puppet 还是个新手,甚至不相信我想要的是可能的。
我决定使用 hiera 数据来区分环境,现在使用单个清单 (default.pp
)。两个 site.pp
文件完全是空的,仅用作占位符,因此 Git 保留 dev
和 prod
文件夹。我没有将 environment.conf
文件指向清单,而是将以下内容添加到 Vagrantfile
:
puppet.manifest_file = "default.pp"
我也开始将东西放入他们自己的模块中,而不是拥有一个巨大的单一清单。