This article series will focus on specific tips and tricks to aid customisation and flexibility of vRA 8.x.
Contents
- Part 1 – Array Expression in Cloud Templates
- Part 2 – Ternary Logic
- Part 3 – Property Groups
Ternary Logic
Otherwise known as three-valued logic, this logic system differs from the Boolean True and False that we use more commonly by adding a third value. Simplistically this would present as:
IF SomeValue, THEN value=A ELSE value=B
The vRA blueprint schema supports ternary logic as can be seen in the documentation example “For deploying to VMware Cloud on AWS, set the folder name to the required name of Workload”
folderName: '${input.environment == "VMC" ? "Workload" : ""}'
A generic way to describe this in vRA blueprint expression format would be:
${IfSomething == “true” ? “returnSomething” : “elseReturnSomethingElse” } }
You could even get more complicated with the inclusion of AND and OR statements (expressed as “&&” and “||” in the code). For example:
property: ‘${IfSomething1 == “true” && IfSomething2 == “true” || IfSomething1 == “true” && IfSomething3 == “true” ? “true” : “false” }’
So, enough of the academic definition – let’s see a practical example!
The objective: Design a single blueprint that can be used for both Dev/Test and Production environments that will assign a different network based on the chosen environment.
Here’s the blueprint code:
name: Ternary Logic
formatVersion: 1
#-------------------------INPUTS-------------------------#
inputs:
environment:
type: string
title: Environment
description: Select a deployment environment
oneOf:
- title: Dev/Test
const: DevTest
- title: Production
const: Prod
default: Prod
operatingSystem:
type: string
# Set the values below as 'image name,customisation spec'
oneOf:
- title: Microsoft Windows Server 2019
const: 'windows-server-2019,windows-spec-noad'
- title: CentOS Server 7.9
const: 'centos-79,linux-spec'
- title: CentOS Server 8.3
const: 'centos-83,linux-spec'
title: Operating System
description: Select an operating system and version.
# -------------------------RESOURCES----------------------#
resources:
App_Server:
type: Cloud.vSphere.Machine
properties:
image: '${split(input.operatingSystem,",")[0]}'
customizationSpec: '${split(input.operatingSystem,",")[1]}'
flavor: small
constraints:
- tag: 'cloud:private'
networks:
- network: '${resource["Network"].id}'
assignment: static
Network:
type: Cloud.NSX.Network
properties:
networkType: existing
constraints:
- tag: '${input.environment == "DevTest" ? "Net-T00-DevTest" : "Net-T00-Prod"}'
If the DevTest environment is selected at Input, the network tag will be Net-T00-DevTest, otherwise it will be Net-T00-Prod.
Of course, you could just specify the Network tag values as constants within the Input stage, but you may want to use the environment value for other things as well – for example to drive a custom naming standard. Another example of ternary logic expression will be in my next post in this series which will be about using Property Groups to abstract the environment specification.
3 thoughts on “vRA Tips and Tricks – Part 2”