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.