Gerenciamento de configuração para 'único servidor, múltiplos administradores'

9

Configuramos um servidor que está executando a infraestrutura para uma pequena associação. Até agora, tentamos gerenciar a configuração com o Ansible, mas isso não foi um grande sucesso. Talvez estejamos fazendo errado.

Em princípio, a idéia é que esse servidor seja deixado sozinho a maior parte do tempo, com pessoas adicionando ou alterando coisas uma vez na lua azul. Isso torna crucial que tudo o que está configurado e em execução no servidor seja bem documentado e claro, pois as pessoas que não administram o sistema frequentemente perdem a visão geral (sem falar nos detalhes). Além disso, com o tempo, a composição do grupo de pessoas que administrará este servidor será alterada (à medida que as pessoas saem e ingressam no 'comitê').

Começamos com uma instalação limpa, adicionando funções no ansible sempre que desejamos configurar algo (nginx, phpfpm, postfix, firewall, sftp, munin, ..). Talvez devido à nossa inexperiência, é claro que nunca somos capazes de digitar um conjunto de tarefas ansíveis exatamente da maneira que precisamos, de uma só vez, também porque a configuração é um processo de tentativa e erro. Isso significa que, na prática, normalmente configurávamos primeiro qualquer serviço que desejássemos executar no servidor e depois convertíamos em tarefas ansíveis. Você pode ver para onde isso está indo. As pessoas esquecem de testar a tarefa ou têm medo de fazê-lo, ou pior: esquecemos ou deixamos de acrescentar coisas ao ansible.

Hoje, temos muito pouca confiança de que a configuração ansible realmente reflita o que está configurado no servidor.

Atualmente, vejo três problemas principais:

  • É difícil (leia-se: não temos uma boa maneira de) testar tarefas possíveis sem correr o risco de quebrar as coisas.
  • Ele adiciona trabalho extra para descobrir primeiro a configuração desejada e depois descobrir como traduzir isso em tarefas possíveis.
  • (Idealmente), não o usamos com freqüência suficiente para criar familiaridade e rotina.

Uma consideração importante aqui é que, para o que quer que acabemos fazendo, deve ser fácil para os iniciantes aprender as cordas sem muita prática.

Existe uma alternativa viável que ainda fornece algumas garantias e verificações (comparáveis ​​à mesclagem de arquivos Ansible para alguns master) que "configuram as coisas e anotam o que você fez" não fornecem?

EDIT: Nós consideramos nos comprometer /etccom o git. Existe uma maneira razoável de proteger segredos (chaves privadas, etc) dessa maneira, mas ainda assim temos o repositório de configuração disponível fora do servidor?

Joost
fonte

Respostas:

10

Basta girar uma VM de teste / preparo que você pode usar para validar suas alterações. Seu método atual de executar as alterações manualmente primeiro é irremediavelmente quebrado e fadado ao fracasso. Você e sua equipe precisam se comprometer a usar o CM corretamente e parte disso é ter um sistema de teste disponível. Mesmo apenas uma VM vagabunda local seria suficiente.

Isso não apenas ajudará no teste de novas alterações, mas também servirá como uma base de testes para os novos funcionários (ou funcionários mais antigos que não usam o sistema há algum tempo) para se familiarizarem com sua configuração ansível.

Em relação a manter / etc / no git: não, não faça isso. Esse diretório é apenas uma pequena parte do que o ansible está mudando, e ter o git no local só incentivará as pessoas a fazer alterações locais.

Mantenha seus playbooks ansible no git. Considere restringir as permissões para que somente você possa aplicar alterações ansíveis ao servidor ativo. Outros podem enviar solicitações pull com suas alterações, que você pode revisar e mesclar no master, se apropriado.

EEAA
fonte
Certo, esse é o cenário ideal. Entendi. O problema é que não somos uma empresa e não temos pessoas trabalhando nisso em período integral. Talvez eu tenha deixado a escala disso insuficientemente clara. Cada parte adicional (como um arquivo vagrant) adiciona complexidade que precisa ser repassada e a execução de duas configurações (ou seja, um sistema de teste no qual coisas como a automação de criptografia precisa ser zombada) faz não ajuda a simplicidade.
Joost
1
Bem, você perguntou como resolver seus problemas e eu dei minha resposta. O exposto acima é exatamente como fazemos as coisas na minha empresa e funciona muito bem. Sim, há um custo adicional em termos de espaço e tempo do servidor necessário para o teste, mas eles valem a pena porque temos um nível muito alto de garantia de que, em minutos, poderemos reconstruir qualquer um dos nossos servidores, se necessário.
EEAA
3
No fundo, esse é realmente um problema cultural e de recursos, não um problema técnico. Você não se comprometeu a usar o gerenciamento de configuração. Se você é ou não uma empresa, é irrelevante. Você está pedindo ajuda sobre como fazer as coisas corretamente, e ter um ambiente de preparação é parte disso.
EEAA
3
IMHO, sim, você deve se comprometer com isso. Se você pode ou não convencer seus colegas, é outra questão. Não há uma maneira leve de fazer isso que não exija algum nível de intencionalidade daqueles que gerenciam o servidor. Dos sistemas modernos de CM, o ansible é de longe o mais fácil de acelerar. Você não deseja acompanhar as mudanças de servidores ao longo do tempo. A única maneira de fazer isso de forma confiável é usar o CM.
EEAA
4
@ThomWiggers Vou presumir que vocês dois estão no mesmo time desde que você usou "nós". OK, você perguntou como fazer isso corretamente. Eu dei uma resposta. Você quer fazê-lo corretamente ou não. Fazer o CM corretamente leva tempo, dinheiro e intencionalidade. Se você tiver requisitos como adquirir e implantar certificados via LE, levante uma máquina virtual de US $ 5US / mês com a Digital Ocean e use-a para testes. Caramba, você pode até implantá-lo sob demanda quando quiser testar alterações e depois matá-lo.
EEAA
6

Talvez devido à nossa inexperiência, é claro que nunca somos capazes de digitar um conjunto de tarefas ansíveis exatamente da maneira que precisamos, de uma só vez, também porque a configuração é um processo de tentativa e erro. Isso significa que, na prática, normalmente configurávamos primeiro qualquer serviço que desejássemos executar no servidor e depois convertíamos em tarefas ansíveis.

Embora existam outros problemas (como não ter um ambiente de teste), você pode obter uma grande melhoria ao não fazer isso .

Um dos principais objetivos de design da Ansible é ser idempotente , o que significa que executar o seu manual várias vezes não deve mudar nada (a menos que você tenha alterado as peças). Assim, quando estou configurando um novo software, minhas etapas são:

  1. Faça alterações nas tarefas Ansible.
  2. Execute o manual.
  3. Examine o sistema e, se não estiver correto, retorne à etapa 1.
  4. Confirme minhas alterações.

Se você acha que não escreverá a coisa correta da primeira vez no Ansible, escreva assim mesmo e faça a iteração até que esteja certo, como qualquer outro código. Isso reduz bastante a chance de esquecer de Ansiblize algumas alterações que você fez, pois todas as alterações feitas já estavam no Ansible em algum momento do processo de desenvolvimento.

Boicote SE a Monica Cellio
fonte
Sim, este é um ótimo conselho. Fazer isso e garantir que você sempre possa recuperar o servidor em um estado de bom estado é muito libertador - se as coisas derem errado, basta acionar o servidor e reimplementá-lo.
EEAA
Certo, concordo que este é um meio termo muito sólido entre onde estamos agora e onde deveríamos estar. Claro, foi assim que começamos. Suponho que a principal razão pela qual chegamos até onde estamos agora é que o passo 2 estava fazendo todo o ciclo demorar demais. Pode ser que estivéssemos fazendo playbooks errados. Agora que já aprendemos um pouco mais sobre como escrever tarefas Ansible, talvez valha a pena tentar novamente. Na sua experiência, quanto tempo levaria um ciclo completo e com que frequência um iteraria? Sei que todos os números serão baseados em todos os tipos de suposições.
Joost
2
Um problema diferente que experimentei com esse processo iterativo ocorre quando você escreve uma tarefa que faz alterações, faz as alterações no servidor, descobre que as alterações estão incorretas, atualiza sua tarefa e reaplica o manual. Agora, o servidor contém uma mistura de dois conjuntos de alterações: os da primeira iteração da tarefa e os da segunda. Normalmente, a segunda iteração substituirá a primeira, mas nem sempre sempre. Existe uma maneira razoável de 'limpar' em vez de 1) fazer o SSH manualmente para desfazer ou 2) iniciar sempre uma instalação limpa?
Joost
Além disso, nuking o servidor muitas vezes não é trivial , se você tiver apenas um
Thom Wiggers
"Na sua experiência, quanto tempo levaria um ciclo completo e com que frequência um iteraria?" Comecei a usar o Ansible em janeiro; por volta de junho, cheguei ao ponto em que sou mais rápido executando todo o processo no Ansible do que manualmente, para a maioria das tarefas. O tempo específico do curso depende do projeto, de alguns minutos a algumas semanas (para alguns softwares particularmente perigosos). Se você achar que a execução do manual em si está diminuindo sua velocidade, convém usar tags para executar apenas um subconjunto durante os loops de iteração.
Boicote SE para Monica Cellio
0

O Ansible tem um tempo de aceleração antes de você exceder o seu nível anterior de produtividade, mas, uma vez feito isso, é fácil garantir o estado do sistema. Suas práticas parecem estar fora de sincronia com seus objetivos finais. Você pode ser produtivo com um conjunto de ferramentas CM, mantendo práticas sólidas de engenharia, mas leva tempo para estruturá-lo corretamente. Você está essencialmente negociando com eficiência e facilidade de implementação, para estabilidade e escalabilidade corporativa. Da mesma maneira que um programador profissional experiente não escreve hacks feios, as consequências sempre superam os benefícios.

Para iniciantes, você pode ter muitos cozinheiros, sem propriedade clara, se assim for, esperar uma tragédia dos comuns. Cada prioridade comercial supera as preocupações de engenharia do sistema todas as vezes, a menos que seja amplamente desativada e o que resta permaneça refletindo diretamente no engenheiro responsável.

Um conjunto de ferramentas do CM não pode ser projetado por administradores, é isso que acabei de perceber. Eles podem reutilizar o trabalho existente ou, possivelmente, estender-se a uma base sólida, mas mesmo assim isso exigiria uma quantidade onerosa de aplicação de práticas. O que um engenheiro pode fazer é simplesmente NÃO o que um administrador pode fazer. Muitos conceitos no Ansible são quase os mesmos de uma base de código. Você pode ensinar um python Admin e esperar resultados competentes? Não, certamente não, eu esperaria um trabalho de hackers, então você precisa tornar a tarefa estruturada o suficiente para que um trabalho de hackers seja suportável.

Portanto, é necessário configurar as coisas para o sucesso, projetar soluções para pontos de administração desnecessária. Troque a complexidade dos sistemas de baixo nível por coisas que um administrador pode realmente fazer com sucesso. Um conjunto de ferramentas CM NÃO salvará você de incompatibilidades de arquitetura ou design.

Portanto, a ordem está sujeita a modificações, obviamente porque a implementação depende de qual caminho é menos perturbador para o seu estado atual.

  1. Mova qualquer trabalho do sistema relacionado ao fluxo de trabalho relacionado a negócios para uma desagregação dedicada.

  2. Divida as tarefas na caixa, você pode ter duas ou mais caixas em uma agora.

  3. Reimplemente seu CM de uma maneira mais estruturada e siga as melhores práticas possíveis, manuais representando objetos NÃO funções ou papéis. Cada sistema deve ser descrito em uma peça.

JM Becker
fonte