Foi assim que me aproximei dessa área enquanto usava o papel de ser administrador de sistemas / devops. A maioria dos itens a seguir serão apenas princípios gerais que tento seguir e não específicos do Chef.
Acabei indo com o Puppet porque descobri que havia mais recursos na época e me senti mais fácil de pegar.
Eu olhei para os vários módulos pré-criados disponíveis para coisas como apache, php5, etc. Muitos deles pareciam fazer muito mais do que eu precisava e por estarem tão familiarizados com a plataforma que não confiavam no que estava acontecendo. Decidi que seria mais simples identificar o que precisava ser feito em cada tipo de nó.
Iniciei o processo provisionando o ambiente de desenvolvimento local da equipe (vargrant + caixa virtual). Para cada serviço / componente, criei um módulo: php5, apache2, redis, mysql, etc.
Depois que o ambiente de desenvolvimento estava estável / funcionando, comecei a criar o ambiente de controle de qualidade. Eu defini tipos de nós genéricos para servidores web, redis, vernizes etc. que reutilizaram os mesmos módulos que o dev. Feito isso, o armazenamento temporário e a produção precisavam de mudanças mínimas para começar a funcionar.
Ao escrever e escrever suas receitas / modelos, considere como se poderia ser reutilizado / generalizado. Não codifique coisas como caminhos ou usuários / grupos que podem mudar entre distros / projetos / ambientes. Como você está olhando para uma abordagem generalizada, acho que um grande obstáculo será lidar com as diferenças entre as distribuições * nix.
Mais importante, manter é simples. Automatize / padronize as partes mais importantes / demoradas do ambiente. Iterar, evoluir.