4

我查看了puppet variables的文档,似乎无法理解如何将其应用于以下情况:

if vagrant (local machine)

phpfpm::nginx::vhost { 'vhost_name':
    server_name => 'dev.demo.com',
    root        => '/vagrant/public',
}

else if aws ec2 (remote machine)

phpfpm::nginx::vhost { 'vhost_name':
    server_name => 'demo.com',
    root        => '/home/ubuntu/demo.com/public',
}

谢谢

4

3 回答 3

7

尝试在您的 vagrant 主机和 EC2 实例上运行 facter,并寻找差异。我怀疑两个主机之间的“虚拟事实”可能不同,或者 EC2 可能会返回一堆 ec2_ 事实,这些事实不会出现在流浪主机上。

然后你可以使用这个事实作为一个顶级变量,如下所示。我也切换到 case 语句,因为这更容易维护恕我直言,而且您可以使用默认块进行错误检查。

case $::virtual {
  'whatever vagrant returns' : {
    <vagrant specific provisionin>
   }
  'whatever the EC2 instance returns' : {
     <EC2 specific provisioning>
   }
   default : {
      fail("Unexpected virtual value of $::virtual")
   }
}
于 2012-07-07T16:48:34.957 回答
5

注意:自发布此回复以来的三年中,Vagrant 引入了facter哈希选项。有关更多详细信息,请参阅下面的@thomas 答案。我相信这是正确的方法,并且使我提出的内核命令行技巧相当过时。但是,使用事实的理由并没有改变,只是得到了加强(例如,Vagrant 目前支持 AWS 提供商)。

原始回复:小心-您假设您只将virtualbox 用于vagrant,反之亦然,但Vagrant 正在努力支持其他虚拟化技术(例如kvm),您可能有一天会在没有vagrant 的情况下使用VirtualBox(例如用于生产)。

相反,我使用的技巧是在构建 basebox 时向内核传递一个“vagrant=yes”参数,然后可以通过 /proc/cmdline 访问该参数。然后您可以基于它创建一个新的事实(例如 /etc/vagrant 文件并在后续的事实运行中检查它)。

于 2012-09-25T07:53:01.707 回答
3

Vagrant在提供 Puppet 事实方面具有很大的实用性:

facter (hash) - 在 Puppet 运行中设置为可用因子变量的数据散列。

例如,这是我的 Vagrantfile 中带有 Puppet 设置的片段:

config.vm.provision "puppet", :options => ["--fileserverconfig=/vagrant/fileserver.conf"]  do |puppet|
    puppet.manifests_path = "./"
    puppet.module_path = "~/projects/puppet/modules"
    puppet.manifest_file  = "./vplan-host.pp"
    puppet.facter = {
      "vagrant_puppet_run" => "true"
    }
  end

然后我们利用这个事实,例如:

  $unbound_conf = $::vagrant_puppet_run ? {
    'true'  => 'puppet:///modules/unbound_dns/etc/unbound/unbound.conf.vagrant',
    default => 'puppet:///modules/unbound_dns/etc/unbound/unbound.conf',
  }

  file { '/etc/unbound/unbound.conf':
    owner  => root,
    group  => root,
    notify => Service['unbound'],
    source => $unbound_conf,
  }

请注意,该事实仅在puppet provision一段时间内可用。

于 2015-07-09T22:31:16.383 回答