Existe uma maneira simplificada de exportar configurações de um servidor CentOS 5.10 existente para o provisionamento local do Vagrant? (Puppet, Chef, shell ou outro)

4

Eu comecei recentemente o processo de aprender como usar o Vagrant para criar um ambiente de desenvolvimento local. (depois de ficar frustrado com as várias opções de stack do WAMP) O Vagrant é ótimo até agora ... leve (ha) curva de aprendizado, mas parece promissor a longo prazo.

Tendo chegado ao tedioso processo de tentar fazer com que minha MV parecesse com meu servidor online ... parece-me que há uma peça que faltava no Vagrant. O processo agora parece mais ou menos como tentativa manual e erro. Não é ideal para configurar rapidamente a primeira vez ou manter as coisas sincronizadas facilmente a partir de um servidor upstream.

É verdade que posso não saber exatamente o que estou procurando ... daí a pergunta.

Existe uma maneira simplificada de exportar configurações de um servidor CentOS 5.10 existente para o provisionamento local do Vagrant? (Puppet, Chef, shell ou outro)

Algo como isso é o que eu imaginaria ...

(Conecte-se ao servidor on-line ...)

  1. Detectar diferenças de repositório e ativar, desativar, adicionar localmente conforme necessário.
  2. Detectar pacotes e sincronizar local para corresponder. (instalar ou excluir do local)
  3. Obtenha httpd.conf, ajuste para local (se necessário) e sincronize.
  4. Obtenha o php.ini, ajuste o local (se necessário) e sincronize.
  5. Obtenha configurações do MySQL, ajuste para local (se necessário) e sincronização.
  6. Obtenha o fuso horário e a sincronização.
  7. [Suas sugestões para coisas adicionais que devem ser sincronizadas são bem-vindas aqui ...]

Idealmente, isso seria executado durante o provisionamento e basicamente manteria a versão local em sincronia com a versão online. Isso eliminaria a necessidade de constantemente ajustar sua configuração local manualmente para manter as coisas sincronizadas. Se algo fosse alterado online (por host ou internamente) ... ele se propagaria automaticamente. (claro que, idealmente, você poderia sinalizar configurações para ajustar o comportamento às suas necessidades)

Como alternativa, acho que se eu pudesse empacotar o servidor on-line sem empacotar os vários dados específicos do usuário, isso também funcionaria. No entanto, isso não parece possível pelo que eu posso dizer ... e certamente não seria muito eficiente.

Advertência

Em minhas circunstâncias pessoais, estou em um servidor do CentOS 5.10 com o cPanel. cPanel parece fazer um monte de coisas que não são necessariamente óbvias. Um exemplo é que muitos dos nomes de pacotes começam com cPanel e parecem proprietários, mas ao mesmo tempo relacionados a coisas que eu gostaria de sincronizar. (como cpanel-php53) Até onde posso dizer até agora, eles não podem ser sincronizados com facilidade ... então, é preciso colocar em prática o trabalho em torno. Outro exemplo pode ser caminhos diferentes do esperado, mas não tenho certeza se não estou familiarizado o suficiente com as instalações padrão do CentOS e do cPanel para ter certeza de quaisquer idiossincrasias.

O que eu fiz até agora ...

Eu fiz algumas coisas antes de decidir perguntar se há uma maneira melhor de trabalhar mais de perto com o Vagrant. Não é horrível, mas não é realmente "simplificado" ou abrangente. Aqui estão os detalhes ...

  1. Aprendi a executar yum repolist all em ambas as máquinas e como ver repos no sistema de arquivos usando cd /etc/yum.repos.d; ll; , mas não como usar essas informações para sincronizar repos automaticamente.

  2. Eu escrevi um script de shell para obter os pacotes em locais muito próximos aos do remoto. No entanto, enquanto faz um trabalho justo, não é perfeito e eu me pergunto se há uma maneira melhor lá fora. Problemas ...

    • Não tenho certeza sobre como permitir a remoção de pacotes exclusivos para locais. (Além disso, lança alguns erros)
    • Eu não resolvi como compensar os pacotes preprended com "cpanel" que parecem ser substitutos para o que eu realmente quero (PHP, MySQL, etc) além de remover cada um da lista de instalação inteiramente.
    • Isso não pode ser executado como um provedor do Vagrant porque requer a entrada do usuário por sua natureza. Na mesma nota, executar isso e remover pacotes "exclusivos para o local" eliminaria as instalações do yum executadas anteriormente durante as provisões.

#!/usr/bin/env bash

# This script is a helper for syncing local packages to match a remote server.
# It is geared toward a remote CentOS server with cPanel thrown in the mix
# and a local "server" managed by Vagrant. Regardless, the concepts are the
# same for many kinds of set-ups and it's fairly tweakable.

# To run this script from the command line...
# Be root or become root by running 'sudo -i',
# then run 'source /vagrant/.vagrant/sync-packages.sh'

remote_host=1.1.1.1
destination=/vagrant/.vagrant/

echo -e '\nGetting packages from remote server...'
ssh root@${remote_host} "rpm -qa --queryformat='%{NAME}\n' | sort" > ${destination}packages-remote.txt

echo 'Getting packages from local server...'
rpm -qa --queryformat='%{NAME}\n' | sort > ${destination}packages-local.txt

echo 'Compiling package sets for comparison...'

comm -23 ${destination}packages-remote.txt ${destination}packages-local.txt                         > ${destination}packages-remote-only.txt
comm -23 ${destination}packages-local.txt ${destination}packages-remote.txt                         > ${destination}packages-local-only.txt
sed -r '/^(cpanel|newrelic)/!d' ${destination}packages-remote-only.txt                              > ${destination}packages-remote-only-proprietary.txt
comm -23 ${destination}packages-remote-only.txt ${destination}packages-remote-only-proprietary.txt  > ${destination}packages-remote-only-non-proprietary.txt

echo "Packages total  on local  $(cat ${destination}packages-local.txt | wc -l)"
echo "Packages unique to local  $(cat ${destination}packages-local-only.txt | wc -l)"
echo "Packages total  on remote $(cat ${destination}packages-remote.txt | wc -l)"
echo "Packages unique to remote $(cat ${destination}packages-remote-only.txt | wc -l)"
echo "Packages unique to remote *proprietary* $(cat ${destination}packages-remote-only-proprietary.txt | wc -l)"
echo "Packages unique to remote *non-proprietary* $(cat ${destination}packages-remote-only-non-proprietary.txt | wc -l)"

# If there are packages that are unique to local, prompt for removal

if [[ -s ${destination}packages-local-only.txt ]]; then
    read -p 'Do you want to remove the packages that are unique to local? (y/n) ' -n 1 -r; echo

    if [[ $REPLY =~ ^[Yy]$ ]]; then
        echo 'Removing packages (this runs in quiet mode and may take some time)...'
        yum -y -q remove $(cat ${destination}packages-local-only.txt)
    fi
fi

# If there are *non-proprietary* packages that are unique to remote, prompt for install

if [[ -s ${destination}packages-remote-only-non-proprietary.txt ]]; then
    read -p 'Do you want to install the *non-proprietary* packages that are unique to remote? (y/n) ' -n 1 -r; echo

    if [[ $REPLY =~ ^[Yy]$ ]]; then
        echo 'Installing packages (this runs in quiet mode and may take some time)...'
        yum -y -q install $(cat ${destination}packages-remote-only-non-proprietary.txt)
    fi
fi

# Wrap up

echo 'Ensuring all packages are up to date (this runs in quiet mode and may take some time)...'

yum -y -q update

echo -e "\nWe're all done here. If you need to see a log of changes, please run 'nano /var/log/yum.log'\n"


3. a 7. Eu escrevi um script de shell para obter alguns arquivos de configuração remota e movê-los localmente. Funciona razoavelmente bem na superfície, mas ainda não testei profundamente os resultados. Corri date para ver se o fuso horário estava sincronizado conforme desejado e verifiquei alguns conteúdos de arquivo para verificar o sucesso.

Mais uma vez, isso não pode ser executado como um provisionador do Vagrant porque requer a entrada do usuário por sua natureza. Além disso, nenhum ajuste foi feito nos arquivos para garantir que eles fossem executados localmente sem problemas. (como o http.conf para garantir que o Apache não tropeça em algo ou apontar o MySQL para o diretório de dados correto). Por último, tenho certeza de que esses não são os únicos arquivos que eu deveria estar portando ... esses eram apenas os mais óbvios.

#!/usr/bin/env bash

# This script is a helper for syncing local settings to match a remote server.
# It is geared toward a remote CentOS server with cPanel thrown in the mix
# and a local "server" managed by Vagrant. Regardless, the concepts are the
# same for many kinds of set-ups and it's fairly tweakable.

# To run this script from the command line...
# Be root or become root by running 'sudo -i',
# then run 'source /vagrant/.vagrant/sync-settings.sh'

remote_host=1.1.1.1
destination=/vagrant/.vagrant/

echo 'Getting config files from remote server...'

scp root@${remote_host}:"\
/usr/local/apache/conf/httpd.conf \
/usr/local/lib/php.ini \
/etc/my.cnf \
/root/.my.cnf \
/etc/localtime \
" ${destination}

echo 'Syncing files...'

mv -f ${destination}httpd.conf  /usr/local/apache/conf/httpd.conf
mv -f ${destination}php.ini     /usr/local/lib/php.ini
mv -f ${destination}my.cnf      /etc/my.cnf
mv -f ${destination}.my.cnf     /root/.my.cnf
mv -f ${destination}localtime   /etc/localtime

echo 'All done!'
    
por Michael X 02.05.2014 / 19:11

1 resposta

6

Você pode querer usar apenas o Blueprint .

Como gerar módulos de marionetes e livros de culinária do chef

Você poderá editar o pacote resultante para experimentar antes de tentar implantá-lo em outro servidor.

    
por 02.05.2014 / 19:45