Как получить этот цикл для отображения всей информации о диске из файла VMSD - PullRequest
1 голос
/ 28 января 2011

Я бью голову над этим.Прошло 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"

1 Ответ

2 голосов
/ 28 января 2011

В цикле while сохраните номер диска в переменной и используйте его в следующем регулярном выражении (в if), например:

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) {

    my $disk = $1;   # save the disk number

    $snapshot0_adapter_number = "$+{ADAPTER}";
    $snapshot0_disk_number = "$+{DISK}";

    if ($vmsd_source =~ m/^snapshot0\.disk$disk\.fileName\s+=\s+"(?<VMDK_FILE>[^"]+?\.vmdk)"/xm) {
                                       ## ^ reuse the saved disk number

        $snapshot0_file = "$+{VMDK_FILE}";
    }
    $vmsd_disks{$server_label}{$vm}{"SCSI$snapshot0_adapter_number"}{"Disk$snapshot0_disk_number"} = "$snapshot0_file";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...