Configurando a classe cfengine3 com base na saída do comando

3

Esta questão é muito semelhante a Como posso usar a saída de um comando em cfengine3 mas a resposta não se aplica no meu caso, acredito.

Eu quero atualizar um repositório git por meio de "git pull" e com base no fato de que levar a alterações acionam alguma ação de acompanhamento.

Simplificado, se houver algo como "corresponder saída e definir classe" por meio de algum corpo if_output_matches , eu gostaria de usar algo assim:

bundle agent updateRepo {

commands:
  "/usr/bin/git pull"
    contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"),
    classes => if_output_matches("Already up-to-date.","no_update");

reports:
  no_update::
    "nothing updated";
}

body contain setuidgiddir_sh(owner,group,folder) {
  exec_owner => "$(owner)";
  exec_group => "$(group)";
  useshell => "true";
  chdir => "$(folder)";

}

Então, é possível usar a saída de um comando - possivelmente caro - e basear alguma decisão nisso?

A função execresult não é boa escolha para mim como a) o pull pode se tornar caro às vezes (não recomendado seguindo a referência cfengine3) eb) não permite especificar user, group, working dir - o que é importante No meu caso. O repositório está no espaço do usuário e não pertence ao root.

    
por gnomie 10.10.2012 / 11:20

1 resposta

6

Uma maneira de conseguir isso seria usar o protocolo de módulo suportado pelo CFEngine . Com isso, você pode definir classes arbitrárias e variáveis do próprio script. Por exemplo, um script como este (não testado):

#!/bin/bash
if git pull | grep -q 'Already up-to-date.'; then
  echo "+no_update"
fi

Armazene em / var / cfengine / modules / update_git, e então você pode fazer algo assim:

commands:
  "update_git"
    contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"),
    module => "true";

E, em seguida, atue em no_update como você fez antes.

Você provavelmente conseguiria algo assim com um corpo de classes usando os atributos mantidos / reparados / failed_returncodes , mas um módulo parece mais limpo e mais expressivo.

    
por 12.10.2012 / 18:53

Tags