Недавно я начал процесс изучения того, как использовать Vagrant для развертывания локальной среды разработки. (после разочарования в различных вариантах стека WAMP) Vagrant пока великолепен ... небольшая кривая обучения, но выглядит многообещающим в долгосрочной перспективе.
Достигнув утомительного процесса попытки сделать мою виртуальную машину похожей на мой онлайн-сервер внутри ... мне кажется, что Vagrant не хватает части. Сейчас процесс более или менее похож на ручной метод проб и ошибок. Не идеально, чтобы быстро настроить с первого раза или легко синхронизировать вещи с вышестоящим сервером.
По общему признанию, я могу не знать точно, что ищу ... отсюда вопрос.
Есть ли упрощенный способ экспорта настроек с существующего сервера CentOS 5.10 для локальной подготовки Vagrant? (Марионетка, Повар, ракушка или что-то еще)
Что-то вроде этого я мог бы себе представить ...
(Подключиться к онлайн-серверу ...)
В идеале это должно выполняться во время подготовки и в основном синхронизировать локальную версию с онлайн-версией. Это избавит от необходимости постоянно настраивать локальные настройки вручную для обеспечения синхронизации. Если что-то было изменено онлайн (хостом или внутри компании) ... это распространялось бы автоматически. (конечно, в идеале вы можете пометить настройки, чтобы настроить поведение в соответствии с вашими потребностями)
В качестве альтернативы, я думаю, если бы я мог упаковать онлайн-сервер без упаковки различных пользовательских данных, это тоже могло бы сработать. Однако из того, что я могу сказать, это кажется невозможным ... и уж точно не очень эффективно.
Предостережение
В моих личных обстоятельствах я использую сервер CentOS 5.10 с cPanel. cPanel, кажется, делает много вещей на стороне сервера, что не всегда очевидно. Одним из примеров является то, что многие имена пакетов начинаются с cPanel и кажутся проприетарными, но в то же время связаны с тем, что я, возможно, захочу синхронизировать. (например, cpanel-php53) Насколько я могу судить, синхронизировать их нелегко ... так что нужно будет найти обходные пути. Другим примером могут быть пути, отличные от ожидаемых, но я не совсем уверен, поскольку недостаточно знаком с установками по умолчанию как CentOS, так и cPanel, чтобы быть уверенным в каких-либо идиосинкразиях.
Что я сделал до сих пор ...
Я кое-что сделал, прежде чем решил спросить, есть ли лучший способ, который больше работал бы рука об руку с Vagrant. Это не ужасно, но не совсем «оптимизировано» или исчерпывающе. Вот подробности ...
Я научился бегать yum repolist all
на обеих машинах и как увидеть репозитории в файловой системе с помощью cd /etc/yum.repos.d; ll;
, но не о том, как использовать эту информацию для автоматической синхронизации репозиториев.
Я написал сценарий оболочки, чтобы получить пакеты на локальном компьютере, очень похожие на удаленные. Однако, хотя он и работает честно, он не идеален, и мне интересно, есть ли лучший выход. Вопросы...
#!/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.– 7. Я написал сценарий оболочки, чтобы получить некоторые удаленные файлы конфигурации и переместить их на место локально. На поверхности он работает довольно хорошо, но я еще не проверял результаты глубоко. Я бежал date
чтобы убедиться, что часовой пояс синхронизирован должным образом, и проверил содержимое некоторых файлов, чтобы убедиться в успешности.
Опять же, это не может быть запущено как провайдер Vagrant, потому что по своей природе требует ввода пользователя. Кроме того, файлы не настраивались, чтобы гарантировать, что они будут работать локально без проблем. (например, http.conf, чтобы Apache не наткнулся на что-то и не указал MySQL на правильный каталог данных) Наконец, я уверен, что это не единственные файлы, которые я должен переносить ... это были просто самые очевидные.
#!/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!'
Вы можете просто использовать Чертеж.
Создание модулей Puppet и поваренных книг Chef
Вы сможете отредактировать получившийся пакет по своему вкусу, прежде чем пытаться развернуть его на другом сервере.