Evitando a duplicação de manifesto de Puppet

2

Eu tenho um conjunto de arquivos de configuração que precisam ser implantados em vários locais em cada servidor, cada um com conteúdo diferente, no entanto, todos compartilham a mesma estrutura de localização. Eu estou tentando reduzir a quantidade de replicação que tenho em meus manifestos, fazendo uma classe comum que pode ser usada várias vezes.

Aqui está um exemplo simplificado das estruturas de arquivos:

/home/bob/config/files.cfg
/home/bob/config/settings.cfg

/home/sue/config/files.cfg
/home/sue/config/settings.cfg

/home/ann/config/files.cfg
/home/ann/config/settings.cfg

E aqui está o manifesto que eu escrevi.

class config-generic {
    file { "/home/$name/config/files.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode =>     644,
    }
    file { "/home/$name/config/settings.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode =>     644,
    }
}

No primeiro uso da classe, funciona bem.

node "client1", "client2" {
    class {'config-generic':
        name  => 'bob',
    }
}

No entanto, quando venho usar a classe novamente, é porque a classe já está definida.

( Erro 400 em SERVER: Definição duplicada: Classe [config-genérica] já está definida )

node "client1", "client2" {

    class {'config-generic':
        name  => 'bob',
    }

    class {'config-generic':
        name  => 'sue',
    }
}

Pergunta: Eu entendo o problema - no entanto, qual é a melhor maneira de reduzir a replicação em meus manifestos? Eu estou tentando evitar ter que definir uma entrada ' arquivo ' para cada usuário para cada arquivo.

    
por Coops 04.04.2012 / 13:43

1 resposta

4

O que você precisa não é uma classe, mas uma definição, desde que você queira fazer várias instâncias deles, algo como:

define config-generic ($ensure=present) {
    file { "/home/$name/config/files.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode    =>  '0644',
    }
    file { "/home/$name/config/settings.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode    =>  '0644',
    }
}

e ligue para:

node "client1", "client2" {

    config-generic {
      'bob':;    
      'sue':;
    }
}

Você também pode querer usar um modelo se houver apenas pequenas diferenças, em vez de duplicar os arquivos de origem.

    
por 04.04.2012 / 14:08

Tags