【问题标题】:Check if Vagrant provisioning has been done检查是否已完成 Vagrant 配置
【发布时间】:2014-09-11 09:35:46
【问题描述】:

我正在使用 Vagrant 部署虚拟机进行开发。其中一个要求是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 中访问。

有没有办法做到这一点?

【问题讨论】:

  • 您为什么要这样做?配置始终以 root afaik 身份完成。此外,Vagrant 会知道它是否已在 vagrant up 上配置
  • @Jahaja 始终以 root 身份进行配置是不正确的。如果设置了config.ssh.username,则以该用户的身份进行配置。我想继续以 vagrant 或 root 用户的身份进行配置,但随后切换到在配置期间为所有未来 SSH 访问创建的用户。
  • 我还没有需要更改 ssh 的用户名,所以你可能是对的。但是文档指出,对于 SSH,默认设置是以特权用户身份运行。 privileged (boolean) - Specifies whether to execute the shell script as a privileged user or not (sudo). By default this is "true". 所以我猜你想在配置之外切换到非特权用户?
  • @Jahaja 重点是:我想在配置开始时切换到VM 上尚不存在的用户。
  • env[:provision_enabled] 不可访问,因为在创建环境之前解析了 Vagrantfile。由于加载顺序,此信息可用于供应商和插件,但不能用于 Vagrantfile 本身。 (见Vagrant issue #7043)

标签: vagrant


【解决方案1】:

因此,对于那些正在寻找准备使用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 文件存在的黑客方法。 但它有效,在发布的那一刻,没有其他好的方法。

【讨论】:

    【解决方案2】:

    编辑

    在没有先尝试之前回答太快了。以下链接中的代码可能在以前的版本中可以使用,但是在 1.7.2 中将无法使用;你需要稍微调整一下:

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

    下面的原始答案

    来到这里寻找相同问题的答案,但现有的问题都不是很令人满意,所以经过更多挖掘,我发现this github 上关于如何满足您的要求的评论:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这与我最终尝试做的非常接近。 (不过,最后,我决定构建一个已经拥有用户的自定义 BOX 文件,而不是在配置时尝试创建用户。)
      • 太好了,我建议您看看 packer.io 以自动构建 vagrant box。
      • 这正是我正在使用的。
      【解决方案4】:

      我找不到这样做的直接方法。听起来最简单的解决方案是检查配置结果,即您可以使用配置后创建的用户登录吗?

      另一种选择是始终运行 vagrant reload --provision 以确保盒子处于配置状态,然后再继续。

      【讨论】:

      • 运行vagrant reload --provision 无济于事,因为我需要在Vagrantfile 中设置应该使用哪个用户登录才能首先进行配置。
      • 类似于:ssh -q "#{data['ssh']['username']}@host exit; if $? == 0; then echo 'Is provisioned'; else echo 'Needs provisioned';在你的情况下可能吗?这将测试是否可以与在配置期间创建的用户建立 ssh 连接,这意味着如果成功,则配置已经发生。
      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2011-10-18
      • 2017-11-13
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多