Envio de e-mail quando novo recurso é criado no vRealize Automation 8.x
Hoje irei demonstrar rapidamente como podemos configurar uma Action Based Extensibility (ABX) para coletar algumas informações do deployment e enviar um e-mail para o administrador quando um recurso for criado. O código é bem simples e serve como um modelo e/ou ideia geral da funcionalidade. Sempre utilizo o PowerShell para estes casos porque tenho muitos exemplos prontos e também porque tenho facilidade para criar, mas você poderia utilizar Python ou JavaScript se preferir.
Vamos começar criando o secret para armazenar a senha da conta que irá enviar os e-mails de forma segura. Em Cloud Assembly vá até Infrastructure > Secrets > New Secret. Escolha o nome que desejar e adicione a senha da conta de e-mail.

Agora vamos criar a action em si, para isso, ainda em Cloud Assembly navegue até Extensibility > Actions > New Action. Defina um nome e associe com o seu projeto. Em FaaS provider selecione On Prem e em Default inputs selecione o type como Secret e associe com o segredo que acabou de criar.
Como a senha do e-mail está vindo do secret do vRA, precisamos utilizar a variável desta forma: $context.getSecret($inputs.yoursecret). Agora basta copiar o código, alterar com as suas informações e salvar.
function handler($context, $inputs) {
$vrauser = $inputs.__metadata.userName
$project = $inputs.customProperties.infoProject # add on blueprint --> infoProject: ${env.projectName}
$blueprint = $inputs.customProperties.infoBlueprint # add on blueprint --> infoBlueprint: ${env.blueprintName}
$deployment = $inputs.customProperties.infoDeployment # add on blueprint --> infoDeployment: ${env.deploymentName}
$vmname = $inputs.resourceNames[0]
$ip = $inputs.addresses[0]
$os = $inputs.customProperties.softwareName
$flavor = $inputs.customProperties.flavor
$Date = Get-Date -Format "dd/MM/yyyy"
$EmailFrom = "vra@domain.com" # endereço que envia o e-mail
$ReportReceiver = "admin@domain.com" # endereço do admin que recebe o e-mail
$MailSubject = "Caverna Cloud - $deployment - $Date" # titulo do e-mail
#$MailBody = "body"
$SmtpClient = "smtp.domain.com" # servidor SMTP
$SmtpPort = 587 # porta SMTP
$MailPasswd = ConvertTo-SecureString $context.getSecret($inputs.yoursecret) -AsPlainText -Force
$MailCred = New-Object System.Management.Automation.PSCredential ($EmailFrom, $MailPasswd)
$MailBody = "<html><body><img src='https://i.pinimg.com/564x/09/7b/3d/097b3d7585e5b05ee512620816abc089.jpg' alt='Caverna Cloud'>
<br>
<table>
<table align='left' text-align='left' border=1>
<tr>
<th>User</th>
<th>Deployment</th>
<th>Project</th>
<th>Blueprint</th>
<th>Hostname</th>
<th>IP</th>
<th>OS</th>
<th>Size</th>
</tr>
<td>$vrauser</td>
<td>$deployment</td>
<td>$project</td>
<td>$blueprint</td>
<td>$vmname</td>
<td>$ip</td>
<td>$os</td>
<td>$flavor</td>
</table>
<br><br><br>
<p>Favor não responder este e-mail</p>
</body>
</html>"
Send-MailMessage -From $EmailFrom -To $ReportReceiver -Subject $MailSubject -Body $MailBody -SmtpServer $SmtpClient -Port $SmtpPort -Credential $MailCred -BodyAsHtml:$true
}
Com a action criada, agora basta criar a subscription. Clique em new subscription, defina um nome, em event topic selecione compute post provision em action/workflow selecione a action que acabou de criar, marque o blocking e salve. Observação: um e-mail poderia ser disparado no caso de um recurso ser removido, neste caso, basta escolher o event topic compute removal.
Por fim vamos utilizar um blueprint simples apenas para testar o envio do e-mail.
formatVersion: 1
inputs: {}
resources:
VM:
type: Cloud.vSphere.Machine
properties:
name: CONZA-VM-
image: Ubuntu 22.04
flavor: Small
infoProject: ${env.projectName}
infoBlueprint: ${env.blueprintName}
infoDeployment: ${env.deploymentName}
constraints:
- tag: cluster:vsan
networks:
- network: ${resource.Network.id}
assignment: static
Network:
type: Cloud.vSphere.Network
properties:
networkType: existing
constraints:
- tag: network:app
Deployment criado com sucesso.
E finalizamos com o recebimento do e-mail.
Update 26/11/2022
No exemplo acima o e-mail é enviado para os administradores (um ou mais) e o valor deste campo é fixo, porém, existem casos onde o requisitante (usuário) pode querer receber o e-mail também. Para isso podemos criar um workflow contendo os seguintes passos: 1) obtemos o e-mail do requisitante (action com API + Python que vou mostrar abaixo) 2) enviamos o e-mail do usuário para a action que mostrei acima 3) a mensagem com as informações de deploy é enviado para os administradores e para o usuário.
import requests
import json
def handler(context, inputs):
server = 'https://vra-server.domain'
username = 'usuario"
password = 'S$nh@S3gur@123'
# fresh token
res = requests.post(server + '/csp/gateway/am/api/login?access_token', verify=False, headers={'Content-Type': 'application/json'}, json={'username': username, 'password': password})
token = json.loads(res.content)['refresh_token']
# bearer token
res2 = requests.post(server + '/iaas/api/login', verify=False, headers={'Content-Type': 'application/json'}, json={'refreshToken': token})
token2 = json.loads(res2.content)
bearer = token2['tokenType'] + " " + token2['token']
# get email
res3 = requests.get(server + '/csp/gateway/am/api/users/' + inputs['__metadata']['userName'] + '/orgs/' + inputs['__metadata']['orgId'] + '/info', verify=False, headers={'Content-Type': 'application/json', 'Authorization': bearer})
email = json.loads(res3.content)['user']['email']
return email
É isso aí, pessoal. Até a próxima!
Apenas para esclarecer: VMware Aria Automation é o novo nome do vRealize Automation. Aqui, para fins didáticos, continuo utilizando o termo vRA.

