Posso executar um comando interno do shell com o Puppet?

5

Eu quero que ~/.bashrc seja source sempre que alterar seu conteúdo. Eu criei uma classe bashrc com algo parecido com isto:

file { "/root/.bashrc":
    ensure  => present,
    owner   => root,
    group   => root,
    mode    => 0644,
    source  => "puppet:///bashrc/root/.bashrc"
}

exec { "root_bashrc":
    command     => "source /root/.bashrc",
    subscribe   => File["/root/.bashrc"],
}

mas, como você sabe, source é um comando interno do shell, existe o seguinte erro ao executar o agente:

# puppet agent --no-daemonize --verbose
notice: Starting Puppet client version 2.7.1
info: Caching catalog for svr051-4170
info: Applying configuration version '1311563901'
err: /Stage[main]/Bashrc/Exec[root_bashrc]/returns: change from notrun to 0 failed: Could not find command 'source'
notice: Finished catalog run in 2.28 seconds
notice: Caught INT; calling stop

Existe alguma solução para isso?

    
por quanta 25.07.2011 / 06:29

3 respostas

7

Não há sentido em voltar a usar o novo source dentro do Puppet, porque ele será executado em um subshell e as alterações não serão propagadas para o seu shell atual (o que é, eu suponho, o que você ' re tentando fazer). Você não pode fazer o que (eu acho) você quer fazer.

    
por 25.07.2011 / 08:03
4

Tecnicamente, você pode usar:

exec { "root_bashrc":
    command     => "bash -c 'source /root/.bashrc'",
    subscribe   => File["/root/.bashrc"],
    refreshonly => true,
}

No entanto, como @womble já apontou , não há nenhum ponto em sourcing .bashrc assim; isso afeta apenas o shell bash que é executado nesse comando, e não qualquer shell bash atualmente em execução.

Você poderia definir PROMPT_COMMAND="source /root/.bashrc" para executar novamente o .bashrc sempre que um prompt fosse exibido em qualquer shells interativos em execução no momento, mas isso exigiria um pouco de recursos. Eu nunca tentei isso, mas acho que funcionaria.

    
por 25.07.2011 / 17:22
4

Você também pode prefaciar seu comando com true && ou usar provider => shell .

Veja este e isso para discussão adicional.

Isso deve ser:

file { "/root/.bashrc":
    ensure  => present,
    owner   => root,
    group   => root,
    mode    => 0644,
    source  => "puppet:///bashrc/root/.bashrc" }

exec { "root_bashrc":
    command     => "source /root/.bashrc",
    provider => shell,
    subscribe   => File["/root/.bashrc"], 
}
    
por 04.01.2012 / 20:32