O que você realmente procura são soluções para dois problemas diferentes (mas intimamente relacionados) que se sobrepõem:
- Gerenciamento de configurações
- Automação de implantação
Há alguma sobreposição entre os dois e, à medida que você começa, provavelmente será um pouco confuso quais ferramentas usar para quais partes de sua infraestrutura. Aqui estão algumas diretrizes gerais para você começar:
As ferramentas de gerenciamento de configuração geralmente seguem um modelo orientado a recursos , idempotent . Ou seja, você modela seu sistema como um conjunto de recursos que tem estado e executa sua ferramenta de gerenciamento de configuração continuamente para ver se algo parece diferente da sua especificação. Se o recurso não estiver nesse estado, você terá alguma lógica específica do tipo para colocar o recurso nesse estado. Um pacote ou uma conta de usuário é um recurso simples e óbvio, mas você também pode ter modelos ElasticSearch, entradas em seu banco de dados SELinux ou hosts Nagios que também podem ser declarados como recursos em seu sistema de gerenciamento de configurações.
Como um exemplo rápido, um pacote pode ser instalado ou não instalado , e pode ter uma versão anexada. Uma ferramenta de gerenciamento de configuração será capaz de pegar uma especificação de configuração que diz que o pacote X deve ser instalado , ver que não está instalado atualmente, e tomar as medidas corretas para trazê-lo de não instalado para o estado instalado (obviamente, instalando-o).
Idempotence significa que você pode aplicar a mesma configuração dez, cem ou mil vezes e obter exatamente o mesmo resultado - apenas as coisas que precisam ser alteradas são realmente alteradas. Isso está em contraste com um script que pode, digamos, anexar uma linha a um arquivo de configuração cem vezes (o que significa que você acaba com a mesma linha nesse arquivo cem vezes).
As desvantagens de um sistema de gerenciamento de configuração usando esse modelo são que as associações entre seus recursos são bastante frouxas, elas não são mapeadas para tarefas de longa execução, como importações de banco de dados ou migrações de esquema, e geralmente não são fornecidas uma tonelada de controle sobre exatamente em que ordem as coisas são aplicadas em vários sistemas em uma pilha.
Puppet e Chef são exemplos de sistemas de gerenciamento de configuração.
As ferramentasDeployment automation são para executar tarefas ad-hoc . Em outras palavras, você os executa explicitamente quando precisa fazer alguma coisa. (Ok, às vezes você os executa implicitamente a partir de um gatilho, como de um sistema de integração contínua.) Eles geralmente orquestram vários sistemas de uma maneira previsível; por exemplo, você pode querer apenas que um de seus servidores da web execute uma migração de banco de dados durante uma atualização, e talvez você queira fazer a atualização do servidor de aplicativos apenas se a migração do banco de dados for bem-sucedida e talvez queira que os servidores de aplicativos reiniciem três vezes tempo para que você não reduza toda a sua aplicação durante a atualização. O mais importante é que você só quer que esse processo inicie exatamente quando você diz para .
Capistrano e Fabric são exemplos populares de ferramentas de automação de implantação. Para servidores únicos, você pode facilmente usar coisas como Makefiles em todo o seu aplicativo.
Em seu caso particular, você provavelmente quer um sistema de gerenciamento de configuração que lide com coisas como a instalação do seu sistema de banco de dados e PHP, e a configuração do seu servidor web. Por outro lado, você provavelmente quer uma ferramenta de implantação para lidar com a criação de seus bancos de dados e a população de seus dados de teste neles. O download do código do aplicativo do Git pode ser facilmente modelado por um gerenciamento de configuração ou por uma ferramenta de automação de implementação, dependendo de qual se adapte melhor às suas necessidades. E independentemente do método escolhido, as pessoas têm opiniões divergentes sobre como os arquivos de configuração do aplicativo devem entrar no servidor.
A coisa mais importante quando você está trabalhando com ferramentas como essas é que elas são um desperdício completo se você não as estiver usando corretamente. Em outras palavras, se você estiver usando um método sofisticado de implantação automatizada para colocar seu aplicativo em teste, e seu servidor de produção não se parecer exatamente com o servidor de teste sofisticado, você terá perdido muito esforço por quase sem ganho. Faça as coisas direito e elas servirão muito bem a você.