是否有一种简化的方法可以从现有的 CentOS 5.10 服务器导出设置以进行本地 Vagrant 配置?(Puppet、Chef、shell 或其他)

是否有一种简化的方法可以从现有的 CentOS 5.10 服务器导出设置以进行本地 Vagrant 配置?(Puppet、Chef、shell 或其他)

我最近开始学习如何使用 Vagrant 来启动本地开发环境。(在对各种 WAMP 堆栈选项感到失望之后)到目前为止,Vagrant 很棒......学习曲线略有不同(哈哈),但从长远来看很有希望。

在尝试使我的虚拟机看起来像我的在线服务器的繁琐过程之后...我觉得 Vagrant 缺少了一部分。目前的过程看起来或多或少像是手动反复试验。第一次快速设置或轻松保持与上游服务器同步并不理想。

无可否认,我可能并不确切知道我在寻找什么……因此才有这个问题。

是否有一种简化的方法可以从现有的 CentOS 5.10 服务器导出设置以进行本地 Vagrant 配置?(Puppet、Chef、shell 或其他)

我所设想的就是这样的事情……

(连接到在线服务器...)

  1. 检测 repo 差异并根据需要启用、禁用、添加本地。
  2. 检测包并同步本地以匹配。(从本地安装或删除)
  3. 获取 httpd.conf,调整本地(如果需要),然后同步。
  4. 获取 php.ini、调整本地(如果需要)并同步。
  5. 获取 MySQL 设置、调整本地(如果需要)并同步。
  6. 获取时区并同步。
  7. [欢迎在此提出您对其他应同步内容的建议...]

理想情况下,这将在配置期间运行,并基本上使本地版本与在线版本保持同步。这样就无需不断手动调整本地设置以保持同步。如果在线更改了某些内容(由主机或内部更改)...它会自动向下传播。(当然,理想情况下,您可以标记设置以根据您的需要调整行为)

或者,我猜如果我可以打包在线服务器而不打包各种用户特定数据,那也可以。但是,据我所知,这似乎不可能……而且肯定不会很高效。

警告

就我个人而言,我使用的是带有 cPanel 的 CentOS 5.10 服务器。cPanel 似乎在服务器端做了很多事情,但这些事情不一定立即显而易见。一个例子是许多软件包名称以 cPanel 开头,似乎是专有的,但同时与我可能想要同步的内容相关。(例如 cpanel-php53)据我目前所知,这些无法轻松同步……因此需要采取变通措施。另一个例子可能是路径与预期不同,但我不太确定,因为我对 CentOS 和 cPanel 默认安装都不够熟悉,无法确定是否存在任何特殊情况。

我至今所做的事情...

在决定询问是否有更好的方法可以与 Vagrant 配合使用之前,我做了一些事情。这不是很糟糕,但并不是真正“精简”或全面的。以下是详细信息...

  1. 我学习了如何在两台机器上运行yum repolist all以及如何使用查看文件系统中的存储库cd /etc/yum.repos.d; ll;,但不知道如何使用此信息自动同步存储库。

  2. 我编写了一个 shell 脚本,让本地的软件包与远程的软件包非常接近。然而,虽然它做得不错,但并不完美,我想知道是否有更好的方法。问题...

    • 我不确定是否允许删除本地特有的包。(此外,还会出现一些错误)
    • 我还没有想出如何补偿那些以“cpanel”为前缀的软件包,它们似乎可以替代我真正想要的软件包(PHP、MySQL 等),除非将它们从安装列表中完全删除。
    • 这不能作为 Vagrant 配置程序运行,因为它本质上需要用户输入。同样,运行此程序并删除“本地独有”的包将消除之前在配置期间运行的 yum 安装。

 

#!/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. 我编写了一个 shell 脚本来获取一些远程配置文件并将它们移动到本地。表面上看,它运行得相当好,但我还没有深入测试结果。我确实运行了脚本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!'

答案1

你可能只想使用蓝图

生成 Puppet 模块和 Chef 手册

在尝试将结果包部署到另一台服务器之前,您可以根据需要对其进行编辑。

相关内容