ruby - 用于从 shell 管理 Virtualbox 的 Vagrant Ruby 代码

标签 ruby linux shell virtualbox vagrantfile

我在 Debian shell 中创建了一个 sh 脚本来自动创建基于不同操作系统的 Vagrantfile,例如管理存储 Controller (Debian 的 Sata Controller 或 CentOS 的 IDE Controller )。为了管理磁盘大小,我分析了 box 默认磁盘 (vmdk),转换为 vdi 以进行 Virtualbox native 管理。

问题在于使用 Ruby 代码分析 VM 数据。

storagecontroller = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g']
storagecontrollertype = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollertype0 | cut -d '=' -f 2 | sed 's/\"//g']
storagecontrollerportcount = %x[VBoxManage showvminfo $machinename'-'master --machinereadable | grep storagecontrollerportcount0 | cut -d '=' -f 2 | sed 's/\"//g']

此代码在机器已经创建并且我使用时有效:

vagrant reload

但是当我尝试做的时候

vagrant up

问题是机器目录中不存在机器。我在 shell 中收到错误。 错误:

Message: Errno::ENOENT: No such file or directory @ dir_chdir - /root/VirtualBox VMs/projectname/machinename-master

问题是,我想分析机器磁盘,但是这个 Ruby 代码在机器创建之前执行,我需要一种方法来在机器创建之后执行此操作,但是当在 shell 中调用 vagrant up 语句时。

这是我生成的代码的一部分。

config.vm.define "machinename" do |machinename|
       machinename.vm.box ="debian/contrib-jessie64"
       machinename.vm.hostname = "machinename"
       machinename.vm.provider "virtualbox" do |virtualbox|
       virtualbox.memory = "2048"
       virtualbox.cpus = "8"
       virtualbox.name = "machinename-master"
       virtualbox.customize [
         "modifyvm", :id, "--groups", "/projectname"
       ]
       storagecontroller = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g']
       path = File.join [ENV["HOME"], 'VirtualBox VMs/','projectname','machinename-master']
       Dir.chdir("#{path}")
       storagecontroller = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollername0 | cut -d '=' -f 2 | sed 's/\"//g']
       storagecontroller.delete!("\n")
       storagecontrollertype = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollertype0 | cut -d '=' -f 2 | sed 's/\"//g']
       storagecontrollertype.delete!("\n")
       storagecontrollerportcount = %x[VBoxManage showvminfo machinename'-'master --machinereadable | grep storagecontrollerportcount0 | cut -d '=' -f 2 | sed 's/\"//g']
       storagecontrollerportcount.delete!("\n")
       require "find"
       file=Dir['*.vmdk'].first
       if !File.exist?('/root/VirtualBox VMs/projectname/machinename-master/machinename-box.vdi')
                            virtualbox.customize [
                                    "storagectl", :id,
                                    "--name", "#{storagecontroller}",
                                    "--controller", "#{storagecontrollertype}",
                                    "--portcount", "#{storagecontrollerportcount}",
                                    "--hostiocache", "on"
                            ]
                            virtualbox.customize [
                                    "clonehd", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/box-disk1.vmdk",
                                        "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/ojocuidao-box.vdi",
                                    "--format", "VDI"
                            ]
                            virtualbox.customize [
                                    "modifyhd", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/machinename-box.vdi",
                                    "--resize", 55 * 1024
                            ]
                            virtualbox.customize [
                                    "storageattach", :id,
                                    "--storagectl", "#{storagecontroller}",
                                    "--port", "0",
                                    "--device", "0",
                                    "--type", "hdd",
                                    "--nonrotational", "on",
                                    "--medium", "#{ENV["HOME"]}/VirtualBox VMs/projectname/#{virtualbox.name}/machinename-box.vdi"
                            ]

调用 shell 的 ruby​​ 语句是在创建机器之前执行的,所以我需要在下载框并创建 VM 后立即定位这些语句和 vagrantfile disk customize 语句。

有人可以帮助我吗?

最佳答案

我已经解决了阅读 vagrant 函数调用语句参数的问题。

用 ruby​​ 编写:

if !(ARGV[0] == "up")

然后我从 shell 脚本执行 vagrant reload 和我添加到 Vagrantfile 的规定。

关于ruby - 用于从 shell 管理 Virtualbox 的 Vagrant Ruby 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883218/

相关文章:

ruby - 无法在 Windows 上安装 Thin

linux - 用于安排多个作业的 Bash 脚本

linux - awk:从文件中获取字符串时,Shell 变量未显示

shell - 在带有包含路径的变量的 shell 脚本中使用 cd 命令在 Windows 10 主机的 CentOS virtualbox 环境中不起作用

r - 来自 Shell 的 R CMD BATCH 模式中的参数

ruby-on-rails - 使用 Ajax 的 RoR 主从细节

ruby-on-rails - 当我从未使用过 mongodb 时,Rails App 尝试使用 mongodb

ruby-on-rails - 在 Rails 中上传图片

linux - 是否有 'git sed' 或等价物?

mysql - 当非空结果集时,MySQL 可以给出非零返回码吗?