Puppet: Como usar um conjunto de pacotes comuns, mas permitir exceções?

2

Tenho cerca de 200 VMs Linux mais ou menos idênticas. Existe uma classe para todas as configurações comuns:

class my_packages {

    class { "::ntp":
        servers     => [ "de.pool.ntp.org" ],
    }
    ....
}

que incluo em cada nó no site.pp.

Agora eu quero executar meu próprio servidor de horário local, o que é trivial usando o pacote puppetlabs / ntp. Eu simplesmente tenho que substituir a entrada de servidores em my_packages com o endereço IP da nova VM do servidor de horário, e essa VM agora tem a mesma entrada de classe ntp que foi usada anteriormente em my_packages.

node 'mytime' {

#    include my_packages

    class { '::ntp':
        servers => [
            'de.pool.ntp.org',
            'ptbtime1.ptb.de',
            'ptbtime2.ptb.de',
            'ptbtime3.ptb.de',
        ],
    }
    ...
}

No entanto, como a entrada ":: ntp" da classe está agora definida no nó, não posso incluir my_packages na entrada do nó para minha nova VM do servidor de horário, pois recebo um erro "Duplicate declaration" neste caso.

Ocorreu um problema semelhante ao usar um servidor de nomes local. Cada VM tem um arquivo /etc/resolv.conf apontando para o servidor de nomes local, portanto, há um recurso de arquivo para isso em my_packages. Mas o próprio servidor de nomes local deve ter um arquivo /etc/resolv.conf diferente - ele não pode apontar para si até que sua instalação seja concluída, o que não é o caso durante a instalação.

Qual é a melhor prática para usar um conjunto comum de recursos, mas permitindo exceções ocasionais?

    
por nn4l 14.05.2015 / 21:42

1 resposta

2

Se você estiver usando o Puppet 3 ou posterior, a melhor maneira de abordar isso seria usar o hiera para executar pesquisa automática de parâmetros . Em resumo, ele permite que você declare classes usando a sintaxe include em vez da sintaxe resource-style, o que significa que você pode ter várias declarações para a classe. Note que você não pode misturar declarações include e estilo de recurso para uma classe.

Normalmente, se você usar a sintaxe include para declarar uma classe, ela falhará se tiver algum parâmetro obrigatório. Quando você usa a pesquisa automática de parâmetros, o fantoche tentará pesquisar os valores dos parâmetros por meio do hiera.

Hiera é assim chamado porque tentará procurar valores através de uma hierarquia de fontes de dados. Você pode especificar essa hierarquia em hiera.yaml e pode corresponder a vários fatos (hostname, fatos personalizados, etc.) ou verificar arquivos codificados.

Veja um breve exemplo que pode funcionar no seu caso:

Definição de classe:

class my_packages {
  include ::ntp
  ...
}

mytime.yaml:

----
ntp::servers:
  - 'de.pool.ntp.org'
  - 'ptbtime1.ptb.de'
  - 'ptbtime2.ptb.de'
  - 'ptbtime3.ptb.de'

common.yaml:

---
ntp::servers: ['de.pool.ntp.org']

hiera.yaml:

...
:hierarchy:
 - "${::fqdn}"
 - common
...

Neste caso o hiera tentaria procurar um valor para os servidores param na classe ntp, usando a chave ntp :: servers. Primeiro, ele procuraria essa chave em todos os arquivos yaml que correspondessem ao nome do host e, depois disso, pareceria comum.yaml.

Na maioria dos casos, usaria a chave em common.yaml, mas no caso do nó mytime, encontraria um valor mais alto na hierarquia e pararia de procurar lá.

Aqui está um link para um exemplo completo , que cobre o módulo ntp.

    
por 20.05.2015 / 04:59