Como eu substituo algumas propriedades do recurso de pacote do Chef, sem precisar definir TODAS as outras propriedades?

2

Eu uso o Chef para instalar pacotes RHEL 5.x em meus nós. Eu, claro, uso o recurso de pacote, assim como

package 'jdk'

Como você pode imaginar, tenho muitas chamadas de recurso de pacote em muitos livros de receitas.

De acordo com a documentação do pacote Chef , o recurso tem as propriedades retry e retry_delay, com valores padrão de 0 e 2 seg. respectivamente .

Agora, quero alterar esse comportamento, por isso, tente novamente em 12 e retry_delay é de 5 segundos. Agora eu sei que posso fazer isso

package 'jdk' do
  retries 12
  retry_delay 5
end

Mas então eu tenho que fazer isso em todas as chamadas de recursos do pacote. Como eu disse, eu tenho um monte deles, então eu não necessariamente quero fazer isso.

Eu comecei a escrever um custom_resource e chame-o de "meucompany_package" pode fazer isso em mycompany_package / resource /default.rb file.

# Package name
property :name, String, required: true, name_property: true
# Retries
property :retries, Integer, required: false, default: 12
# Delay between retries
property :retry_delay, Integer, required: false, default: 5

action :install do
  package name do
    action :install
    retries retries
    retry_delay retry_delay
  end
end

action :remove do
  package name do
    action :remove
  end
end

action :update do
  package name do
    action :update
    retries retries
    retry_delay retry_delay
  end
end

Agora eu posso fazer isso

mycompany_package 'jdk'

e eu vou ter 12 tentativas e 5 retry_delays. Justo o suficiente.

NO ENTANTO, isso NÃO funciona

mycompany_package 'jdk' do
  flush_cache [:before, :after]
end

pois mycompany_package NÃO define a propriedade flush_cache. Agora eu tenho que definir todas as propriedades do recurso de pacote no meu livro de receitas mycompany_package. Caramba!

Então, qual é a melhor maneira de substituir os valores padrão de novas tentativas e retry_delay do recurso de pacote?

    
por Chris F 05.04.2016 / 22:15

1 resposta

1

LWRP é provavelmente excessivo para o que você está tentando fazer. Algo para lembrar é que as receitas são apenas Ruby e qualquer Ruby que você escreve fora de um bloco é executado durante a fase de compilação. Então, com isso em mente, você pode gerar programaticamente blocos que são executados na fase de convergência.

O exemplo mais simples para resolver seu problema é fazer algo assim:

%w(jdk package2 package3).each do |pkg|
  package pkg do
    retries 12
    retry_delay 5
  end
end

Para ir além, você pode usar um hash em vez de um Array:

{
  'jdk' => {
    'version' => '1.8.0_92',
    'flush_cache' => [:before, :after]
  },
  'package2' => {
    'version' => '1.0.0'
  },
  'package3' => {}
}.each do |pkg,opts|
  package pkg do
    retries 12
    retry_delay 5
    version opts['version'] if opts.has_key? 'version'
    flush_cache opts['flush_cache'] if opts.has_key? 'flush_cache'
  end
end

Você também pode armazenar o Hash ou Array em atributos, mas lembre-se de que os atributos não são um Hash verdadeiro, eles são um Mash e há alguns has'chas lá ao tentar substituir atributos, mas isso é totalmente discussão diferente.

    
por 03.05.2016 / 00:41

Tags