Execução de Tarefas Distribuídas¶
sloth-runner
suporta a execução de tarefas distribuídas, permitindo que você execute tarefas em agentes remotos. Isso possibilita fluxos de trabalho escaláveis e distribuídos, onde diferentes partes do seu pipeline podem ser executadas em máquinas distintas.
Como Funciona¶
O modelo de execução distribuída no sloth-runner
segue uma arquitetura mestre-agente:
- Mestre: A instância principal do
sloth-runner
atua como o mestre. Ela analisa a definição do fluxo de trabalho, identifica as tarefas configuradas para serem executadas em agentes remotos e as despacha. - Agente: Uma instância do
sloth-runner
executando no modoagent
em uma máquina remota. Ela escuta as solicitações de execução de tarefas recebidas do mestre, executa as tarefas e envia os resultados de volta.
Configurando Tarefas Remotas¶
Para executar uma tarefa em um agente remoto, você precisa especificar o campo delegate_to
no grupo de tarefas ou na definição da tarefa individual.
1. Delegar a um Agente no Nível do Grupo de Tarefas¶
Você pode definir o agente diretamente dentro do seu grupo Modern DSLs
usando o campo delegate_to
. Todas as tarefas dentro deste grupo serão então delegadas a este agente, a menos que sejam substituídas por um delegate_to
específico da tarefa.
Modern DSLs = {
my_distributed_group = {
description = "Um grupo de tarefas com tarefas distribuídas.",
delegate_to = { address = "localhost:50051" }, -- Define o agente para todo o grupo
tasks = {
{
name = "remote_hello",
description = "Executa uma tarefa hello world em um agente remoto.",
-- Não é necessário o campo 'delegate_to' aqui, ele herda do grupo
command = function(params)
log.info("Olá do agente remoto!")
return true, "Tarefa remota executada."
end
}
}
}
}
2. Delegar a um Agente no Nível da Tarefa¶
Alternativamente, você pode especificar o campo delegate_to
diretamente em uma tarefa individual. Isso substituirá qualquer delegação em nível de grupo ou permitirá a execução remota ad-hoc.
Modern DSLs = {
my_group = {
description = "Um grupo de tarefas com uma tarefa remota específica.",
tasks = {
{
name = "specific_remote_task",
description = "Executa esta tarefa em um agente remoto específico.",
delegate_to = { address = "192.168.1.100:50051" }, -- Define o agente apenas para esta tarefa
command = function(params)
log.info("Olá de um agente remoto específico!")
return true, "Tarefa remota específica executada."
end
},
{
name = "local_task",
description = "Esta tarefa é executada localmente.",
command = "echo 'Olá da máquina local!'"
}
}
}
}
Executando um Agente¶
Para iniciar uma instância do sloth-runner
no modo agente, use o comando agent
:
-p, --port
: Especifica a porta em que o agente deve escutar. O padrão é50051
.
Quando um agente é iniciado, ele escutará as solicitações gRPC recebidas da instância mestre do sloth-runner
. Ao receber uma tarefa, ele a executará em seu ambiente local e retornará o resultado, juntamente com quaisquer arquivos de espaço de trabalho atualizados, de volta ao mestre.
Sincronização do Espaço de Trabalho¶
Quando uma tarefa é despachada para um agente remoto, o sloth-runner
lida automaticamente com a sincronização do espaço de trabalho da tarefa:
- Mestre para Agente: O mestre cria um tarball do diretório de trabalho atual da tarefa e o envia para o agente.
- Execução do Agente: O agente extrai o tarball para um diretório temporário, executa a tarefa dentro desse diretório e quaisquer alterações feitas nos arquivos no diretório temporário são capturadas.
- Agente para Mestre: Após a conclusão da tarefa, o agente cria um tarball do diretório temporário modificado e o envia de volta ao mestre. O mestre então extrai esse tarball, atualizando seu espaço de trabalho local com quaisquer alterações feitas pela tarefa remota.