Я бью голову над этим.Прошло 2 дня, и я чувствовал, что попробовал по крайней мере полдюжины комбинаций в попытках завершить эту подпрограмму.
Проблема: подпрограмма работоспособна, но, как видно из хеш-вывода под ключом "nas "должно быть в списке 2 диска, но отображается только один, я убедился, что диск действительно указан в файле, и я почти на 98% уверен, что мое регулярное выражение имеет возможность сопоставить второй диск с именем" nas_1.VMDK».Первый из них называется "nas.vmdk" для справки.
Вот так выглядит мой вывод:
$VAR1 = {
'server02' => {
'nas' => {
'SCSI0' => {
'Disk1' => 'nas.vmdk'
}
}
},
'server01' => {
'NS02' => {
'SCSI0' => {
'Disk0' => 'NS02.vmdk'
}
},
'MX01' => {
'SCSI0' => {
'Disk0' => 'MX01.vmdk'
}
},
'NS01' => {
'SCSI0' => {
'Disk0' => 'NS01.vmdk'
}
},
'SQL01' => {
'SCSI0' => {
'Disk0' => 'SQL01.vmdk'
}
}
}
};
Как я уже говорил, виртуальная машина "nas" должна иметь диск 0 иdisk1, но отображается только disk1, это заставляет меня поверить, что значения для disk0 перезаписываются значениями для disk1, прежде чем они могут быть записаны в хеш, но я не уверен, где он идет не так.
Мой код:
sub discovery_find_snapshots {
foreach my $server_label (keys %virtual_machines) {
# Set the current server address to esx_host
my $esx_host = $config_file{$server_label}{address};
# Create a hash for storing the options needed by Net::OpenSSH
my %ssh_options = (
port => $config_file{$server_label}{port},
user => $config_file{$server_label}{user},
password => $config_file{$server_label}{password}
);
# Print the name of the server currently being discovered
print "Discovering snapshots for $esx_host\n";
# Create a new Net::OpenSSH object
my $ssh = Net::OpenSSH->new($esx_host, %ssh_options);
foreach my $vm (keys %{$virtual_machines{$server_label}}) {
# Create new scalars for ide port, ide disk, vmdk file and vmdk location
my $snapshot0_adapter_number;
my $snapshot0_disk_number;
my $snapshot0_file;
my $vmsd_source = $ssh->capture("cat $virtual_machines{$server_label}{$vm}{VMSD}");
if (! $vmsd_source eq '') {
while ($vmsd_source =~ m/^snapshot0\.disk([0-9]|1[0-5])\.node\s+=\s+"scsi(?<ADAPTER>[0-3])\:(?<DISK>([0-9]|1[0-5]))"/xmg) {
$snapshot0_adapter_number = "$+{ADAPTER}";
$snapshot0_disk_number = "$+{DISK}";
if ($vmsd_source =~ m/^snapshot0\.disk([0-9|1[0-5])\.fileName\s+=\s+"(?<VMDK_FILE>[^"]+?\.vmdk)"/xm) {
$snapshot0_file = "$+{VMDK_FILE}";
}
$vmsd_disks{$server_label}{$vm}{"SCSI$snapshot0_adapter_number"}{"Disk$snapshot0_disk_number"} = "$snapshot0_file";
}
} else {
print "$vm, no snapshot metadata found\n";
}
}
}
debug();
}
Подпрограмма "отладка" - это просто дополнительная подпрограмма, которую я сделал, чтобы позволить мне централизовать использование Data :: Dumper.
О да, япочти забыл.Это информация, с которой я пытаюсь сопоставить.
snapshot.lastUID = "1"
snapshot.numSnapshots = "1"
snapshot.current = "1"
snapshot0.uid = "1"
snapshot0.filename = "nas-Snapshot1.vmsn"
snapshot0.displayName = "Milestone - Test"
snapshot0.description = "Test for my script"
snapshot0.type = "1"
snapshot0.createTimeHigh = "301769"
snapshot0.createTimeLow = "-826832731"
snapshot0.numDisks = "2"
snapshot0.disk0.fileName = "nas.vmdk"
snapshot0.disk0.node = "scsi0:0"
snapshot0.disk1.fileName = "nas_1.vmdk"
snapshot0.disk1.node = "scsi0:1"