Como você gerencia e implanta as portas do FreeBSD em um ambiente amplo?

19

Estou curioso para saber como as pessoas estão implementando as portas do FreeBSD em seu ambiente. Suponho que a maioria das pessoas que usam o FreeBSD realmente esteja usando o Ports (e geralmente portupgrade para atualizar com os binários). No entanto, estou interessado em saber como você tem essa configuração, pois não estou satisfeito com o funcionamento das versões recentes. Agora estou executando o FreeBSD 9.0 e estou tendo problemas.

Eu configurei as coisas da seguinte maneira:

  • / usr / ports é compartilhado via NFS a partir de um nó (com 'atualização de busca de portsnap' noturna).
  • Cada nó monta / usr / ports com leitura / gravação
  • Eu configurei "WRKDIRPREFIX = / usr / tmp" no /etc/make.conf em todos os nós
  • Eu configurei o Portsnap para usar um índice local adicionando o seguinte ao /usr/local/etc/pkgtools.conf:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

Posso executar portupgrade -p packagecom êxito para criar um pacote e depois portupgrade -P packageinstalar o binário nos outros nós.

No entanto, em algum momento recebo o seguinte problema: /var/db/INDEX.local:23265:dbm_store failed

Não consigo pensar em outras otimizações que posso fazer no sistema, pois o índice agora reside localmente, e a única coisa realmente exportada é a árvore de portas e nada é escrito nele a partir dos nós.

vpetersson
fonte
Uma opção seria ter uma árvore de portas local completa em todos os nós (e talvez apenas montar 'distfiles' e 'pacotes'), mas isso parece um grande desperdício de espaço (e sem mencionar muitas atualizações desnecessárias).
28412 vpetersson
vpeterson: Esta é uma pergunta que precisa ser feita (estou bloqueada agora. E +5 votos e 3 estrelas sugerem que não estamos sozinhos). Talvez limpe esta questão e indique alguns problemas específicos que você está tentando resolver. (FWIW, alguém votou para encerrar sua pergunta. Pessoalmente, eu gostaria muito de ver essa ou uma pergunta semelhante salva).
Stefan Lasiewski
Não sei como tornar a pergunta mais clara. Também não acho que o @ voretaq7 realmente responda às perguntas, mas sugira um método alternativo. A questão é realmente sobre o que o tópico sugere - como as pessoas estão implementando as portas do FreeBSD em um ambiente de vários nós.
vpetersson #

Respostas:

13

Nunca fiquei totalmente satisfeito com o sistema de portas em um ambiente amplo - sempre parece que você precisa aplicar algum gerenciamento externo a ele para fazê-lo funcionar bem.

Minhas melhores dicas (em ordem de preferência crescente, solução "pior" para solução "melhor"):


Se você está construindo em cada host, não .
Se necessário, não faça isso no NFS com montagens de leitura e gravação como você descreve: Geralmente, você pode confiar nas portas para fazer a coisa certa e não pisar na árvore de portas se você fornecer diretórios de trabalho alternativos, mas é sempre melhor lembre-se: execute um espelho CVS / csup local e csup todos os seus hosts nessa caixa e construa localmente como faria se fossem máquinas individuais.
Sim, eu sei que isso significa ter mais espaço em disco nos hosts e uma etapa extra. Também é quase garantido que está livre de problemas.
Embargo: Você provavelmente deseja sincronizar os arquivos de configuração do pacote (rsync ou similar) de um "host de configuração" designado para garantir consistência em cada máquina (você pode até sincronizar a árvore inteira de portas, se desejar, em vez de usar o csup em cada nó).


Use um host de compilação, crie pacotes e instale-os.
Uma solução muito melhor do que construir em cada máquina individual: use um host de criação para criar pacotes e aponte suas ferramentas para esses pacotes.
Isso significa manter um host de construção disponível para todas as arquiteturas executadas (ou compilação cruzada), mas, no final das contas, é mais agradável para as máquinas de destino (sem grandes tarefas de compilação, garantia de consistência)


Use uma ferramenta de configuração / gerenciamento de sistema.
Essa é a solução com a qual eu acabei - eu crio uma imagem de servidor padrão e a implanto no meu ambiente usando radmind. Você pode fazer coisas semelhantes com o Puppet ou o Chef . Isso tem todas as vantagens de usar um host de construção (consistência, menos carga nos servidores individuais) e adiciona os benefícios do gerenciamento de configuração.

Advertência: Isso só funciona muito bem se suas máquinas são "idênticas" - ou seja, você pode instalar o mesmo conjunto de portas em todas elas. Ele pode funcionar se você têm diferentes conjuntos de portas, mas que aumenta substancialmente a sobrecarga administrativa.

Disclaimer: Eu sou o mantenedor da porta sysutils/radmind. Sim, eu gosto tanto que adotei.


Tudo isso é baseado na minha experiência no gerenciamento de ambientes FreeBSD de vários tamanhos (variando de 1 a 2 máquinas a mais de 100). Ferramentas de configuração / gerenciamento de sistema que enviam e mantêm uma imagem padronizada são realmente a melhor maneira de lidar com isso na minha experiência.

voretaq7
fonte
Boas dicas. Eu já joguei um pouco com o Puppet e adoro no Ubuntu. No entanto, não tenho certeza de como ele funciona com o FreeBSD. Ainda estou para tentar isso. Independentemente disso, mesmo com o Puppet, acho que chama Portupgrade, o que nos leva de volta à estaca zero. Não vejo outra maneira de funcionar, pois seria necessário fazer pkg_delete / pkg_add ou 'pkg_add -f', o que não seria uma boa ideia. Quanto ao hardware, todos são idênticos, pois são executados em uma nuvem pública (KVM / Qemu).
28412 vpetersson
Se suas configurações de hardware e software de linha de base forem idênticas, sugiro algo como radmind, gerenciando toda a imagem do sistema. Puppet e Chef são ótimas ferramentas, no entanto, como você apontou, eles chamam os binários do SO subjacente, o que impede você de usar um host de compilação e distribuir pacotes. O radmind evita isso assumindo o gerenciamento no nível do sistema de arquivos ("Se não é o que deveria estar aqui, substitua ou remova-o") em vez de tentar ser um administrador de sistema substituto ("Execute esses comandos / altere esses arquivos para eu configurar o caixa").
voretaq7
Bem, os sistemas têm hardware idêntico, mas não configurações idênticas. Vou ter que olhar para Radmind, mas não tenho certeza se essa é a melhor abordagem. O uso das ferramentas integradas deve funcionar no IMHO, e é por isso que estou entrando em contato com a comunidade para ver se perdi algo óbvio. Eu dificilmente posso ser o único a tentar fazer isso.
28412 vpetersson
As ferramentas internas definitivamente funcionam, elas exigem muita ajuda (criação de servidores, distribuição local de pacotes etc.) - Elas são realmente voltadas para o gerenciamento de uma máquina e não são dimensionadas tão bem quanto poderiam. Observe que eu deixei de fora a opção de lançar seu próprio servidor freebsd-update - nunca tentei isso além de apenas o sistema base, mas é teoricamente possível. Eu só preso ao material que eu sei que funciona :)
voretaq7
Sim, na verdade é uma ideia interessante. Só não tenho certeza se funcionaria com a distribuição de pacotes de portas sem muitas modificações. Estou realmente curioso para saber como os administradores de sistemas grandes gerenciam isso, pois há muitas implantações grandes do FreeBSD. Todos eles lançam sua própria solução? Nesse caso, isso parece muito estranho e não muito aberto.
28412 vpetersson
6

Estranho que ninguém tenha mencionado ports-mgmt / tinderbox :

O Tinderbox é um sistema de criação de pacotes para portas FreeBSD, baseado em scripts oficiais do Portbuild usados ​​no cluster de criação de pontos. Tinderbox foi escrito por Joe Marcus Clarke.

Você pode definir várias cadeias (versões básicas do sistema) e várias portas. A combinação de prisão e portstree é chamada de compilação. Uma prisão de Tinderbox não é o que se entende como uma prisão no FreeBSD, é de fato um dado mundo em um chroot. O Tinderbox suporta o rastreamento automático de dependências e reconstrói apenas pacotes que foram alterados desde a última execução. O Tinderbox tem suporte para notificação por email de compilações com falha. O Tinderbox também se integra bem ao ccache.

O Tinderbox foi desenvolvido para fornecer facilmente conjuntos de pacotes de portas necessários para plataformas e arquiteturas necessárias. O Tinderbox também é uma excelente ferramenta para testar novas portas e atualizações de portas, especialmente para testar dependências e listas de embalagem. Também é útil para testar portas em vários lançamentos do FreeBSD, já que você pode executar o FreeBSD 6.X world como uma prisão no host do FreeBSD 7.X / 8.X.

A mudança para o pkgng simplifica bastante as implantações de pacotes.
Confira no github: https://github.com/pkgng/pkgng

SaveTheRbtz
fonte
1
Embora isso certamente possa ser útil para a construção de pacotes reais em um ambiente diversificado (várias versões, arquiteturas etc.), na verdade não resolve o problema da implantação dos pacotes.
vpetersson
O Tinderbox disponibiliza os pacotes por HTTP, para que você possa combinar isso com os comentários na resposta do voretaq7 para obter sua solução de implantação (por exemplo, defina PACKAGEROOT/ PACKAGESITEe use radmind ou Puppet / Chef).
James O'Gorman
Sim, mas criar e distribuir pacotes não é o problema. Eu posso usar o portupgrade (-p) para criar o pacote e distribuí-lo via NFS (com ou sem uma árvore de portas). O problema é que esse modelo ainda exige a) uma árvore de portas completa localmente ou b) uma árvore de portas exportada via NFS, o que nos traz de volta ao problema em questão.
vpetersson
2
O Portupgrade fará exatamente o que você faria se estivesse criando a partir do código-fonte ou usando pacotes binários - pkg_deletedeve ser executado primeiro e depois instalar a nova versão. O OpenBSD lidou melhor com isso incluindo uma opção de atualização no pkg_add. Não tenho certeza sobre o Portupgrade, mas o portmaster pode funcionar apenas usando INDEX e não uma árvore de portas completa.
James O'Gorman
1
Certo, mas pkg_delete dificilmente é uma abordagem razoável. Digamos que você queira atualizar o Ruby, Python ou qualquer outro pacote que seja um pré-requisito para um grande número de outros pacotes. O pkg_delete exigiria que você exclua todas as dependências, o que dificilmente é uma opção para um sistema de produção. O Portupgrade faz um trabalho muito melhor com isso, mas, novamente, não parece escalar.
vpetersson
3

Eu gerenciei mais de 100 servidores FreeBSD simplesmente compartilhando / usr somente leitura em NFS bem ajustado, movendo os bancos de dados de pacotes de / var para / usr e associando-os a eles (não é estritamente necessário, mas habilita o pkg_info e outros). Pode ter havido um ou dois outros arquivos que precisavam ser movidos em uma direção ou outra e com link simbólico, mas toda a instalação levou cerca de uma hora para descobrir. Funcionou muito, muito bem. Se eu tivesse problemas de dimensionamento, adicionaria servidores NFS adicionais e dividiria a carga de trabalho, mas ela nunca apareceu. O desempenho nunca foi um problema para mim (na verdade, foi ótimo), mas suponho que você possa colocar o / usr do servidor NFS (ou uma cópia dele) em um MD.

penugem
fonte
Compartilhar os arquivos do pacote compilado pelo NFS (que é o que parece que você está falando?) É certamente outra abordagem razoável - você pode usar algo como fantoche (ou mesmo scripts SSH-shell e caseiros) para instalar / atualizar pacotes do compartilhamento NFS.
precisa saber é o seguinte
1

Parece que ninguém conseguiu uma boa solução para isso, infelizmente. Provavelmente, isso se deve a limitações nas ferramentas subjacentes.

Aqui está o que eu criei: eu descartei a ideia de exportar toda a árvore de portas. Em vez disso, cedi e coloquei uma árvore de portas completa em cada nó. Em seguida, montei 'packages' no NFS (para permitir a distribuição de pacotes).

Também pretendo utilizar um proxy de cache (provavelmente o Squid) para acelerar o processo do portnap. Eu escrevi um pequeno post sobre como configurar isso no meu blog.

Referências:

vpetersson
fonte