Envio de e-mail quando novo recurso é criado no vRealize Automation 8.x

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.

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *