检查是否已完成Vagrant配置

时间:2014-07-20 22:46:30

标签: vagrant

我正在使用Vagrant来部署VM以进行开发。其中一个要求是vagrant provision创建了一个新用户(在我编写的配置脚本中完成),然后vagrant ssh以该用户身份连接到该框。

我无法弄清楚如何判断盒子是否已配置。

我看到Vagrant配置code设置env[:provision_enabled]如果此次运行应该进行配置,那么我认为我可以做这样的事情:

if env[:provision_enabled]
  config.ssh.username = "#{data['ssh']['provision_username']}"
else
  config.ssh.username = "#{data['ssh']['username']}"
end

我们的想法是,用于配置的SSH连接将使用一个连接和SSH连接,其他一切将使用另一个连接。

但是,env[:provision_enabled]似乎无法访问Vagrantfile

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:12)

因此,对于那些正在寻找准备使用Vagrantfile代码指令的人来说,这里有一个函数可以检查VM是否已配置和用法示例:

# Function to check whether VM was already provisioned
def provisioned?(vm_name='default', provider='virtualbox')
  File.exist?(".vagrant/machines/#{vm_name}/#{provider}/action_provision")
end

Vagrant.configure("2") do |config|
  # do something special if VM was provisioned
  config.ssh.username = 'custom_username' if provisioned?

  [...]
end
  

警告!这是检查action_provision文件存在的hackery方法。   但它有效,而且在发布时,没有其他好方法。

答案 1 :(得分:8)

这似乎是由Vagrant数据目录(action_provision)中的.vagrant/文件决定的。它通常与Vagrantfile位于同一文件夹中。

所以一个粗略的解决方法是在Vagrantfile中设置ssh用户名,具体取决于文件是否存在。我虽然无法对此进行测试,但如果您只是重命名或删除action_provision文件并转到vagrant reload,则应再次进行配置。

答案 2 :(得分:2)

我无法找到一种直截了当的方式。听起来最简单的解决方案就是检查配置结果,即您可以使用配置后创建的用户登录吗?

另一种选择是始终运行vagrant reload --provision以确保该框在继续之前处于预配状态。

答案 3 :(得分:2)

编辑

如果不首先尝试,就太快回答了。下面链接中的代码可能在以前的版本中有效,但在1.7.2中它不起作用;你需要稍微调整一下:

Vagrant.configure("2") do |config|
  if ARGV[0] == "ssh"
      config.ssh.username = 'other_username'
  end

  ...
end

以下原始答案

来到这里寻找同一个问题的答案,但现有的答案都不太令人满意,所以通过更多的挖掘,我发现{github上有this评论你如何能够满足你的要求:

Vagrant.configure("2") do |config|
  if VAGRANT_COMMAND == "ssh"
      config.ssh.username = 'other_username'
  end

  ...
end

您只需检查您发出的vagrant命令是否为ssh,然后它将使用您指定的用户名。