Vagrant 检查是否已完成流浪设置

Vagrant 检查是否已完成流浪设置,vagrant,Vagrant,我正在使用Vagrant部署VM进行开发。其中一个要求是vagrant provision创建一个新用户(在我编写的配置脚本中完成),然后vagrant ssh作为该用户连接到该框 我不知道如何判断这个盒子是否已经准备好了 我看到Vagrant provisioning设置了env[:provision\u enabled],如果这个运行应该进行配置,那么我想我可以这样做: if env[:provision_enabled] config.ssh.username = "#{data['s

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

我不知道如何判断这个盒子是否已经准备好了


我看到Vagrant provisioning设置了
env[:provision\u enabled]
,如果这个运行应该进行配置,那么我想我可以这样做:

if env[:provision_enabled]
  config.ssh.username = "#{data['ssh']['provision_username']}"
else
  config.ssh.username = "#{data['ssh']['username']}"
end
其思想是,用于资源调配的SSH连接将使用一个连接,而用于其他所有内容的SSH连接将使用另一个连接


但是,
env[:provision\u enabled]
似乎无法在
vagrant文件中访问


有什么方法可以做到这一点吗?

我找不到一个简单的方法。听起来最简单的解决方案应该是检查设置结果,即您是否可以使用设置后创建的用户登录


另一个选项是始终运行
vagrant reload--provision
,以确保框在继续之前处于已设置状态。

这似乎是由vagrant data dir(
.vagrant/
中的
操作\u provision
文件)确定的。它通常与您的
vagrant文件
位于同一文件夹中

因此,一个粗略的解决方法是根据文件是否存在,在文件中设置ssh用户名。虽然我还不能测试这个,但是如果您只是重命名或删除
操作\u设置
文件,然后转到
vagrant reload
,它应该再次设置。

编辑

他太快了,不先试一试就答不上来。下面链接中的代码可能在以前的版本中有效,但是在1.7.2中它将不起作用;您需要稍微调整一下:

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

  ...
end
下面的原始答案

我来这里是为了寻找同一个问题的答案,但现有的问题没有一个是令人满意的,因此我在github上找到了关于如何满足您的需求的评论:

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

  ...
end

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

因此,对于那些正在寻找准备使用
Vagrantfile
代码说明的人,下面是一个检查VM是否已配置和使用示例的函数:

#用于检查VM是否已配置的函数
已设置def?(vm_name='default',provider='virtualbox')
File.exist?(“.vagrant/machines/#{vm_name}/#{provider}/action_provision”)
结束
Vagrant.configure(“2”)do | config|
#如果设置了VM,请执行一些特殊操作
config.ssh.username='custom_username'是否已设置?
[...]
结束
警告!这是一种检查
action\u provision
文件存在性的黑客方法。 但它是有效的,在发布的那一刻,没有其他好方法


运行
vagrant reload--provision
没有帮助,因为我需要在
vagrant文件中设置应该使用哪个用户登录才能首先进行设置。类似于:
ssh-q“#{data['ssh']['username']}@主机退出;如果$?==0;则echo“已设置”;否则echo“需要设置”
;fi“在您的情况下可能吗?这将测试在设置过程中创建的用户是否可以进行ssh连接,这意味着如果设置成功,则表示已进行设置。为什么要这样做?设置始终作为根afaik完成。另外,Vagrant将知道它是否已在
Vagrant up
@Jahaja上设置。设置总是以root用户的身份进行设置是不正确的。如果设置了
config.ssh.username
,则设置是以该用户的身份进行的。我想以
Vagrant
root
用户的身份继续设置,但随后切换到一个在为将来的所有SSH访问设置期间创建。我还没有必要更改SSH的用户名,因此您可能是对的。但是,文档说明,对于SSH,默认情况下是以特权用户身份运行。
privileged(boolean)-指定是否以特权用户身份执行shell脚本(sudo)。默认情况下,这是“true”。
因此我猜您希望切换到设置之外的非特权用户?@Jahaja重要的一点是:我希望切换到启动设置时VM上还不存在的用户。
env[:provision\u enabled]
不可访问,因为Vagrant文件是在创建环境之前解析的。此信息可供Provisioniers和插件使用,但由于加载顺序的原因,Vagrant文件本身不可用。(请参阅)这与我最终尝试执行的操作非常接近。(然而,最后,我决定构建一个已经有用户的自定义框文件,而不是在设置时尝试创建用户。)太好了,我建议您看看如何自动构建流浪框。这正是我正在使用的。