流浪汉& EC2

时间:2012-07-06 09:57:17

标签: amazon-ec2 puppet vagrant

我查看了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',
}

由于

3 个答案:

答案 0 :(得分:7)

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

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

case $::virtual {
  'whatever vagrant returns' : {
    <vagrant specific provisionin>
   }
  'whatever the EC2 instance returns' : {
     <EC2 specific provisioning>
   }
   default : {
      fail("Unexpected virtual value of $::virtual")
   }
}

答案 1 :(得分:5)

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

原始回复:小心 - 你假设你只使用virtualbox进行流浪,反之亦然,但Vagrant正致力于支持其他虚拟化技术(例如kvm),并且有一天你可能会使用VirtualBox而不会流浪(例如用于生产) )。

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

答案 2 :(得分:3)

Vagrant有great utility for providing Puppet facts

  

facter(hash) - 要设置为可用facter变量的数据哈希   在木偶运行中。

例如,这是我的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时间内可用。