Chef - Como calcular atributos de valores específicos de nós?

7

Digamos que eu tenha um livro de receitas que configure e instale um deamon mágico:

magical-deamon / recipes / default.rb:

template "/etc/magical-deamon/magical.conf" do
    source "magical.conf"
    mode 0644
    notifies :restart, resources(:service => "magical-deamon")
end

magical-deamon / attributes / default.rb:

default['magical-deamon']['memory'] = 1024

magical-deamon / templates / default / magical.conf.erb:

memory = <%= node['magical-deamon']['memory'] %>

Como eu entendi Chef, eu usaria os atributos do nó para definir o valor da memória como:

{
    "normal": {
        "tags": [],
        "magical-deamon": {
            "memory": 256
        }
    },
    "name": "server.example.com",
    "chef_environment": "production",
    "run_list": [
        "role[base]"
    ]
}

Ou por meio de um papel:

{
    "name": "base",
    "default_attributes": {
        "magical-deamon": {
                "memory": 756
            }
    },
    "json_class": "Chef::Role",
    "env_run_lists": {
    },
    "run_list": [
    ],
    "description": "base role applied to all nodes",
    "chef_type": "role",
    "override_attributes": {
    },
  }
}

Ou um ambiente:

{
  "name": "production",
  "default_attributes": {
    "magical-deamon": {
        "memory": 756
    }
  },
  "json_class": "Chef::Environment",
  "description": "",
  "cookbook_versions": {
  },
  "override_attributes": {
  },
  "chef_type": "environment"
}

Até aí tudo bem ...

Agora eu tive a idéia boba de definir 'memória' para um valor dinâmico específico do nó.

Digamos que nosso deamon mágico deva consumir 75% da memória total que o nó possui.

value = total_memory * 0.75

Vindo de um background de programador, gosto de deixar esse conhecimento fora do livro de receitas, porque eu gosto do meu livro de receitas reutilizável para outras pessoas.

Eu pensei que o lugar certo seria em algum lugar onde os atributos estão sendo definidos. Mas fazer esse cálculo dentro do json ou do ruby dsl não é possível.

Então, minhas perguntas são:

  • A minha abordagem geral (value = total_memory * 0.75) é uma ideia estúpida?
  • Como você definiria esse tipo de atributo? Tenha em mente: Haverá mais de um valor e um nó :) E pode haver algum cálculo envolvido MB - > KB e arredondamento e assim por diante. Transformar todos os atributos na receita, não deve ser uma opção;)
por Alexander Jäger 20.02.2012 / 15:24

1 resposta

10

Não estou tão interessada na ideia de total_memory que é algo de uma quantidade indireta. Talvez faça mais sentido no contexto de qualquer que seja o daemon mágico.

Para atributos ajustáveis como a memória total, eu faria basicamente o que você definiu na pergunta, adicionando um valor padrão sensato a attributes / default.rb (reduz as perguntas de suporte quando alguém esquece de definir explicitamente um valor) e substituir com valores específicos de ambiente, função ou nó quando necessário.

É possível fazer aritmética dentro do arquivo ERB assim:

memory = <%= (node['memory']['total'][0..-3].to_i / 1024) * 
             node['magical-daemon']['memory'] %>

Ohai disponibiliza as estatísticas do free (1), que inclui a memória total em kB. node ['memory'] ['total'] = '12312432kB' na minha estação de trabalho.

Eu também tento usar os atributos com a menor prioridade possível, ou seja, prefiro os atributos padrão sobre os normais, e os atributos normais sobre os atributos de substituição. Então,

  • escolha um padrão de receita sensato, sempre que possível
  • use um atributo de ambiente padrão (você usa um atributo de substituição no exemplo)
  • use um atributo de função para grupos de nós (novamente, você usa um atributo de substituição)
  • e, finalmente, atributo de nó padrão

Veja o link precedência do atributo na wiki do Chef para a ordem em que os atributos se sobrepõem.

Usar os atributos padrão de precedência mais baixa, sempre que possível, permite definir o valor do atributo de acordo com o ambiente, a função e o nó, mas libera os níveis superiores de precedência quando você precisar fazer algo complicado.

    
por 20.02.2012 / 22:17

Tags