Repository navigation
Milestone 5: 480.psm1
Miles Cummings edited this page Feb 28, 2024
·
1 revision
- The first thing that we need to do in order to get this milestone working is license our vCenter. Head to this URL and create/register for a VMWare IT academy account. Then, head to this link and request a lisence for VMWare vSphere 8.x Enterprise Plus.
- Head over to xubuntu-wan, pop open a terminal, run
pwshand run the commandsudo snap install code --classicto get Visual Studio Code installed. - While staying in powershell, create a new directory called
480. This will be our Git repo and where we will store the modules. Create it with a directory structure similar to the following:

- Navigate into the
480-utilsfolder. You will also need to run this command there:
New-ModuleManifest -Path .\480-utils.psd1 -Author 'miles' -CompanyName 'SYS-480' -RootModule '480-utils.psm1' -Description 'vsphere automation module for SYS-480'
- Also run
touch 480-utils.psm1after running that command above to create the empty file. Back out two directories (just getting to the folder called 480), and runcode .to open VSCode in the current directory. Open up480-utils.psm1- this is where we are going to put all our functions. Put a basic one in there for now so we can just use it for testing:
function 480Banner()
{
$banner=@"
_ _ ___ ___ _ _ _
| || | ( _ ) / _ \ _ _| |_(_) |___
| || |_ / _ \| | | |_____| | | | __| | / __|
|__ _| (_) | |_| |_____| |_| | |_| | \__ \
|_| \___/ \___/ \__,_|\__|_|_|___/
__ EEEK!
/ \ ~~|~~
(|00|) |
(==) --/
___||___
/ _ .. _ \
// | | \\
// | | \\
|| / /\ \ ||
_|| _| || |_ ||_
\|||___||___|||/
"@
Write-Host $banner
}
- In the VSCode terminal at the bottom of the screen, cd to the modules directory and run
code $profile- it will open a blank file. Put the following in:
$env:PSModulePath = $env:PSModulePath + ":/home/miles/Desktop/480/modules"
- Save and close the file. If you run
$env:PSModulePath, it should append what we wrote to the end of that variable similar to this:

- Now in that VSCode terminal, run
Import-Module '480-uils' -Forceto import our new module. Calling the function should return a result like this:

- Yay! Now to start adding more to our utils file. Add the following function below your original one:
function 480Connect([string] $server)
{
$conn = $global:DefaultVIServer
if ($conn) {
$msg = "Already connected to {0}!" -f $conn
Write-Host -ForegroundColor Green $msg
} else {
$conn = Connect-VIServer -Server $server
}
}
- Save the file and import the module again. (NOTE: You will have to do this each time you edit the .psm1 file!) Type
480Connect -server "vcenter.miles.local"to test our new function. Should prompt you with a login, just enter your -adm credentials. Test it again by running it once more after connecting to ensure the first part of the function works. Should get results like this:

- Now we are going to figure out how to make use of JSON files to have a bit more automatic configuration when we make a connection to our server. In your 480 directory, go ahead and create a new file called 480driver.ps1, and create one more called 480.json. Open up the driver file first, and ad the following:
Import-Module '480-utils' -Force
480Banner
- Save it, and now if we run
./480driver.ps1, it should just run our function for us. - Open up the new json file and add the following to it:
{
"vcenter_server" : "vcenter.miles.local"
}
- Make sure to save it - head back to the utils file where all our functions are, and add a new function at the bottom:
function Get-480Config([string] $config_path)
{
Write-Host "Reading " $config_path
$conf=$null
if (Test-Path $config_path)
{
$conf = (Get-Content -Raw -Path $config_path | ConvertFrom-Json)
$msg = "Using Configuration at {0}" -f $config_path
Write-Host -ForegroundColor "Green" $msg
} else {
Write-Host -ForegroundColor "Yellow" "No Configuration"
}
return $conf
}
- Save, import the module again, and run
$conf=Get-480Config -config_path "./480.json". After this runs and gives a valid output, run$confand it should output the vcenter server assigned to that variable. - In the driver file, add the following to the bottom:
$conf = Get-480Config -config_path = "/home/miles/Desktop/480/480.json"
480Connect -server $conf.vcenter_server
- Save it and run the driver file again with
./480driver.ps1and it should run everything smoothly! - Now, head back into the 480-utils file to add another function at the bottom:
function Select-VM([string] $folder)
{
$selected_vm=$null
try
{
$vms = Get-VM -Location $folder
$index = 1
foreach($vm in $vms)
{
Write-Host [$index] $vm.name
$index+=1
}
$pick_index = Read-Host "Which index number [x] do you wish to pick?"
$selected_vm = $vms[$pick_index -1]
Write-Host "You picked " $selected_vm.name
return $selected_vm
}
catch
{
Write-Host "Invalid Folder: $folder" -ForegroundColor "Red"
}
}
-
Now after saving and reimporting, you should be able to test it with
Select-VM -folder "BASEVM" -
Let's add some more to the JSON file. Add the line
"vm_folder" : "BASEVM"beneath the only other line in there. (NOTE: Add a comma after the first line to indicate an end of line) -
Head into the driver file and add the line
Select-VM -folder "BASEVM"to the bottom. Make sure to save all these files! You can test that this all works by running your driver file again with./480driver.ps1. -
Modify everything to make a linked clone. Add JSON parameters like "esxi_host" : "192.168.7.15", "default_network" : "480-WAN", so on and so forth.