Hello all, im new to this community and have only been working with F5s for about 4 months. In my workplace we frequently deploy massive numbers of servers that require load balancing. Due to the increase in time savings from using icontrol i have written some scripts to do this for us based on csv input files. Everything works great if I use the same VIP profiles every time. My issue is that we need to be able to leave a blank in the CSV and provide a none/null value to a particular profile depending on the requirement.
below is some code im working with but it is not working as intended. In my first example, i can selectively set the profiles for my VIP but the script ignores other fields in the CSV. In my second example, i can access all fields and assign a "none" value to a profile but in the case where i WANT a profile set, it ignores it. Any help would be greatly appreciated!
Note: I have truncated the script to the relevant portion.
First Example:
Function VIP{
$vipINFILE = Import-Csv $vipCSV
foreach ($vipset in $vipINFILE | Where-object {$_.Sequence -eq $i})
{
$vipdefinition = New-Object -TypeName iControl.CommonVirtualServerDefinition;
$vipdefinition.name = $vipset.VIPName;
$vipdefinition.address = $vipset.VIPIP;
$vipdefinition.port = $vipset.VIPPort;
$vipdefinition.protocol = $vipset.Protocol;
$vipdefinitions = (, $vipdefinition);
$wildmasks = (, "255.255.255.255");
$resource = New-Object -TypeName iControl.LocalLBVirtualServerVirtualServerResource;
$resource.type = "RESOURCE_TYPE_POOL";
$resource.default_pool_name = $poolset.PoolName;
$resources = (, $resource);
$vippersistence = New-object -TypeName iControl.LocalLBVirtualServerVirtualServerPersistence;
$vippersistence.profile_name = $vipset.vippersistence
$vippersistence.default_profile = $null
$profileINFILE = import-csv $profileCSV
foreach ($profileset in $profileINFILE | where-object {$_.Sequence -eq $i})
{
$vipprofilehttp = New-Object -TypeName iControl.LocalLBVirtualServerVirtualServerProfile;
$vipprofilehttp.profile_context = "PROFILE_CONTEXT_TYPE_ALL";
$vipprofilehttp.profile_name = $profileset.http;
$vipprofilessl = New-Object -TypeName iControl.LocalLBVirtualServerVirtualServerProfile;
$vipprofilessl.profile_context = "PROFILE_CONTEXT_TYPE_CLIENT";
$vipprofilessl.profile_name = $profileset.SSLClient;
$vipprofileoneconnect = New-Object -TypeName iControl.LocalLBVirtualServerVirtualServerProfile;
$vipprofileoneconnect.profile_context = "PROFILE_CONTEXT_TYPE_ALL";
$vipprofileoneconnect.profile_name = $profileset.OneConnect;
}
$vipprofileA = ($vipprofilehttp, $vipprofilessl, $vipprofileoneconnect);
$vipprofileAofA = (, $vipprofileA);
(Get-F5.iControl).LocalLBVirtualServer.create($vipdefinitions,$wildmasks,$resources,$vipprofileAofA)
if($vipset.snat -eq "AutoMAP"){(Get-F5.iControl).LocalLBVirtualServer.set_snat_automap((, $vipset.VIPName))}
(Get-F5.iControl).LocalLBVirtualServer.Add_persistence_profile((,$vipset.VIPName),(,$vippersistence))
write-host $vipset.VIPName " created..."
}
}
Second example
$vipINFILE = Import-Csv vip.csv
foreach ($vipset in $vipINFILE | Where-object {$_.Sequence -eq $i})
{
$vipdefinition = New-Object -TypeName iControl.CommonVirtualServerDefinition;
$vipdefinition.name = $vipset.VIPName;
$vipdefinition.address = $vipset.VIPIP;
$vipdefinition.port = $vipset.VIPPort;
$vipdefinition.protocol = $vipset.Protocol;
$vipdefinitions = (, $vipdefinition);
$wildmasks = (, "255.255.255.255");
$resource = New-Object -TypeName iControl.LocalLBVirtualServerVirtualServerResource;
$resource.type = "RESOURCE_TYPE_POOL";
$resource.default_pool_name = $poolset.PoolName;
$resources = (, $resource);
$vippersistence = New-object -TypeName iControl.LocalLBVirtualServerVirtualServerPersistence;
$vippersistence.profile_name = $vipset.vippersistence
$vippersistence.default_profile = $null
$profileINFILE = import-csv profiles.csv
foreach ($profileset in $profileINFILE | where-object {$_.Sequence -eq $i})
{
If(!$profileset.http){
$vipprofilehttp = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[][]" 1
}else{
$vipprofilehttp = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[]" 1
$vipprofilehttp[0] = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile"
$vipprofilehttp[0].profile_context = "PROFILE_CONTEXT_TYPE_ALL";
$vipprofilehttp[0].profile_name = $profileset.http;
}
if(!$profileset.sslclient){
$vipprofilessl = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[][]" 1
}else{
$vipprofilessl = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[]" 1
$vipprofilessl[0] = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile"
$vipprofilessl[0].profile_context = "PROFILE_CONTEXT_TYPE_CLIENT";
$vipprofilessl[0].profile_name = $profileset.sslclient;
}
if(!$profileset.OneConnect){
$vipprofileoneconnect = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[][]" 1
}else{
$vipprofileoneconnect = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile[]" 1
$vipprofileoneconnect[0] = New-Object "iControl.LocalLBVirtualServerVirtualServerProfile"
$vipprofileoneconnect[0].profile_context = "PROFILE_CONTEXT_TYPE_ALL";
$vipprofileoneconnect[0].profile_name = $profileset.OneConnect;
}
$vipprofileA = ($vipprofilehttp, $vipprofilessl, $vipprofileoneconnect);
$profilecount = $vipprofileA.count
$vipprofileAofA = (, $vipprofileA[$profilecount]);
(Get-F5.iControl).LocalLBVirtualServer.create($vipdefinitions,$wildmasks,$resources,$vipprofileAofA)
write-host $vipset.VIPName " created..."
}
I can see
PS > $vipprofileA
profile_context profile_name
--------------- ------------
PROFILE_CONTEXT_TYPE_ALL http
PROFILE_CONTEXT_TYPE_ALL oneconnect
PS > $vipprofileA.count
3
Yet when I view the vip no profiles are assigned. I verified that these profile names exist.