gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:33 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com