我目前正在将大量 EC2 实例转换为一系列 puppet 脚本,然后使用 Vagrant 虚拟化设备以进行本地开发。
我一直坚持在 vagrant 中管理网络并将其映射到生产中。
首先我有这样的事情:
# Main Web Server
config.vm.define :app do |app_config|
app_config.vm.host_name = "web1"
app_config.vm.network :hostonly, "10.0.0.2"
app_config.vm.box = "precise64"
...etc
puppet.manifest_file = "persist/web.pp"
end
# First DB server
config.vm.define :db1 do |db1_config|
db1_config.vm.host_name = "db1"
db1_config.vm.network :hostonly, "10.0.0.3"
db1_config.vm.box = "precise64"
...etc
puppet.manifest_file = "persist/db.pp"
end
etc.
然后在这种情况下,web.pp 和 db.pp 相当简单,它们只是设置了 python、uwsgi、nginx、mysql 等。
所以问题:我需要在里面例如puppet/modules/hosts/files/hosts
必须指定如下内容:
10.0.0.3 db1.X.com
10.0.0.4 db2.X.com
etc.
在生产中,我们结合使用我们的站点 DNS 和 ec2 实例 DNS 记录(我无法将其放入主机)。通常,我们的 haproxy 主机具有公共 DNS 记录,并且它们在其配置中保存 EC2 名称(这使得无法使用主机文件)。
那么如何构建一个 puppet 和 vagrant 都可以导入和使用全局映射的文件,例如:
hosts = {
web => 10.0.0.2,
db1 => 10.0.0.3,
db2 => 10.0.0.4,
}
例如,我可以从 puppet 模板中haproxy.cfg
访问,也可以从 Vagrant 文件中访问,因此我也可以vm.network
对其进行设置。
限制:
- 不能只是 IP,必须是 IP 或 DNS 的符号名称
- 不能使用 puppet master(不幸的是,这个不灵活)。
- 虚拟化 DNS 服务器也似乎很混乱,所以 id 而不是。
另外,我对 ruby 真的很陌生,如果您提供示例(这将是很棒的),请对其进行足够的描述,以便我能够通过 ruby 文档找到自己的方式。