Saturday, July 24, 2021

PowerCLI script to add datastores

 PowerCLI script to add datastores


Connect-VIServer vcenterserver

$input = Import-Csv C:\Temp\CreateDS\dslist.csv

foreach ($row in $input)

{

    $VMHost=$row.VMHost

    $DSName=$row.DSName

    $Luns=Get-VMHost -Name $VMHost | Get-ScsiLun -LunType disk

    $id=$row.NaaID

    $Naa=($Luns.CanonicalName -Like "*$id*")

    New-Datastore -VMHost $VMHost -Name $DSName -Path $($Luns.CanonicalName -Like "*$id*") -Vmfs -FileSystemVersion 6

}

Disconnect-VIServer vcenterserver -Confirm:$false


<#

Content of dslist.csv

VMHost,DSName,NaaID

ESXiHostname1,DatastoreName1,xxxxxxxxxxxxxxxxxxxxxxx1

ESXiHostname2,DatastoreName2,xxxxxxxxxxxxxxxxxxxxxxx2

ESXiHostname3,DatastoreName3,xxxxxxxxxxxxxxxxxxxxxxx3

#>

PowerCLI script to convert LUN canonical name to datastore and vice versa

PowerCLI script to convert LUN canonical name to datastore and vice versa


#Thanks to vXav.fr

#Reference: https://www.vxav.fr/2016-10-13-convert-lun-canonical-name-to-datastore-and-vice-versa/


Function Convert-DSToCanonical

{

param(  

[Parameter(Mandatory = $True,ValueFromPipeline=$True)]  

[VMware.VimAutomation.ViCore.Impl.V1.DatastoreManagement.DatastoreImpl[]]  

$datastore  

)

Process {  

$datastore | where type -eq VMFS  | ForEach-Object {  

   $CanonicalName = (Get-View $_).Info.Vmfs.Extent.diskname  

   [pscustomobject]@{  

CanonicalName = $CanonicalName  

Datastore     = $_.name  

}

}

}

}


Function Convert-CanonicalToDS {  

param(  

[Parameter(Mandatory = $True,ValueFromPipeline=$True)]  

[string[]]  

$canonicalname  

)

Begin {  

$Table = Convert-DSToCanonical (get-datastore | where type -eq VMFS)

}

Process{

$canonicalname | ForEach-Object {

$Table | where CanonicalName -eq $_

}

}

}


#Script execution format 

#cd C:\Temp\CanonicalToDSToCanonical\

#./NaaToDS.ps1 vcenterserver to@mailaddress.com


$VCenter=$args[0]

$Mail=$args[1]

Connect-VIServer $VCenter

$results=@()

$OutFile = "C:\Temp\CanonicalToDSToCanonical\Output.csv"

$identifiers = Get-Content C:\Temp\CanonicalToDSToCanonical\naa_list.txt

foreach($identifier in $identifiers)

{

$ds = $identifier | Convert-CanonicalToDS

$esx=get-datastore $ds.Datastore | get-vmhost

$ESXiHost = $esx -join ", "

$vm=get-datastore $ds.Datastore | Get-VM

$VMName = $vm.Name -join ", "

$LUNsMapped =  $ds.CanonicalName -join ", "

$result = new-object -TypeName psobject

$result | Add-Member -MemberType NoteProperty -Name 'Identifier' -Value $identifier

$result | Add-Member -MemberType NoteProperty -Name 'Datastore' -Value $ds.Datastore

$result | Add-Member -MemberType NoteProperty -Name 'ESXiHost' -Value $ESXiHost

$result | Add-Member -MemberType NoteProperty -Name 'VMName' -Value $VMName

$result | Add-Member -MemberType NoteProperty -Name 'LUNsMappedToDatastore' -Value $LUNsMapped

$results += $result

}

$results|select Identifier,Datastore,ESXiHost,VMName,LUNsMappedToDatastore | Export-Csv $OutFile -noTypeInformation

send-mailmessage -Attachments "C:\Temp\CanonicalToDSToCanonical\Output.csv" -to $args[1] -from "from@mailaddress.com" -subject "Naa Identifier to Datastore Conversion" -SmtpServer "smtp.mailaddress.com"

Disconnect-VIServer $VCenter -Confirm:$false

PowerCLI script to get ESXi host driver versions

PowerCLI script to get ESXi host driver versions 


#### HTML Output Formatting #######

$a = "<style>"

$a = $a + "BODY{background-color:White ;}"

$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"

$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:Green}"

$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:PaleGoldenrod}"

$a = $a + "</style>"

################################################################################################


Connect-VIServer vcenter_server

#Remove-Item C:\Temp\DriverInfo.html

$report = @()

$hosts = gc C:\Temp\hosts.txt

forEach ($vihost in $hosts)

{

    $gethost = get-vmhost $vihost

    $esxcli = $gethost | Get-EsxCli

    $row = "" | select ESXiHost,ESXiVendor,Version,Build,ENICVendor,ENIC,FNICVendor,FNIC,LSIVendor,LSI

    $row.ESXiHost = $vihost

    $row.ESXiVendor = ($gethost | Get-View).Hardware.SystemInfo.Vendor

    $row.Version = $gethost.Version

    $row.Build = $gethost.Build

    $row.ENICVendor = ($esxcli.software.vib.list() | Where { $_.Name -like "nenic"}).Vendor

    $row.ENIC = ($esxcli.software.vib.list() | Where { $_.Name -like "nenic"}).Version

    $row.FNICVendor = ($esxcli.software.vib.list() | Where { $_.Name -like "nfnic"}).Vendor

    $row.FNIC = ($esxcli.software.vib.list() | Where { $_.Name -like "nfnic"}).Version

    $row.LSIVendor = ($esxcli.software.vib.list() | Where { $_.Name -like "lsi-mr3"}).Vendor

    $row.LSI = ($esxcli.software.vib.list() | Where { $_.Name -like "lsi-mr3"}).Version

    $report += $row

}

$report | Sort ESXiHost | ConvertTo-html -Head $a -Body "<H2> </H2>" >> C:\Temp\DriverInfo.html

$body = [System.IO.File]::ReadAllText('C:\Temp\DriverInfo.html')

$text = '<b><font=Arial>NIC Driver version Report</font></b>'

Send-MailMessage -To to@mailaddress.com -From from@mailaddress.com -Subject "Driver version Report" -Body "$text $body" -SmtpServer smtp.mailaddress.com -BodyAsHtml

Disconnect-VIServer vcenter_server -Confirm:$false  


PowerCLI Script to add NIC to virtual machines

 PowerCLI Script to add NIC to virtual machines


#Connect to vcenter server

Connect-viserver vcenter_server

#Get the network name as input

$VLAN = Read-Host "Enter the Network Name"

#Get the list of virtual machines from the servers.txt 

$vm = gc c:\temp\servers.txt

#Assign a new NIC to all the VM listed in servers.txt with VMXNET3 as type

Get-VM $vm | New-NetworkAdapter -Type Vmxnet3 -NetworkName $VLAN -WakeOnLan:$true -StartConnected:$true -Confirm:$false

#Disconnect from vcenter server

Disconnect-VIServer vcenter_server -Confirm:$False

How to create and use custom PowerShell Functions

How to create and use custom PowerShell Functions

PowerShell variable $Profile runs automatically when a shell session is started and it can be used to run scripts and set variables.

For a function to work on your session:

1) Identify the "*profile.ps1"  location by executing $profile. 

2) Open the "*profile.ps1" file in a Notepad with administrator privilege.

3) Copy & paste the function script.

4) Save the file.

For a function to work on everyone's session:

1) Navigate to "C:\Windows\System32\WindowsPowerShell\v1.0".

2) Create and save a PowerShell script (eg: FunctionScript.ps1) exclusively for the function in *.ps1 format.

3) Create a new or open exsisting "*profile.ps1" file in a Notepad with administrator privilege.

4) Type the following to import the function and save the file.

Import-Module C:\Windows\system32\WindowsPowerShell\v1.0\FunctionScript.ps1

Monday, January 4, 2021

Install custom signed certificate on Avamar

Install custom signed certificate on Avamar


1) SSH to the Avamar Server

2) Backup the existing certificate file

cp /etc/apache2/ssl.crt/server.crt /etc/apache2/ssl.crt/server.crt.bak

cp /etc/apache2/ssl.key/server.key /etc/apache2/ssl.key/server.key.bak

optional:

cp /etc/apache2/ssl.crt/CA.crt /etc/apache2/ssl.crt/CA.crt.bak

cp /etc/apache2/ssl.crt/intermediate.cer /etc/apache2/ssl.crt/intermediate.cer.bak

cp /etc/apache2/servercert.p12 /etc/apache2/servercert.p12.bak

3) Regenerate the security certificate and keys:

openssl req -x509 -new -newkey rsa:3072 -nodes -keyout /etc/apache2/ssl.key/server.key -sha512 -out /etc/apache2/ssl.crt/server.crt -days 1825 -subj "/C=Country/ST=State/L=Locality/O=Organization/OU=OrganizationUnit/CN=AvmarServer.xyz.org/emailAddress=MailID@xyz.org"

4) Create the CSR: 

openssl x509 -x509toreq -in /etc/apache2/ssl.crt/server.crt -signkey /etc/apache2/ssl.key/server.key -out /etc/apache2/apache.csr

5) Use the following command to copy file “apache.csr” and change the permission from root to admin

sudo cp /etc/apache2/apache.csr /home/admin/apache.csr && sudo chown admin:admin /home/admin/apache.csr

6) Using WinSCP download the file apache.csr from /home/admin/

7) Submit the apache.csr file to your organization's Certificate Authority team and get the certificate signed (AvmarServer.cer) along with root (rootCA.cer) & intermediate (intermediate.cer)(optional) certificates.

8) Copy the rootCA.cer, intermediate.cer & AvmarServer.cer to /home/admin/ of the Avamar server using WinSCP

9) Navigate to /home/admin/

cd /home/admin/

10) Copy the rootCA.cer to /etc/apache2/ssl.crt/CA.crt

cp rootCA.cer /etc/apache2/ssl.crt/CA.crt

11) Copy the intermediate.cer to /etc/apache2/ssl.crt/

cp intermediate.cer /etc/apache2/ssl.crt

12) Copy the AvmarServer.cer to /etc/apache2/ssl.crt/server.crt

cp AvmarServer.cer /etc/apache2/ssl.crt/server.crt

13) Navigate to /etc/apache2

cd /etc/apache2

14) Verify the certificates

openssl x509 -noout -text -in ssl.crt/CA.crt

openssl x509 -noout -text -in ssl.crt/intermediate.cer

openssl x509 -noout -text -in ssl.crt/server.crt

15) Create .p12 file using server.crt, server.key, CA.crt & intermediate.cer

openssl pkcs12 -export -in /etc/apache2/ssl.crt/server.crt -inkey /etc/apache2/ssl.key/server.key -certfile /etc/apache2/ssl.crt/CA.crt -certfile /etc/apache2/ssl.crt/intermediate.cer -out /etc/apache2/servercert.p12 -name "Server-Cert" -passin pass:foo -passout pass:foo

16) List all the certificates in the certificate database

certutil -L -d mod_nss.d

17) Delete a private key and the associated certificate from a database

certutil -F -n Server-Cert -d mod_nss.d

When prompted, type the password changeme123!

18) List again to make sure it is empty

certutil -L -d mod_nss.d

Note: (optional) if not empty, upgrade the db:

certutil --upgrade-merge -d sql:mod_nss.d --source-dir mod_nss.d --upgrade-id 1

Note: (optional) if -F doesn’t work, try -D

certutil -D -n "Certificate Issuing Authority" -d mod_nss.d

19) Import the *.p12 file to NSS database

pk12util -i /etc/apache2/servercert.p12 -d /etc/apache2/mod_nss.d -W foo

When prompted, type the password changeme123!

20) List all the certificates in a certificate database and verify

certutil -L -d mod_nss.d

# We expect to see Server-Cert, the Root CA, and the intermediate CA.

21) Change the permission of /etc/apache2/mod_nss.d

chown -R wwwrun:www /etc/apache2/mod_nss.d

22) Stop and start the httpd2 service

website stop

website start

Thursday, June 21, 2018

PowerCLI script to get Datastore, Canonical name, VMs, Number of Paths & State

PowerCLI script to get Datastore, Canonical name, VMs, Number of Paths & State


Add-PSSnapin vmware.vimautomation.core -ErrorAction Stop
Connect-Viserver vcenter_server
                                                               
 function Get-DatastoreInventory {                                                               
   $HostDatastoreInfo = Get-VMHost | Get-ScsiLun -LunType disk                                                                
   $DatastoreInfo = Get-Datastore                                                               
   foreach ($Hostdatastore in $HostDatastoreInfo) {                                                                
    $Datastore = $DatastoreInfo | Where-Object {$_.extensiondata.info.vmfs.extent.Diskname -match $Hostdatastore.CanonicalName}                                                               
    $LunPath = $Hostdatastore | Get-ScsiLunPath                                                              
    if ($Datastore.ExtensionData.vm) {                                                               
     $VMsOnDatastore = $(Get-view $Datastore.ExtensionData.vm).name -join ","                                                               
    } #if                                                               
    else {$VMsOnDatastore = "No VMs"}                                                               
                                                                 
   #Work on not assigned Luns error at silentlyContinue                                                               
    if ($Datastore.Name -eq $null) {                                                              
     $DatastoreName = "Not mapped"                                                              
     $FileSystemVersion = "Not mapped"                                                              
    }                                                              
    else {                                                              
     $DatastoreName = $Datastore.Name -join "," 
     $FileSystemVersion = $Datastore[0].FileSystemVersion
    }                                                              
    $DatastoreFreeSpace = $Datastore.FreeSpaceGB -join ", "     
    $DatastoreCapacityGB = $Datastore.CapacityGB -join ", "   
    $DatastoreDatacenter = $Datastore.Datacenter -join ", " 
    $State = $LunPath.State -join ", "                                                              
    $Preferred = $LunPath.Preferred -join ", "                                                              
    $Paths = ($LunPath.ExtensionData.Transport | foreach {($_.Address -split ":")[0]}) -Join ", "                                                              
    $IsWorkingPath = $LunPath.ExtensionData.IsWorkingPath -Join ", "                                                              
    $Obj = New-Object PSObject                                                               
    $Obj | Add-Member -Name VMhost -MemberType NoteProperty -Value $hostdatastore.VMHost                                                               
    $Obj | Add-Member -Name DatastoreName -MemberType NoteProperty -Value $DatastoreName                                                                
    $Obj | Add-Member -Name FreeSpaceGB -MemberType NoteProperty -Value $DatastoreFreeSpace                                                               
    $Obj | Add-Member -Name CapacityGB -MemberType NoteProperty -Value $DatastoreCapacityGB                                                               
    $Obj | Add-Member -Name FileSystemVersion -MemberType NoteProperty -Value $FileSystemVersion
    $Obj | Add-Member -Name RuntimeName -MemberType NoteProperty -Value $hostdatastore.RuntimeName                                                               
    $Obj | Add-Member -Name CanonicalName -MemberType NoteProperty -Value $hostdatastore.CanonicalName                                                               
    $Obj | Add-Member -Name MultipathPolicy -MemberType NoteProperty -Value $hostdatastore.MultipathPolicy                                                               
    $Obj | Add-Member -Name Vendor -MemberType NoteProperty -Value $hostdatastore.Vendor                                                               
    $Obj | Add-Member -Name DatastoreDatacenter -MemberType NoteProperty -Value $DatastoreDatacenter                                                               
    $Obj | Add-Member -Name VMsOnDataStore -MemberType NoteProperty -Value $VMsOnDatastore                                                               
    $Obj | Add-Member -Name NumberOfPaths -MemberType NoteProperty -Value $LunPath.Count                                                              
    $Obj | Add-Member -Name Paths -MemberType NoteProperty -Value $Paths                                                              
    $Obj | Add-Member -Name State -MemberType NoteProperty -Value $State                                                              
    $Obj | Add-Member -Name Preferred -MemberType NoteProperty -Value $Preferred                                                              
    $Obj | Add-Member -Name IsWorkingPath -MemberType NoteProperty -Value $IsWorkingPath                                                              
    $Obj                                                               
   }                                                               
  }                                                               
  Get-DatastoreInventory | Export-Csv -NoTypeInformation D:\Scripts\DatastoreInfoHostwise.csv

send-mailmessage -Attachments "D:\Scripts\DatastoreInfoHostwise.csv" -to "DeliverTo@emailaddress.com" -from "SentFrom@emailaddress.com" -subject "Datastore LUN identifier" -SmtpServer "mail.emailaddress.com"

OUTPUT