这个问题的完整答案可能需要写整本书才能回答;但我不是专业的 IT 管理员,因此概述/介绍就已经很有帮助了。
假设我必须管理一台 Debian 服务器(托管提供商的虚拟服务器,具有 root 访问权限),该服务器运行 Apache、Django、一些用于管理的自写 PHP 脚本、用于状态监控的 Nagios/NRPE、用于私人文件上传的 SFTP。该服务器主要服务于通过 SFTP 上传的静态文件;Django 将用于两个小型动态站点。
我应该从哪些来源安装 Apache、PHP、Django、NRPE、Nagios 插件等软件?我能想到以下可能性:
- 使用官方 Debian 软件包
- 从官方TGZ自行编译,安装在/usr/local
- 从上游存储库下载并安装
git clone
到 /opt 或主目录 - 使用 PIP、Gem、CPAN 安装(如果可能)
- 使用 Docker 镜像
我应该使用其中哪一个?还有其他未列出的有用可能性吗?在评估所有这些来源时,我应该使用什么指导方针?是否有选择最佳安装方法的通用做法?
答案1
在我看来,正确的起源顺序是:
- 使用官方包管理工具和官方仓库
- 使用官方包管理工具和非官方存储库,经过仔细审查以确保可靠性和稳定性
- 就是这样。
你做不是想要手动安装软件。非常很快就会变成一项繁重的维护工作(您必须每天检查所有项目页面,查看是否有影响您的新错误,并且每次出现问题时您都必须安排重建并推出)。安装刚从互联网上拉取的二进制文件甚至更加疯狂;至少对于非官方存储库,您可以依赖包管理工具的签名规定:您不能确定一组随机选择的 PHP RPM 是否来自 remi 的存储库,但您可以非常确定从这些存储库安装的所有版本都来自同一个地方。
总会有反驳的观点,认为这foo
是一个特殊的雪花;只是libfoo
你的开发人员迫切需要某个版本1.4.5.a3_345.21z。实际上,有时确实如此。但事实并非像开发人员所说的那样频繁,而且您的反击应该非常强烈,这样他们libfoo
在常规渠道之外获得支持所需的痛苦与您在支持它时所遭受的痛苦相当。
即使那样,您也应该将其打包,并拥有一个公司内部存储库,以便提供该包。
答案2
那么主要以 Gem 或 PyPy 软件包形式提供的软件呢?如果我理解正确的话,我应该尽量避免使用此类软件,或者使用 Debian 软件包(即使它比较旧)?
随着
是否还有其他未列出的有用可能性?评估所有这些来源时应使用哪些指导原则?
来自原始问题。
首先,您应该尽可能使用发行版提供的软件包。这样可以得到可靠的安全补丁和错误修复。这也适用于 gems 和 python 软件包。许多软件包都由您的上游或其他志愿者项目打包。当您超出可用软件包的范围时,请使用语言级打包程序,但让它将内容保存在与系统二进制文件不同的目录中,并告诉您的应用添加该库目录。
其次,你是否能忍受较旧的软件包可能是一个艰难的决定。请记住,跟上最新的软件需要做很多工作。如果你真的想走这条路,请阅读持续集成类似的系统詹金斯或者 Travis。当你有这么多的移动目标时,保持领先的唯一方法就是不断地测试每一个新的迭代。
既然你说你正在使用“托管服务提供商的虚拟服务器”,那么最好记住:它随时可能死机。你可能需要立即重建它。(这就是云中的生活。)或者,如果你的组织真的很成功,你可能会决定要构建更多这样的服务器。这导致备份和配置管理。备份是个好主意,但我会让别人告诉你关于备份的一切。我希望你考虑安装软件时的配置管理。
有多种配置管理系统——CF引擎,木偶,厨师, 和盐是例子——但是为了便于小规模起步,我绝对建议ansible针对您的情况。您可以编写 shell 脚本来安装各种类型的软件,但让 ansible 为您完成这项工作会更简单、更简洁。
首先,我可以使用以下方法安装一些系统包apt-get
:
---
- name: install deb's needed by users
apt: name={{ item }} state=present
with_items:
- git
- git-svn
- ansible
- tmux
- screen
- whois
- traceroute
- mtr
- curl
- wget
- pcregrep
然后安装 Ruby 宝石:
- name: install vagrant 1.0
gem: name=vagrant version=1.0 state=present
和一个python包:
- name: Install (Bottle) into the specified (virtualenv), using Python 2.7
pip: name=bottle virtualenv=/my_app/venv virtualenv_command=virtualenv-2.7
with_items
如果您遵循我们在 中使用的语法,您可以在其中任何一个中安装多个 pip 或 gem。apt
您提到安装 PHP 应用程序。希望您将其存储在源代码管理中的某个地方,例如github你可以使用git 模块也可以安装它。随着您继续构建 ansible playbook,您最终会找到一种简单的方式来可靠地重新安装系统,而无需在脑中记住大量晦涩难懂的细节。