Configurando override_attributes do Chef-Solo-different em uma função

2

Primeiro, estou usando o Chef Solo e gostaria que as coisas fossem o mais automatizadas possível. Então eu tenho um problema que não tenho certeza de como resolver. Estou configurando a implementação de várias caixas Linux diferentes, e todas elas exigirão nós / funções de instalação personalizada. Exemplo:

/nodes/app_server.json

{
"run_list": [ "role[app_server]" ]
}

/roles/app_server.rb

name 'app_server'
description 'App_Server'
override_attributes({ "apache" => {
                                      "proxypass" => [" /  http://localhost:8080/"]
                                  }
                   })
run_list 'recipe[app_server]'

Meu problema é que eu vou estar executando um script para instalar o chef em todas essas caixas diferentes, mas cada um vai ter um ip diferente entre link

Eu preciso de uma maneira de poder -via linha de comando- especificar esses ip's sem ter que criar como um nó ou arquivos de função.

Eu observei um exemplo em seu website que mostra:

A função de servidor da Web

description "The base role for systems that serve HTTP traffic"
run_list "recipe[apache2]", "recipe[apache2::mod_ssl]", "role[monitor]"
env_run_lists "prod" => ["recipe[apache2]"], "staging" => ["recipe[apache2::staging]"],"_default" => []
default_attributes "apache2" => { "listen_ports" => [ "80", "443" ] }
override_attributes "apache2" => { "max_children" => "50" }

que parece ser útil, mas eu gostaria de definir um conjunto diferente de substituições para cada configuração de env_run_list e, quando executar todos os comandos do chef, ser capaz de segmentar cada um que eu quiser.

Estou indo sobre isso da maneira errada? Eu vasculhei todos os documentos para nós / papéis / ambientes etc e não encontrei nenhuma solução que requer que eu não precise fazer uma dúzia de arquivos diferentes.

    
por user130375 31.07.2012 / 01:58

2 respostas

0

Sem acesso à sua receita do app_server, inferimos que você está usando o atributo node['apache']['proxypass'] para preencher uma linha em um arquivo de configuração do apache gerado a partir de um modelo.

Meu palpite é que a linha relevante em seu modelo é algo assim:

ProxyPass <%= node['apache']['proxypass'] %>

Acho que você terá mais sucesso se usar elementos mais granulares para compor essa linha em seu modelo. Se o endereço IP para o qual você deseja fazer solicitações de proxy for diferente em todos os ambientes, você poderá utilizar os recursos de pesquisa do Chef para determinar o endereço IP necessário e passar esse endereço IP para o modelo como uma variável.

O código na sua receita pode ser algo assim:

# this search assumes that the role 'myapp_backend' is in the run list of the backend server you need to discover.
# the search returns an array of node objects, for simplicity we'll just take the first result.
proxypass_backend = search(:node, "roles:myapp_backend AND chef_environment:#{node.chef_environment}").first

template ::File.join(node['apache']['dir'],'sites-available','myapp.conf') do
  variables({
    :proxypass_local_path => '/',
    :proxypass_remote_ip => proxypass_backend['ipaddress'],
    :proxypass_remote_port => '8080',
    :proxypass_remote_path => '/'
  })
  source 'myapp.conf.erb'
end

E a linha no seu modelo seria algo como isto:

ProxyPass <%= @proxypass_local_path %> http://<%= @proxypass_remote_ip %>:<%= proxypass_remote_port %><%= @proxypass_remote_path %>

Por motivos de simplicidade, eu especifiquei valores estáticos para a porta e o caminho remotos, mas eles também podem ser definidos usando valores de atributos que podem ser substituídos no nível da função ou do ambiente. Como a pesquisa retorna objetos de nó inteiros, qualquer atributo de um nó retornado por uma pesquisa (por exemplo, a porta na qual um serviço está sendo executado) também pode ser usado para preencher variáveis de modelo (por exemplo, proxypass_remote_port ).

    
por 13.01.2013 / 18:32
0

Você pode criar um arquivo json para cada servidor que contém apenas as substituições, e você pode passar esse arquivo para chef-solo com a opção -j: chef-solo -j node.json

Você pode criar esses arquivos antes da execução do chef. Esteja ciente de que o redirecionamento de entrada ainda não está implementado: link para que você não possa ter apenas um comando bash.

Mas segundo @cwjohnston, você deve dividir essa cadeia e colocar o ip, a porta e o protocolo em atributos de nó separados. Provavelmente você pode encontrar o IP do nó atual com o Ohai (node ['ipaddress']) ou do Ruby, e definir padrões sensíveis para os dois últimos.

    
por 27.08.2014 / 18:38