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.