六个月前,在我们的非营利项目中,我们决定开始将系统管理迁移到 Puppet 控制的环境,因为我们预计从现在到一年后我们的服务器数量将大幅增长。
自从做出决定后,我们的 IT 人员就变得有点过于恼火了。他们最大的反对意见是:
我可以理解为什么大型组织会派遣他们的系统管理员参加 Puppet 课程以成为 Puppet 大师。但是,如果小玩家不参加课程并且基本上通过浏览器和编辑器学习它,他们如何将 Puppet 学习到专业水平?
Puppet 和 Chef 工具的新功能。似乎他们正在做的工作可以用 shell 脚本来完成。也许它是在 shell 脚本中完成的,直到这些出现。
我同意它们更具可读性。但是,除了可读性之外,是否还有其他优于 shell 脚本的优点?
假设一个环境有一个由不同服务器组成的 puppet 管理集群——各种硬件、软件、操作系统、虚拟/专用等。
您会选择有意义的主机名(mysqlmaster01..99、mysqlslave001..999、vpnprimary、vpnbackup 等)还是更喜欢无意义的主机名,例如书籍或电影中的角色?
我看到有意义的主机名的问题是名称通常代表单个服务,如果服务器有多个用途,它会变得非常混乱(特别是如果服务器角色经常变化)。
难道不是将服务名称映射到 IP 地址并维护 DNS 应该做的映射吗?
这两种方法的优点和缺点是什么,你必须用你选择的方法解决哪些实际问题?
“我们可以将现有的生产 EL5 服务器升级到 EL6 吗?”
来自环境完全不同的两个客户的一个听起来简单的请求促使我通常的最佳实践回答“是的,但它需要协调重建您的所有系统”......
两位客户都认为,出于停机时间和资源原因,完全重建他们的系统是不可接受的选择... ……”
我不是要引出关于配置管理的回应(“Puppetize一切”并不总是适用)或客户应该如何更好地计划。这是环境在生产能力中不断发展壮大的一个真实示例,但没有看到迁移到其操作系统下一个版本的干净路径。
环境 A:
非营利组织,拥有40 个 Red Hat Enterprise Linux 5.4 和 5.5 Web、数据库服务器和邮件服务器,运行 Java Web 应用程序堆栈、软件负载平衡器和 Postgres 数据库。所有系统都在不同位置的两个 VMWare vSphere 集群上进行虚拟化,每个集群都具有 HA、DRS 等。
环境 B:
高频金融交易公司,在多个托管设施中配备200 x CentOS 5.x系统,运行生产交易业务,支持内部开发和后台功能。交易服务器在裸机商品服务器硬件上运行。他们有许多sysctl.conf
,rtctl
,中断到位约束力和驱动程序的调整,以降低消息传送等待时间。有些具有自定义和/或实时内核。开发人员工作站也运行类似版本的 CentOS。
在这两种情况下,环境都按原样运行良好。升级的愿望来自对 EL6 中可用的更新应用程序或功能的需求。
两者都不能在不彻底改变操作系统的情况下轻松打包或更新。
作为系统工程师,我很欣赏红帽建议在主要版本之间移动时进行完全重建。一个干净的开始迫使你重构并在此过程中注意配置。
对客户的业务需求很敏感,我想知道为什么这需要如此繁重的任务。RPM 打包系统不仅能够处理就地升级,但它是让您/boot
受益的小细节:需要更多空间、新的默认文件系统、RPM 可能会在升级过程中中断、已弃用和已失效的软件包......
这里的答案是什么?其他发行版(基于 .deb、Arch 和 Gentoo)似乎具有这种能力或更好的途径。假设我们找到了以正确方式完成此任务的停机时间:
我正在通过一般的配置管理学习我的方法,特别是使用puppet来实现它,我想知道系统的哪些方面(如果有的话)不应该用 puppet 管理?
例如,在将系统借给 puppet 的管理之前,我们通常认为主机名已经设置是理所当然的。基本的 IP 连接,至少在用于联系 puppetmaster 的网络上,必须正常工作。使用 puppet 自动创建 dns 区域文件很诱人,但 DNS 反向指针应该在启动之前就已经到位,否则证书会很有趣。
那么我应该从 puppet 中省略 IP 配置吗?或者我应该在第一次启动 puppet 之前设置它但仍然使用 puppet 管理 IP 地址?具有多个 IP 的系统(例如,用于 WAN、LAN 和 SAN)会怎样?
IPMI怎么样?您可以使用ipmitool配置大部分(如果不是全部),从而避免获得控制台访问(物理、串行网络、远程 KVM 等),因此可以使用 puppet 进行自动化。但是在每次 puppet agent 运行时重新检查它的状态对我来说听起来并不酷,而且在做任何其他事情之前我希望对系统进行基本的熄灯访问。
另一个完整的故事是关于安装更新。我不打算讨论这个具体问题,已经有很多关于 SF 的问题以及不同系统管理员之间的许多不同哲学。我自己,我决定不让傀儡更新的东西(如只ensure => installed
),并因为我们已经习惯了做手工更新,离开这个任务的自动化到以后的一天,当我们与木偶(如更加自信。通过增加MCollective到混合)。
这些只是我现在想到的几个例子。系统的任何方面是否应该被人偶接触到?或者,换一种说法,应该在配置时设置什么和系统中“静态”配置的内容与通过集中配置管理处理的内容之间的界限在哪里?
我已经用谷歌搜索并阅读了“to-puppet-or-to-chef-that-is-the-question”文章。
我对用例感兴趣,在现实世界的实现中,人们根据实际问题选择了一个或另一个。
我对与 cobbler问题的集成特别感兴趣(我知道 puppet 是这个方向的标准方法);作为任何人在鞋匠 - 厨师整合方面的任何经验?
提前致谢
所以我们可能都遇到过这种情况:你调试了一些问题,却发现它是由你六个月前所做的配置更改引起的,而且你不记得你为什么这样做。所以你撤消它并解决问题,现在其他一些问题又回来了。哦,是的,现在我想起来了!然后你正确修复它。
那是因为你没有做好笔记,你这个笨蛋!但是这样做的好方法是什么?
在工程方面,我们有大量软件可以帮助我们检测和跟踪变化。源代码控制、代码审查等。跟踪每个更改,每个更改都需要对其进行注释。典型的工程部门需要良好的评论,以便在六个月内弄清楚为什么会这样破坏它时,您可以使用历史“责备”功能或二进制搜索构建来查明问题。这些工具是非常有效的交流工具和历史记录。
但是在服务器领域,我们有 500 种不同的服务,所有这些服务的配置方式都不同。而且它们并不总是具有文本格式(考虑设置文件夹的权限或更改页面文件位置),尽管它们可能具有文本表示。
在我们的环境中,我们检查了可以进入 Perforce 的配置文件,但这些文件很少。无法完全检查 Active Directory DB ..虽然可能是一个可以区分的转储......
过去,我曾尝试在我们的 wiki 中保留手动更改日志,但要保持这样做的纪律非常困难(我知道,这不是一个好借口,但确实很难)。
我的问题:您使用什么策略和工具来解决跟踪服务器配置更改的问题?
- 更新 -
注意:我不是在寻找共享笔记工具(我熟悉 OneNote 等),而是专门用于帮助跟踪服务器更改的自动化工具。没有用于跟踪服务器配置更改的综合工具,但也许有一些针对特定应用程序(如 GPO)的工具。
此外,我对您认为有用的特定策略非常感兴趣。“我们在 Sharepoint 中共享笔记”非常含糊。你如何保持纪律?您使用什么格式来跟踪您的更改?您如何组织变更数据?我真的很喜欢例子和想法。
我使用并喜欢 Puppet。我搬到了一家新公司,他们正在收养厨师。所以我正在尝试学习 Chef,但我很难将它们拼凑在一起,因为我仍然在 Puppet 中思考 =)
这些是我的问题:
我完成了入门教程,我看到他们有 EC2 教程,但我从未使用过 EC2,所以我很难理解它们。在这一点上,我已经托管了 Chef 并且我开始尝试配置单个节点。我从这里去哪里?我需要开始看公共食谱吗?
Opscode 上的文档还可以,但不如 Puppet 的好。我的搜索中是否还有其他好的厨师资源?
我正在研究用于服务器和应用程序配置的 Ansible。我的应用程序目前在 Vagrant 中配置了 shell 脚本。我没有重写我的脚本,而是取了一个样本并尝试部署它。
它似乎部署得很好,但在执行了一系列成功步骤后,我看到了一条失败消息:
» vagrant provision ~/vm/blvagrant 1 ?
[default] Running provisioner: ansible...
PLAY [web-servers] ************************************************************
GATHERING FACTS ***************************************************************
ok: [192.168.9.149]
TASK: [install python-software-properties] ************************************
ok: [192.168.9.149] => {"changed": false, "item": ""}
TASK: [add nginx ppa if it ubuntu 10.04 and up] *******************************
ok: [192.168.9.149] => {"changed": false, "item": "", "repo": "ppa:nginx/stable", "state": "present"}
TASK: [update apt repo] *******************************************************
ok: [192.168.9.149] => {"changed": false, "item": ""}
TASK: [install nginx] *********************************************************
ok: [192.168.9.149] => {"changed": …
Run Code Online (Sandbox Code Playgroud) 我正在考虑推出一种新的配置管理工具来取代我们自己开发的解决方案。事实上的标准是 Chef 和 Puppet,它们都是以 Ruby 为中心的(尽管显然可以用于部署非 Ruby 环境)。我们绝大多数的开发都是用 Python 完成的,我们的内部部署工具大量使用Fabric。因此,我正在学习Salt,因为它也是 Python,尽管它不如 Chef 或 Puppet 成熟。但由于我对这些选项不够熟悉,我发现很难进行比较。
除了较小的社区之外,我会通过使用 Salt 而不是 Puppet/Chef 来放弃任何重要的东西吗?
我发布这个问题已经六个月了。尽管它已关闭,但它已被观看了 1,000 多次,所以我想我会评论我的经历。
我最终决定使用 Puppet,因为它有一个更大的社区。然而,这是一次非常令人沮丧的经历,主要是由于复杂的 Puppet 配置语法。因为我现在有了比较两者的参考框架,所以我最近又看了看 Salt——我不会回去了。非常非常酷。我最喜欢的东西:
推和拉配置模型的无缝集成。Puppet 使用拉模型(节点定期轮询服务器以获取更新)并有一个名为 Marionette 的姊妹组件用于推送更改。两者对我都很重要,我更喜欢 Salt 的工作原理。当你有很多节点时,Salt 的执行速度也会快得多。
配置语法使用 YAML,它只是一种使用缩进和项目符号的简单文本格式。您也可以通过模板选择使用其他配置格式。根据我的经验,这使 Salt 的学习和维护难度提高了大约 10 倍。
基于Python。这是我最初开始研究 Salt 的最大原因。这最终成为我留下来的次要原因之一。但是,如果您是像我们这样的 Python 商店,则可以更轻松地开发 Salt 插件。