среда, 25 июля 2012 г.

Чистка datastore (часть 2)

И так, продолжим очистку наших дисков от старых виртуальных машин.
В первой части (ссылка) мы получили два списка:
1. список зарегистрированных машин с их файлами.
2. список файлов с их директориями, находящимися на всех Datastore.

Этот скрипт поможет вычислить файлы, которые есть в одном списке (datastore.log) и нет в другом (vm.log).


#!/bin/bash

# cat vm.log | gawk -F, '{printf("%s\n", $2)}' | tr -d \"

cat datastore.log1 | gawk -F, '
BEGIN {
c=1;
while (getline < "vm.log_files" > 0) {
vm[c] = $0;
c++;
}
}
{
i=1
j=1
while (i < c) {
printf("%d: %s\n", i, vm[i]);
printf("---\n%s\n---\n", $2);
# printf("%d\n", index(vm[i], $2));
if (index(vm[i], $2) != 0) {
printf("match: %s, %s\n", $2, vm[i]);
j++;
}
i++;
}
printf("--\n%d\n", j);
if (j == 1) {
printf("%s, %s", $1, $2);
}
printf("==\n");

}
'

четверг, 5 июля 2012 г.

Чистка datastore (часть 1)

Возникла необходимость почистить место на datastore. В связи с чем и родились следующие скрипты.

Скрипт №1 - Составление списка всех зарегистрированных виртуальных машин вместе с их дисками
$vCenter = $args[0]

echo 'Connect to vCenter'
Connect-VIServer $vCenter
echo '------------------------------------'

$Report = @()

echo 'Get-VMs'
foreach ($item in Get-VM) {
foreach ($item2 in Get-HardDisk $item) {
$VMInfo = {} | Select VMName,Disk
$VMInfo.VMName = $item.name
$VMInfo.Disk = $item2.filename
$Report += $VMInfo
}
}

$Report = $Report | Sort-Object VMName
IF ($Report -ne "") {
$Report | Export-Csv .\$vCenter.log -NoTypeInformation
}

Disconnect-VIServer -Confirm:$false

Скрипт №2: Составление списка файлов, находящихся на datastore, вместе с их директориями и именами datastore.

$vCenter = $args[0]

echo 'Connect to vCenter'
Connect-VIServer $vCenter

$Report = @()

echo 'Get-VMs'
foreach ($item in get-datastore) {
$item

new-psdrive -location $item -name ds -psprovider VimDatastore -Root "\"

Set-Location ds:\

foreach ($f in Get-ChildItem) {
set-location $f

foreach ($o in get-childitem) {
echo "------------------------file information--------------------------------"
$filelist = {} | Select datastorename,foldername,filename
$filelist.datastorename = $item.Name
$filelist.foldername = $f.Name
$filelist.filename = $o.name
write-host $item.name"; "$f.name"; "$o.name
$report += $filelist
}
}

Set-Location d:\projects\powercli\getvm\

remove-psdrive -name ds
}

# $Report = $Report | Sort-Object VMName
IF ($Report -ne "") {
$Report | Export-Csv .\datastore.log -NoTypeInformation
}

Disconnect-VIServer -Confirm:$false

Вывод всего лишнего в следующей серии, так нет времени на написании скрипта.

вторник, 29 мая 2012 г.

Создание виртуальных машин

Скрипт автоматического создания виртуальных машин


#Usage: powershell.exe ./CreateVM.ps1 ./machines.csv

# include VmWare
add-pssnapin VMware*

# get file name with VMs content
$InputFileName = $args[0]

#storage maximums
$storageMaximum = '0.2'

# vCenter name
$vCenter='192.168.0.2'

# import content
$InputFile = Import-Csv $InputFileName

echo 'Connect to vCenter'
$vccred = Get-VICredentialStoreItem -host $vCenter -file 'c:\vmware\credentials.xml'
Connect-VIServer $vCenter -User $vccred.user -Password $vccred.Password
echo '------------------------------------'

echo 'Create VMs'
foreach ($item in $inputFile) {
    echo 'current item'
    echo $item
    echo '------------------------------------'

    echo 'parser of item'
    echo $item.folder
    echo $item.name
    echo "CPU: "$item.cpu
    echo "RAM: "$item.ram
    echo $item.template
    echo '------------------------------------'
 
# create new folder for current VM
    $VMFolder = '0'
    $VMFolder = Get-Folder $item.folder
    if ($VMFolder.Name -eq $item.folder) {
        echo 'folder already exists'
    }
    else {
        echo 'create folder'
        $VMFolder = Get-Folder 'Export URG' | New-Folder -Name $item.folder
    }
    echo $VMFolder
    echo '------------------------------------'
 
# get template for current VM
    $template = '0'
    $template = Get-Template -Name $item.template
    echo $template
 
# get specification for current VM
    $specification = '0'
    $specification = Get-OSCustomizationSpec -Name $item.specification
    echo $specification
 
# get datastore with maximum free space
    $bad = 0
    $datastore = 0
    $stores = Get-DataStore
    foreach ($store in $stores) {
        if ($store.FreeSpaceMB -gt $bad) {
            $bad = $store.FreeSpaceMB
            $datastore = $store
        }
    }
# get datastore with minimum RAM usage
    $bad = 1000000000000000000000
    $esxihost = 0
    $hosts = Get-DataStore -name $datastore.name | get-vmhost
    foreach ($hosti in $hosts) {
        if ($hosti.MemoryUsageMB -lt $bad) {
            $bad = $hosti.MemoryUsageMB
            $esxihost = $hosti
        }
    }

echo 'choosed esxi host (name)'$esxihost.name
echo 'choosed datastore (name)'$datastore.name
     
    if (-not($datastore -eq '0')) {
    if (($datastore.freespacemb / $datastore.capacitymb) -gt $storageMaximum) {

# create new VM
    if (-not($item.ram -eq 0)) {
        if (-not($item.cpu -eq 0)) {
            New-VM -Name $item.name -Template $template -VMHost $esxihost -Datastore $datastore -OSCustomizationSpec $specification -location $VMFolder -MemoryMB $item.ram -NumCPU $item.cpu
        }
        else {
            New-VM -Name $item.name -Template $template -VMHost $esxihost -Datastore $datastore -OSCustomizationSpec $specification -location $VMFolder -MemoryMB $item.ram
        }
    }
    else {
        if (-not($item.cpu -eq 0)) {
            New-VM -Name $item.name -Template $template -VMHost $esxihost -Datastore $datastore -OSCustomizationSpec $specification -location $VMFolder -NumCPU $item.cpu
        }
        else {
            New-VM -Name $item.name -Template $template -VMHost $esxihost -Datastore $datastore -OSCustomizationSpec $specification -location $VMFolder
        }
    }
}
    }
}

Disconnect-VIServer -server $vCenter -Confirm:$false

Пример файла-таблицы к скрипту

folder,name,cpu,ram,template,specification,theend
foldername1,vmName1,1,4,temp1*,temp1,theend
foldername2,vmName2,2,4,temp2*,temp2,theend 
foldername2,vmName3,2,4,temp2*,temp2,theend 
foldername3,vmName4,4,4,temp3*,temp3,theend 

понедельник, 21 мая 2012 г.

Блокировки виртуальной машины

В процессе работы столкнулся с багой VmWare, описанной здесь (kb10051).

Машинка молотила в своем привычном режиме час-черезсутки и понадобилось ее переместить в другой ДЦ. А так связь между ДЦ только по меди, делаем это с помощью Database Browser.
Выключил машинку, удалил кучу snapshot и начал делать download from storage, но не тут то было...
vCenter сказал: "Unable to access file since it is locked " и отвалился.
Хотел смигрировать на другой раздел, не получилось.
Полез в инет и наткнулся на статью в KB, в которой косвенно признавалась бага в продукте.

Итак, метод решения:
1. включаем ssh на хосте и логинимся под root.
2. ищем залоченный файл
3. делаем touch .

И в принципе все, должно помочь.

Более запущенные случаи стоит смотреть в КВ.

понедельник, 14 мая 2012 г.

Установка обновлений с помощью VmWare Update Manager

При обновлении своего хозяйства с 5.0.0 на 5.0.0 Update 1 столкнулся с интересной вещью. По умолчанию, esxi кладет распакованные архивы с патчами на раздел, который находится в памяти в виде RAM диска. Но для распаковки Update 1, на отдельных серверах, мне этого раздела не хватало и система выдавала ошибку №15 (кажется).
При поиске решения проблемы натолкнулся на KB, в которой все подробнейшим образом описывается (KB1033696).

В дальнейшем надо будет сделать скрипт, который будет делать эту операцию при установке нового сервера.

суббота, 12 мая 2012 г.

Начало!!!

Начну-с!

Технические вещи здесь буду публиковать для лучшего запоминания и для более быстрого поиска.

Все остальное (если оно будет), для информации.