> For the complete documentation index, see [llms.txt](https://docs.realmjoin.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.realmjoin.com/pt/dev-reference/interacting-with-runbooks.md).

# Interagir com runbooks

## Visão geral

O RealmJoin permite que você use Runbooks do Azure Automation para automatizar as operações do dia a dia no seu ambiente. Veja [Runbooks](/pt/automacao/runbooks.md) para mais informações.

A API do RealmJoin permite que você inicie runbooks a partir da sua aplicação e consulte a execução bem-sucedida de execuções acionadas anteriormente. Veja [a descrição Swagger do RealmJoin](https://customer-api.realmjoin.com/swagger/index.html) para ver quais operações são atualmente suportadas.

As seções a seguir explicam como usar a API do RealmJoin para iniciar e acompanhar jobs de runbook. Pressupõe-se que você já tenha [conectado uma conta do Azure Automation](/pt/automacao/connecting-azure-automation.md) ao RealmJoin Portal. Além disso, certifique-se de [autenticar ](/pt/dev-reference/realmjoin-api/authentication.md)cada pedido à API do RealmJoin usando um cabeçalho HTTP Authorization adequado.

## Como o Azure Automation lida com runbooks?

O Azure Automation adota uma abordagem de processamento em lote para runbooks. Quando você aciona a execução de um runbook, um job é criado para esse runbook e colocado na fila para execução.

Portanto, em geral, um runbook não começará imediatamente. Além disso, vários jobs para o mesmo runbook podem existir ao mesmo tempo em diferentes estados de execução.

Todo job tem um conjunto de parâmetros (entradas) que são passados ao script do runbook. Isso pode, por exemplo, ser duas variáveis como `$username` e `$newEmailAddress` se o runbook deve adicionar um alias de e-mail à caixa de correio de um usuário.

Todo job tem um status que representa seu estado atual de execução, veja [Microsoft Docs](https://docs.microsoft.com/en-us/azure/automation/automation-runbook-execution#job-statuses). Vamos nos concentrar em `Na fila`, `Em execução`, `Concluído` e `Falhou` neste documento. Esteja ciente de que isso é uma simplificação para facilitar a compreensão.

## Iniciando um job de Runbook

A API do RealmJoin oferece dois endpoints para acionar runbooks.

`run` executará um runbook de forma síncrona e só retornará/terminará quando o runbook for realmente concluído ou falhar. Este endpoint retorna diretamente o estado de sucesso e a saída do job de runbook associado.

`start` usará os mesmos parâmetros que `run` mas funciona de forma assíncrona. Ele retornará assim que um job de runbook for colocado na fila. Ele retornará o `jobID` para permitir o acompanhamento fácil do novo job.

### Nomeação de Runbook

Os runbooks são referenciados pelo nome no Azure Automation. Em resumo:

* Está sincronizado do repositório GitHub do RealmJoin? Adicione `rjgit-`como prefixo
* Ou `org_`, `device_`, `group_`, `user_` como escopo (exatamente um deles)
* Uma categoria, como `general_`ou `security_`
* O nome do runbook, separado por `_` como `add-xyz-exception`

O resultado neste caso seria: `rjgit-org_security_add-xyz-exception`

Ver [Convenções de Nomenclatura](/pt/automacao/runbooks/naming-conventions.md) para mais detalhes.

### Exemplo

Vamos assumir a seguinte situação:

* Tem as suas credenciais da API do RealmJoin e codificou-as para `dC0xMjM0MTIzNDpteVMzY3JldCE=` (Base64)
* Você quer iniciar o runbook `rjgit-user_security_revoke-or-restore-access` para bloquear o início de sessão de um usuário específico
* Os parâmetros para o runbook (PowerShell) são:
  * `$UserName = "someone@contoso.com"`
  * `$Revoke = $true`

Usaremos o `run` endpoint para saber imediatamente se o job foi bem-sucedido.

Vamos construir o **pedido**:

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```http
POST https://customer-api.realmjoin.com/runbook/rjgit-user_security_revoke-or-restore-access/run
```

Corpo (em notação JSON):

```json
{ 
   "UserName": "someone@contoso.com", 
   "Revoke": true 
}
```

A solicitação levará um tempo, pois aguarda a execução do job. Certifique-se de ajustar o tempo limite do seu cliente HTTP adequadamente. Caso contrário, tente usar o `start` endpoint, que retornará imediatamente.

A resposta conterá o `jobID`, o `status` (`Falhou` ou `Concluído`) e todos os streams de saída do runbook.

**Resposta**:

Estado HTTP: `200` (OK)

Corpo (em notação JSON):

```json
{
    "jobID": "1234545e-7a24-436a-90c9-6056b512345",
    "status": "Completed",
    "streams": [
        {
            "time": "2021-12-15T14:47:27.7756185+00:00",
            "summary": "RealmJoin.RunbookHelper: Executando na conta do Azure Automation",
            "streamType": "Verbose",
            "streamText": null,
            "value": null
        },
        {
            "time": "2021-12-15T14:47:27.96063+00:00",
            "summary": "getAutomationConnectionOrFromLocalCertificate: Obtendo conexão de automação 'AzureRunAsConnection'",
            "streamType": "Verbose",
            "streamText": null,
            "value": null
        },
        {
            "time": "2021-12-15T14:47:31.560861+00:00",
            "summary": "Connect-RjRbAzureAD: Conectando com o módulo AzureAD: ...",
            "streamType": "Verbose",
            "streamText": null,
            "value": null
        },
        {
            "time": "2021-12-15T14:47:33.8860333+00:00",
            "summary": "## O acesso do usuário someone@contoso.com foi revogado.",
            "streamType": "Output",
            "streamText": null,
            "value": null
        }
    ]
}
```

Os streams de saída são separados em canais diferentes (`streamTypes`): `Output`, `Verbose`, `Error`). Isso permite filtrar erros ou reduzir a saída apenas às informações relevantes, mostrando apenas `Output`.

Você pode obter esses streams depois que um runbook for concluído usando o `/runbook/jobs/{jobID}/output/streams` endpoint. (veja abaixo)

## Consultando o status e a saída de um job

Se um job já tiver sido criado, você pode usar a API do RealmJoin para consultar seu estado e saída.

### Consultando o status do job

Use `/runbook/jobs/{jobID}/status` para consultar o status atual.

Ver [Autenticação ](/pt/dev-reference/realmjoin-api/authentication.md)sobre como criar um cabeçalho de autorização, o seguinte é apenas um exemplo.

Assuma o `jobID` ser `1234545e-7a24-436a-90c9-6056b512345`

**`Sob solicitação`**

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```html
GET https://customer-api.realmjoin.com/runbook/jobs/1234545e-7a24-436a-90c9-6056b512345/status
```

Esta solicitação não tem corpo.

**Resposta**

Status HTTP 200 (OK)

Corpo (texto simples)

```
Concluído
```

Outros estados possíveis incluem `Novo`, `Falhou`, `Em execução`. Veja [estados possíveis de runbook](https://docs.microsoft.com/en-us/azure/automation/automation-runbook-execution#job-statuses).

### Lendo a saída do job

Use `/runbook/jobs/{jobID}/output/text` para obter uma representação simples em texto puro da saída de um runbook. Isso não incluirá o `Verbose` e `Error` stream. Veja [lendo streams](#reading-specific-streams) para ler outros streams. [Exceções](#reading-exceptions) são tratados separadamente.

Ver [Autenticação ](/pt/dev-reference/realmjoin-api/authentication.md)sobre como criar um cabeçalho de autorização, o seguinte é apenas um exemplo.

Assuma o `jobID` ser `1234545e-7a24-436a-90c9-6056b512345`

**Sob solicitação**

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```html
GET https://customer-api.realmjoin.com/runbook/jobs/1234545e-7a24-436a-90c9-6056b512345/output/text
```

Esta solicitação não tem corpo.

**Resposta**

Status HTTP 200 (OK)

Corpo (texto simples)

```
## O grupo de distribuição 'Sales Team' foi criado.
```

### Lendo Streams Específicos

Use `/runbook/jobs/{jobID}/output/streams` para obter uma representação JSON completa da saída de um runbook. Dessa forma, você pode acessar o `Output`, `Verbose` e `Error` stream. [Exceções](#reading-exceptions) são tratados separadamente.

Ver [Autenticação ](/pt/dev-reference/realmjoin-api/authentication.md)sobre como criar um cabeçalho de autorização, o seguinte é apenas um exemplo.

Assuma o `jobID` ser `1234545e-7a24-436a-90c9-6056b512345`

**Solicitação (todos os streams)**

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```html
GET https://customer-api.realmjoin.com/runbook/jobs/1234545e-7a24-436a-90c9-6056b512345/output/streams
```

Esta solicitação não tem corpo.

**Resposta**

Status HTTP 200 (OK)

Corpo (JSON, matriz de mensagens)

```json
[
    {
        "time": "2021-12-20T08:37:46.8572747+00:00",
        "summary": "Carregando módulo do caminho 'C:\\Modules\\User\\RealmJoin.RunbookHelper\\RealmJoin.RunbookHelper.psd1'.",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:46.9272241+00:00",
        "summary": "Carregando módulo do caminho 'C:\\Modules\\User\\RealmJoin.RunbookHelper\\RealmJoin.RunbookHelper.psm1'.",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.1522235+00:00",
        "summary": "RealmJoin.RunbookHelper: Executando na conta do Azure Automation",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.3122219+00:00",
        "summary": "Saída normal",
        "streamType": "Output",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.8422225+00:00",
        "summary": "Mensagem detalhada ou de depuração",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.7672223+00:00",
        "summary": "Mensagem de erro não interruptiva",
        "streamType": "Error",
        "streamText": null,
        "value": null
    }
]
```

Veja abaixo para ler mensagens de erro interruptivas e [exceções](#reading-exceptions)

Para receber apenas um único stream, por exemplo Verbose, você pode adicionar um filtro à solicitação adicionando `?streamTypes=Verbose`. Você também pode filtrar por `Output` e `Error`.

**Solicitação (filtrar por um único stream)**

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```html
GET https://customer-api.realmjoin.com/runbook/jobs/1234545e-7a24-436a-90c9-6056b512345/output/streams?streamTypes=Verbose
```

Esta solicitação não tem corpo.

**Resposta**

Status HTTP 200 (OK)

Corpo (JSON, matriz de mensagens)

```json
[
    {
        "time": "2021-12-20T08:37:46.8572747+00:00",
        "summary": "Carregando módulo do caminho 'C:\\Modules\\User\\RealmJoin.RunbookHelper\\RealmJoin.RunbookHelper.psd1'.",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:46.9272241+00:00",
        "summary": "Carregando módulo do caminho 'C:\\Modules\\User\\RealmJoin.RunbookHelper\\RealmJoin.RunbookHelper.psm1'.",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.1522235+00:00",
        "summary": "RealmJoin.RunbookHelper: Executando na conta do Azure Automation",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    },
    {
        "time": "2021-12-20T08:37:47.8422225+00:00",
        "summary": "Mensagem detalhada ou de depuração",
        "streamType": "Verbose",
        "streamText": null,
        "value": null
    }
]
```

### Lendo exceções

Use `/runbook/jobs/{jobID}/exception/text` para obter uma representação simples em texto puro da mensagem de exceção de um runbook (se presente). Isso não incluirá os `Output`, `Verbose` e `Error` streams. Veja [lendo streams](#reading-specific-streams) para ler outros streams.

As exceções são registradas quando ocorrem erros interruptivos na execução do script PowerShell associado ao runbook. Este endpoint lerá apenas a mensagem em texto puro e não inclui detalhes técnicos, como em qual linha de código o script parou.

No nosso exemplo, um erro interruptivo foi causado por `throw "Exception"`.

Ver [Autenticação ](/pt/dev-reference/realmjoin-api/authentication.md)sobre como criar um cabeçalho de autorização, o seguinte é apenas um exemplo.

Assuma o `jobID` ser `1234545e-7a24-436a-90c9-6056b512345`

**Sob solicitação**

Cabeçalhos:

```http
Authorization: Basic dC0xMjM0MTIzNDpteVMzY3JldCE=
Content-Type: application/json
```

Pedido / URI:

```html
GET https://customer-api.realmjoin.com/runbook/jobs/1234545e-7a24-436a-90c9-6056b512345/exception/text
```

Esta solicitação não tem corpo.

**Resposta**

Status HTTP 200 (OK)

Corpo (texto simples)

```
Exception (Exception)
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.realmjoin.com/pt/dev-reference/interacting-with-runbooks.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
