如何使用自定义按钮从 Cloudforms 中的 VM 中删除磁盘?
How to remove disk from VM in Cloudforms, using custom Button?
目前,我正在 Cloudforms 中设置一个自定义按钮,以允许从使用 Cloudforms(连接到 ansible)配置的虚拟机中删除驱动器
我已经看了一会儿,经过一些挖掘发现了以下内容 https://github.com/ManageIQ/manageiq-automation_engine/blob/master/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb
更具体地说:
def remove_disk(disk_name, options = {})
sync_or_async_ems_operation(options[:sync], "remove_disk", [disk_name, options])
end
我假设了两件事,这可能会采用 vmdk 名称,并且工作方式与 "add_disk" 相同(vm.add_disk([#{vm.storage_name}]" , 大小 * 1024, :sync => true)).
我知道您可以通过提供的配置按钮使用 CLoudforms 的内置功能编辑磁盘,但是,由于客户要求,我们需要编辑 HAML 文件以删除某些功能。在每次更新 CloudForms 时重做 HAML 会适得其反。创建我们自己的自定义对话框为我们提供了所需的自定义。
# Get vm object
vm = $evm.root['vm']
raise "Missing $evm.root['vm'] object" unless vm
def log(level, message)
@method = 'Remove_Disk'
$evm.log(level, "#{@method} - #{message}")
end
$evm.create_notification(:audience => 'user', :level => :success, :message => "Lifecycle action 'Remove Disk' Initiated")
log(:info, "Started LCA to remove disk on vm: <#{vm}>")
# Remove disk from the VM
disk_choice = $evm.root['dialog_availabledisks'].to_i
if disk_choice.zero?
disk_name = "#{vm}"
$evm.create_notification(:audience => 'user', :level => :failure, :message => "Lifecycle action 'Remove Disk' Failed, OS Drive cannot be removed.")
log(:error, "C: Drive cannot be deleted")
exit MIQ_ABORT
else
disk_name = "#{vm}_#{disk_choice}"
end
log(:info, "Removing disk:<#{disk_name}> from #{vm}")
begin
vm.remove_disk(disk_name, :sync => true)
rescue => e
log(:error, "e: #{e}")
log(:error, "e.inspect: #{e.inspect}")
log(:error,"[#{e}]\n#{e.backtrace.join("\n")}")
log(:error, "e.message: #{e.message}")
end
exit MIQ_OK
我的代码运行没有任何错误,但是实际上并没有做任何事情,所选磁盘没有从 VM 中删除。相当确定我只是遗漏了一些明显的东西(或者我的假设不正确),有什么想法吗?
您好,我已使用您的代码成功地从 Cloudforms 中的 VM 中移除磁盘
但是我改变了一件小事
您正在使用 disk_name = "#{vm}_#{disk_choice}" 作为磁盘名称以便删除磁盘。但是这不是那样的。
您必须在 disk_name 中提及该磁盘的 Datastore 才能正常工作
你可以试试下面的代码
disk_name = "[your_datastore_name] #{vm}/#{vm}_#{disk_choice}.vmdk"
这对我来说很好..!!
您还可以考虑一件事,即 删除支持
Delete Backing => OFF [Default] 它只会将您的磁盘从 VM 中分离出来,但不会完全删除
所以你必须打开你的 Delete Backing 以便它也可以从存储域中完全删除磁盘
删除支持 => 开启
你可以探索here
谢谢..!!
目前,我正在 Cloudforms 中设置一个自定义按钮,以允许从使用 Cloudforms(连接到 ansible)配置的虚拟机中删除驱动器
我已经看了一会儿,经过一些挖掘发现了以下内容 https://github.com/ManageIQ/manageiq-automation_engine/blob/master/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb
更具体地说:
def remove_disk(disk_name, options = {})
sync_or_async_ems_operation(options[:sync], "remove_disk", [disk_name, options])
end
我假设了两件事,这可能会采用 vmdk 名称,并且工作方式与 "add_disk" 相同(vm.add_disk([#{vm.storage_name}]" , 大小 * 1024, :sync => true)).
我知道您可以通过提供的配置按钮使用 CLoudforms 的内置功能编辑磁盘,但是,由于客户要求,我们需要编辑 HAML 文件以删除某些功能。在每次更新 CloudForms 时重做 HAML 会适得其反。创建我们自己的自定义对话框为我们提供了所需的自定义。
# Get vm object
vm = $evm.root['vm']
raise "Missing $evm.root['vm'] object" unless vm
def log(level, message)
@method = 'Remove_Disk'
$evm.log(level, "#{@method} - #{message}")
end
$evm.create_notification(:audience => 'user', :level => :success, :message => "Lifecycle action 'Remove Disk' Initiated")
log(:info, "Started LCA to remove disk on vm: <#{vm}>")
# Remove disk from the VM
disk_choice = $evm.root['dialog_availabledisks'].to_i
if disk_choice.zero?
disk_name = "#{vm}"
$evm.create_notification(:audience => 'user', :level => :failure, :message => "Lifecycle action 'Remove Disk' Failed, OS Drive cannot be removed.")
log(:error, "C: Drive cannot be deleted")
exit MIQ_ABORT
else
disk_name = "#{vm}_#{disk_choice}"
end
log(:info, "Removing disk:<#{disk_name}> from #{vm}")
begin
vm.remove_disk(disk_name, :sync => true)
rescue => e
log(:error, "e: #{e}")
log(:error, "e.inspect: #{e.inspect}")
log(:error,"[#{e}]\n#{e.backtrace.join("\n")}")
log(:error, "e.message: #{e.message}")
end
exit MIQ_OK
我的代码运行没有任何错误,但是实际上并没有做任何事情,所选磁盘没有从 VM 中删除。相当确定我只是遗漏了一些明显的东西(或者我的假设不正确),有什么想法吗?
您好,我已使用您的代码成功地从 Cloudforms 中的 VM 中移除磁盘
但是我改变了一件小事
您正在使用 disk_name = "#{vm}_#{disk_choice}" 作为磁盘名称以便删除磁盘。但是这不是那样的。
您必须在 disk_name 中提及该磁盘的 Datastore 才能正常工作
你可以试试下面的代码
disk_name = "[your_datastore_name] #{vm}/#{vm}_#{disk_choice}.vmdk"
这对我来说很好..!!
您还可以考虑一件事,即 删除支持
Delete Backing => OFF [Default] 它只会将您的磁盘从 VM 中分离出来,但不会完全删除
所以你必须打开你的 Delete Backing 以便它也可以从存储域中完全删除磁盘
删除支持 => 开启
你可以探索here
谢谢..!!