我正在使用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
。
有办法做到这一点吗?
答案 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
,然后它将使用您指定的用户名。