Linux运维趋势--第9期


内容目录 【人物】 专访 Linus Torvalds:鄙视用道德绑架开源的行为................................................................................3 【交流】 Oracle RAC 之外的方案 无需重写而实现读写扩展性............................................................................6 【八卦,趣闻与数字 2011.05 – 2011.06】..........................................................................................10 【本期专题:Puppet】.............................................................................................................................11 关于 Puppet................................................................................................................................................12 在 Ubuntu 上快速安装最新版本的 Puppet...........................................................................................13 Puppet 使用方法总结................................................................................................................................15 磨刀不误砍柴工 Puppet 语法详解..........................................................................................................19 SVN 自助更新:运维利器 Puppet 实例讲解.........................................................................................22 Puppet 常见 FAQs.....................................................................................................................................27 【技巧】 分享平时工作中那些给力的 shell 命令...................................................................................................28 完善 Linux/UNIX 审计 将每个 shell 命令记入日志..............................................................................30 20 个你不得不知的 Linux 服务器性能调优技巧....................................................................................32 杂志策划:51CTO 系统频道 本期主编:李晶 责任编辑:杨赛 封面制作:徐泽琼 交流圈子: http://g.51cto.com/linuxops 专题页面邮件订阅入口: http://os.51cto.com/art/201011/233915.htm 下载汇总页: http://down.51cto.com/zt/71 投稿信箱: yangsai@51cto.com 人物 People 年,Linux 20 岁了。在 Linux 开始 发布时,Linus Torvalds 为何选择 非 GPL 版权而不是 GPL 许可?让我们一起来 看 看 Linus Torvalds 的 回 答 。 本 文 是 LinuxFr 对 Linux 创 始 人 Linus Torvalds 的 今 采访的第一部分。以下是原文。 LinuxFR:截至目前,你已经从事了大约 20 年的 Linux 开发,我们知道这是一个辛苦 的工作,不知道你现在是否还和当初一样感觉 很有趣,很兴奋? Linus Torvalds:哦,当然!我仍然觉得 这是一件有趣的事情,部分原因恰恰是因为我 为它做了 20 年的工作。我不想将其称为一个 “辛苦”的工作,它仍然充满挑战和趣味,但 我认为我已经轻车熟路了。 LinuxFR: 你 为什 么选 择 将 Linux 内 核最 初的非 GPL 版权转为 GPL 许可?是出于道德 还是现实需要? Linus Torvalds:是为了现实需要。我最 初选择的许可考虑到了道德方面的原因,但它 显得过分严格,知名度也不高。转向 GPL 解 决了原许可模式存在的问题,越来越多的人拥 护,并主动为我宣传。 LinuxFR: 我 知 道 你认为 你 自己是 一 个 非 常务实的人,而不是一个预言家,但不知你是 否赞同 GPL 许可协议中关于道德部分的内容? Linus Torvalds:我用两个不同的方法来 回答你这个问题,并说说我为什么要用两种方 法。 首先,我个人非常鄙视那些将道德和 GPL 相提并论的人。我认为这完全是胡说,为什么 因为道德是人们的隐私。无论何时,你在一份 我个人非常鄙视那些将道德和 GPL 相提并论的人。我认为这完全是胡说,为什么?因为道 德是人们的隐私。 专访 Linus Torvalds:鄙视用道德绑架开源的行为 采访/LinuxFR 翻译/黄永兵 人物简介: 林纳斯 · 本纳第克特 · 托瓦兹( Linus Benedict Torvalds, 1969 年 ~ ) ,著名的电脑程序员、黑客, Linux 内核的发明人及该计划的 合作者。托瓦兹利用个人时间创造出了这套当今全球最流行的操作 系统内核之一,使自由软件从产业思想运动转变为市场商业运动, 从此改变了软件产业。 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 3 人物 People 协议中使用道德来约束其他人应该做什么事情 你首先就是不道德的,你只是一个道貌岸然的 伪君子。 但第二个答案是,我个人觉得 GPL(v2)和 我的想法最吻合。我的确很喜欢编程,我希望 将我的经验和别人分享,我认为只要你能想到 就一定能做到,但要提高的确需要前人的经验 这对开发人员来说是一条捷径。 因此,我个人认为 GPL v2 最符合我的口味, 就好像生活找对了方法一样美好,但我认为正 确的方法不应该只有一个,我也从事一些商业 编程,我也喜欢分享,我觉得这是平等的(嘘 他们是付了钱的)。 我认为 GPL v2 是一个伟大的许可协议,我 出于个人原因而使用它,我想很多人也和我有 同样的看法吧。但我真的想指出的是,许可协 议和道德本身是没有干系的,好比很多人认为 BSD 许可协议具有更多的自由,所以它是一 个更好的许可协议;但也有一部分人更喜欢使 用保留所有权利的许可。当然每个人都有自己 的选择权,我没有丝毫贬低他们的意思。 但是,企图将任何特殊的许可当做道德选 择真的让我愤怒。 LinuxFR: 为什 么 桌面如 此 特 殊, 为什 么 比其它市场艰难? Linus Torvalds:因为它更加有趣。在这 个市场中,人们可以做许多不同的事情。的确 服务器几乎没有做不了的事情,它可能有充足 的 CPU 计算资源,快速的网络和大量的 IO, 但它一直做着相同的事情,而且是有限制的: 它运行一个数据库,一个邮件或 Web 服务器 各种分析等。对企业来说,它可能是重要的, 但它的工作负载不会经常发生变化,也没有哪 个个体会喜欢它。 相反,你的桌面是你每天都要看到的,即 使有些东西你不需要,你也不会对它们产生反 感,使用时间长了,你可能还会产生一种依赖。 桌面做的事情更多,你在它上面玩游戏, 编写文档,开发软件,对某些人来说,只有一 个浏览器就足够了,正是要应付这么多的任务 桌面比服务器更复杂。有趣的是,智能手机也 慢慢开始出现桌面的复杂性。 LinuxFR: 为什 么 Linux 桌面未 被主 流 用 户采用?内核社区能改善这个情况吗?还是这本 身属于用户空间的问题? Linus Torvalds:我认为在内核方面没有 太多的解决办法,但我们会继续想办法改进。 我们不是没有主流用户 – Android 用户就是 Linux 主流用户,问题是桌面是一个困难的市 场,有巨大的网络效应,大多数人都不希望改 变他们的环境,如果必须转移到新环境,他们 也希望获得帮助和支持,这里的“支持”不一 定非得是商业支持,只要有一个经验丰富的人 在你身边给你提供一些建议即可。但这不全是 技术问题,更多的是社会问题。 LinuxFR: 下 面 这 个问题 可 能 有点 唐 突, 你现在仍然完全了解 Linux 内核的所有部分吗? 或者说你真正信任维护者吗?例如,就复杂的 路 径 名查找补 丁, 你 是如何 在 Nick Piggin 和 Dave Chinner 贡献的补丁做出选择的?你 是否接受了 A1 Viro 的一些建议,还是你一 个人做的决定? Linus Torvalds:没什么,我肯定不能了 解内核的所有部分,但我比大多数内核开发人 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 4 人物 People 员了解要多一些,不过有些地方我几乎完全依 赖于维护者,因为我对某些子系统几乎一无所 知,当然每个人都有自己感兴趣的领域。 例如我非常熟悉 VFS 和 VM 层,因此在这 些方面我可以自己做出决定,但这并不意味着 我不希望获得别人的帮助。 对于我不熟悉的领域,我一般不会做独裁 决定,但我会敦促维护者认真思考问题,并给 予一定的指导性意见,协助他们做出正确的决 定。 顺便说一下,“正确的决定”不一定需要 正确的表达。有时你仅仅需要做一个决定,并 不一定要明确“正确”答案是什么;有时说 “我们不知道”可能更好,毕竟不能靠拍脑袋 做决定;但有时我们必须做出技术选择,这是 一个痛苦的过程,完全可能做出错误的技术选 择。但有什么办法呢,在没有任何可供借鉴的 经验之前,我们只有通过试错的方法来找出正 确的技术。 幸好这种情况并不多见,开发期间大多数 时候不需要做出艰难的选择,前进的方向都非 常明了。 LinuxFR : Lennart Poettering 曾 说 : “ 实 际 上 , Linux API 已 经 取 代 了 POSIX API 的角色,Linux 已成为所有自由软件开发 的焦点”,你对此有何看法? Linus Torvalds:的确如此,我认为它为 简化非常困难的问题提供了一个可行的方法。 Linux API 兼容 POSIX API ,因 此,如果你 想以后将项目移植到其它平台,选择 Linux 作 为开发平台无疑是最佳的选择。 LinuxFR: 你认为 systemd 相 比 SysV 初 始化程序是一个巨大的进步吗?它是一个改变 游戏规则的技术吗? Linus Torvalds:我对此也持观望的态度, 它的使用范围还不够广泛,我认为启动性能很 重要,任何对此有帮助的技术都是好事情。 LinuxFR:你使用 btrfs 吗?你认为它何时 能准备好取代默认推荐的文件系统 ext4? Linus Torvalds:我在我的两台笔记本电 脑上使用了 btrfs。但坦白地说,谈到文件系 统的使用时,最大的因素是发行版的支持。当 然,文件系统本身的核心功能也很重要。人们 除了关心文件系统的功能和性能外,更关心其 稳定性。 LinuxFR:据我所知 , 你 对生物学和进化 论也很感兴趣,这些只是对 Linux 开发有用吗? Linus Torvalds : 我 不 认 为 这 些 知 识 对 Linux 内核开发有用,这些都只是我的个人兴 趣而已,生物学、进化论和人类行为都是让人 着迷的主题,我认为在技术发展和进化论之间 有许多相似之处。技术进步更多的是“有机” 的发展,只有很少一部分是超前设计,实际上 我认为大多数技术问题都太复杂了,只能通过 渐进式改进、试验和不断摸索才能找到最佳的 解决方案。▌※ 本专访为节选,完整内容请参考英文原文: https://linuxfr.org/nodes/85904/comments/12 30981 译文原文: http://os.51cto.com/art/201105/262279.htm 推荐阅读: 专访 Linus Torvalds :对所有 Bug 一视同仁 专访 Linus Torvalds :微内核仍是个技术失败 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 5 交流 Interact 本文中,专注于 Java 和.NET 应用 平台的 GigaSpaces 公 司创 始人兼 CTO Nati Shalom 以 其 一 个 银 行 客 户 Avanza 为例,介绍了不采用 Oracle RAC 方 式的另一种扩展性的解决思路,其原则就是: 无需重写而实现读写扩展性。以下为正文: 在 上周我参加了我们某位合作伙伴于斯德哥 尔摩举办的研讨会,在该活动中我提出了数据 扩展性领域的整合趋势——特别是从 NoSQL 向 NewSQL 的 过 渡 以 及 整 合 趋 势 使 得 现 有 SQL 及 NewSQL 更紧密地联系在一起。正如 我在自己之前的某篇文章中就已经指出过的, “YeSQL:一种只存在于后 SQL 领域中,对 各类 Query 语义进行归纳的概括。” 在 本 次 活 动 中 , Ronnie Bodinger—— Avanza 银行 的 IT 部门主管给出了精 彩的评 述,详尽说明了他们是如何将既有银行业务应 用程序迁移至读写扩展性更好的新站点的。 Avanza 系统概述: Avanza 是一家瑞典银行,以为投资者提供 便利的产权交易及资金转移业务而闻名。它同 时处理着斯德哥尔摩证券交易所中最大比例的 交易活动。 该银行通过网上银行系统为其投资者提供 服务,其目前的在线系统所使用的是典型的基 于 Java,JSP 及 Spring 的站点。 现有站点的架构扩展 目前绝大多数站点的交互功能都以读取访 问居多,而扩展性方面最主要的挑战是对现有 并行读取操作进行调整。读取扩展是由端点缓 存结构处理的,该结构通常存在于多数现有的 LAMP 及分布式缓存部署当中。在那里的首个 查询指令指向数据库,而其后的查询指令则指 向缓存内容。 新系统 新网站的设计理念要求契合当前的实时同 步及社交使用的需求。这就意味着大多数流量 及网络活动如今都是由用户所发起,而不同于 以往常见的由网站所发起。此外,这类指令的 执行过程及结果必须实时提交给使用银行业务 的所有用户。 挑战 新网页的变更会带来流量及负载响应方面 的一系列变化,这些变化无疑对扩展性提出了 更高的要求。 6 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 应用程序中需要强化写入访问效果的区域相对于整个系统来说往往并不大。因此,首先确 保只有涉及相关应用程序的热点区域会被变更,而其余应用程序保持原状。 Oracle RAC 之外的方案 无需重写而实现读写扩展性 文/Nati Shalom 编译/核子可乐 交流 Interact 写入扩展性 当我们现有的端点缓存架构需要应对大量 的更新活动时,其性能表现就会大打折扣。这 时缓存响应速度会变得极为缓慢,缓存同步过 程也会因此成为一项增加开销却毫无效果的工 作。 采用甲骨文出品的 RAC 高端硬件平台同样 无法收到理想的结果。该解决方案不仅贵得离 谱,同时也无法契合保证扩展性所必需的各项 要求。 与从零开始建造一个应用不同,Avanza 目 前已然建立起一套服务现有客户群体的在线应 用程序。这又带来了以下列举的数项额外挑战: ◆现有数据模型 与应用程序配套的整套数据模型是由这样 一种模型关系所衍生的。数据模型的改变或将 其迁移至新的 NoSQL 架构都会被认为将引发 巨大的变化,而这些变化可能会在今后的数年 时间中持续带来各种不利影响。 ◆系统残余 网上银行应用程序中包含着大量残余的应 用程序及第三方服务内容。由于其对第三方工 具的依赖性,对现有基础设施进行重写既不可 能也不实际。 ◆复杂的环境 图 1 复杂的环境 由于通常情况下,很大一部分的剩余应用 程序在设计过程中都没有考虑到扩展性的需要 并且也不具备明确的整体架构,因为多年以来 这类程序的编写一直习惯于采用分层处理的方 式。这也使完善扩展性的复杂程度更进一步。 ◆现有基础知识 现有的开发团队在 Java 及 Java Ee 方面具 备良好的知识与技巧,而强迫团队/开发小组 立即接受一套全新的基础知识不仅仅是一项沉 重的负担。这种毫无缓冲的高速发展要求以及 随之而来的系统复杂性也可能会成为难以逾越 的巨大障碍,并且需要耗费数年时间才会被克 服。 解决方案:无需重写而实现读/写扩展性 很明显,迎接新的扩展性挑战将会涉及到 现有应用程序的变更,其主要问题在于如何缩 小变更范围以避免重写波及全部既有内容。第 二个目标则是在尽量降低总体运营成本的前提 下实施变更。 为了实现上述两个目标,Avanza 银行采取 了下列方法: ◆通过明确辨别可扩展的热点来最小化变更 的影响范围 应用程序中需要强化写入访问效果的区域 相对于整个系统来说往往并不大。因此,首先 确保只有涉及相关应用程序的热点区域会被变 7 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 交流 Interact 更,而其余应用程序保持原状。在 Avanza 的 实践过程中,所有在线网页应用程序会调用到 的热点区域都被标注在特定的表当中。大多数 后端系统则仍然通过访问数据库来实现报告生 成、同步及批处理操作,因此这些部分可以保 持不变。 ◆保持数据库原状 当前主流设计的关键条件之一就是必须具 备 独 立 于 数 据 库 之 外 的 读 / 写 扩 展 处 理 能 力 (详见下一条)。这样就可以保持现有数据库 及数据模式不变。如此一来,只要数据库不发 生变更,其余所有系统组件都能够继续与其协 同运作。 ◆将内存中的数据网格作为通往数据库的前 端 应用程序的扩展性调整是由应用程序前端 借 助 内 存 数 据 网 格 ( 简 称 IMDG ) 完 成 的。 IMDG 中包含全部当前使用中的表格或原始数 据库行。在线网页应用程序会转而访问 IMDG 而非通常情况下的数据库。IMDG 分布广泛, 因此我们可以通过将读写操作的负载分配到某 个计算机群组上的方式来实现扩展性的提高。 ◆采用先读后写的方针以降低同步时的系统 负荷 自 IMDG 至底层数据库的更新过程会分期 分批地完成,这要归功于一套内部队列机制 (即再执行日志)。 ◆利用 O/R 映射功能将数据反向映射到其 原始格式中 在多数情况下,为了达到最佳的扩展效果, 我们需要对数据进行划分。这通常涉及到数据 模式的改变。数据模式的改变可能会破坏整套 系统,这也包括了那些与扩展瓶颈问题无关的 其它区域。为了满足这种不谐调的匹配方式, 我 们 将 数 据 模 式 改 变 所 影 响 的 范 围 固 定 在 IMDG 之 中 。 数 据 由 IMDG 模 式 通 过 诸 如 Hibernate 或 Open JPA 之类标准的 O/R 映 射工具映射为原始模式。 ◆借助标准的 Java API 及框架以充分利用 已有的基础知识 新的 NoSQL 数据库替代方案所带来的众多 挑战之一,是它们往往强迫我们对架构进行完 全重组。对于企业来说,这种彻底的废旧立新 使得开发人员不得不重新学习大量基础知识, 以应对新 API 在功能维护及数据库制定方面的 种种问题,而这无疑会带来高昂的迁移成本。 IMDG 中包 括 GigaSpaces 公 司所公布 的 标准化 API 及 JPA。此外,它们允许企业在移 除大部分读/写负载的同时,延伸其对现有数 据库的使用范围。无论是使用标准化 API 还是 现有数据库,企业都可以借此充分利用自身的 知识储备并满足扩展性调整中的各种需求。这 同时使企业在日后得以利用新扩展数据库的插 件来尽可能使自身向全新的对外扩展体系结构 的过渡变得较为顺畅。 ◆利用两个并行(即新旧两个)站点实现逐 步过渡 将所有客户立即转移到新系统上常常不是 什么好主意。更好的方法是将客户分批选定, 逐渐迁移到新网站中。实现这一目的的通常手 段是准备两个各自同时进行的网站。这一计划 中的挑战在于保持两个网站间的同步状态。在 Avanza 银 行 的 例 子 中 , 他 们 使 用 了 GigaSpaces 公司的镜像服务以保持两个站点 间的绝对同步,并同时利用这种方式保持站点 的数据更新。 8 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 交流 Interact 下图从直观的角度向大家描述这种方法的 实施要点: 图 2 实施要点 总体运营成本角度 该项目的第二个目标是降低当前系统的总 体运营成本。 具体实施方式如下: ◆利用内存提供高性能的访问响应,利用硬 盘存储长期数据 正如我在之前的某篇文章中提到,基于内 存的性能解决方案比起基于硬盘的同等效果的 解决方案,能够节省十倍甚至一百倍的成本。 而且,内存价格仍在不断走低。 1GB 的内存使用成本只有区区每月 1.9 美 元。利用内存来存储 1T 数据并要求能够接入 单独的真正应用集群,每个月带来的也只是 1800 美元的成本。 因此,最佳解决方案是用内存来管理那些 对访问的读/写速度要求较高的数据,而用硬 盘来存储那些访问频率较低但长期存在的数据。 ◆使用普通的数据库及硬件 单独部署 Oracle RAC 可能要花掉 50 万美 元。将数据网络放入数据库的前端则使我们不 需要 Oracle RAC 数据库所提供的许多高端功 能。我们同样不再需要类似存储设备及无限带 宽网络等等这类高端硬件配备。 结语 许多现有的应用程序在开发构建过程中采 用了一层叠一层再叠一层的方式。相关数据库 往往成为这类系统的核心组成部分,对此类系 统进行扩展性调整可谓非常具有挑战性的任务 这一现状使得许多企业选择采用更简单的方法 即在高端硬件及数据库上大把大把地花钱。通 过研究,我们发现这种方式在很多情况下并不 奏效,而且比起其它更便宜、扩展性更好的备 选方案,这种方式也实在是太昂贵了。有时候 我们完全可以将数据迁移到 MySQL 中并使用 戴尔服务器来运行整套相关的数据系统。 ▌※ 本文为节选,完整内容请参考英文原文: http://natishalom.typepad.com/nati_shaloms _blog/2011/06/readwrite-scale-without- complete-re-write.html 译文全文: http://os.51cto.com/art/201106/267831.htm 9 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 八卦 News 【Linux 内核】在 Linus Torvalds 发布第 一 版 Linux 内 核将近 20 年 ,历经 39 个 2.6 内 核 主 版 本 之 后 , Linux 之 父 刚 刚 通 过 了 Linux 3.0 的发布。Linux 内核 3.0 目前已经 在 RC1 阶段。不过 Linus 表示,3.0 版本只 是数字上的改变而已。 http://os.51cto.com/art/201106/266738.htm 【RHEL 6.1】红帽在 5 月 19 日宣布发布 其 企 业 级 Linux 6.1 的 正 式 版 ( RHEL 6.1)。RHEL 6.1 是红帽企业级 Linux 6.0 系 列的第一次更新,除了性能改进之外,还添加 了对新硬件的支持,新增了网络接口可选协议 等。 http://os.51cto.com/art/201105/263240.htm 【Fedora 15】开发代号为 Lovelock 的 Fedora 15 正式版于 5 月 24 日正式发布,搭 载了全新的 Gnome 3 桌面环境,同时提供 了大量的新特性及新组件。 http://os.51cto.com/art/201103/246763.htm 【Ylmf OS】Ylmf OS 4.0 正式版于 5 月 底发布,应用环境与最近的一个测试版一样, 集 成 LibreOffice, 小 小 输 入 法 , 优 蛋 for linux,webqq,Chromium 等应用。 http://os.51cto.com/art/201105/265827.htm 【CentOS 6】CentOS 6.0 ISO 原本计划 6 月 6 日同步到全球镜像服务器,根据最新计 划又推延至 6 月 13 日。 http://os.51cto.com/art/201106/266644.htm 【 Ubuntu 11.10 】 Ubuntu 11.10 Alpha 1 于 6 月 3 日 正 式 发 布 , 与 Ubuntu 11.04 版 本 比 较 最 大 的 变 化 就 是 升 级 到 Gnome 3.0。 http://os.51cto.com/art/201106/266912.htm 【GNU/Linux】从一份以代码行为单位的 对于 Ubuntu 11.04 中 main 仓库包含软件 GNU 比 例 的 分 析 显 示 GNU 软 件 仅 占 了 8%。 http://os.51cto.com/art/201106/267272.htm 【 LibreOffice 】 文 档 基 金 会 发 布 了 LibreOffice 3.4 版本,实现了通过 Cario 进 行字体渲染。 http://os.51cto.com/art/201106/267269.htm 【桌面 Linux】桌面 Linux 的市 场 份额如 此之小,仅为 0.76%。但是这也是个相对的 概念,总量上来说,全球至少有 1500 万活跃 的桌面 Linux 用户。 http://os.51cto.com/art/201102/244385.htm 10 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 2011 年 5 月到 6 月之间,发生了下面这些事…… 八卦,趣闻与数字 2011.05 – 2011.06 收集整理/51CTO 系统频道 本期专题:Puppet 不管是管理 1 台,或者是上万台机器,Puppet 都能轻松搞定,让你的所有配置工作整齐划一。 专题 Special 为什么要使用 puppet ? 当你去管理 10 台服务器,你肯定会说小意 思。没有任何压力。 当你去管理 100 台服务器,你肯定也会说 小意思。 当你去管理 1000+台服务器呢?你是不 是就头痛了,不同的机器,不同的系统,使用 不同的软件版本,配置也不一样。这样为了提 升效率,Puppet 就派上了大用场。 工作原理概述 Puppet 后台运行的时候默认是半小时执 行一次,不是很方便修改。可以考虑不让它在 后台跑而是使用 crontab 来调用,这样可以 精确控制每台客户端的执行时间,分散执行时 间也可以减轻压力 。 图 1 Puppet 架构 Puppet 的工作细节分成如下几个步骤: 1、客户端 puppetd 调用 facter,facter 会探测出这台主机的一些变量如主机名、内存 大小、IP 地址等。然后 puppetd 把这些信 息发送到服务器端。 2、服务器端的 puppetmaster 检测到客 户端的主机名,然后会到 manifest 里面对应 的 node 配 置 , 然 后 对 这 段 内 容 进 行 解 析 facter 送过来的信息可以作为变量进行处理 的,node 牵涉到的代码才解析,其它的代 码不不解析,解析分几个过程:语法检查、然 后会生成一个中间的伪代码,然后再把伪代码 发给客户机。 3、客户端接收到伪代码之后就会执行,客 户端再把执行结果发送给服务器。 4、服务器再把客户端的执行结果写入日志。 ▌※ 本文节选自守住每一天在 LinuxTone 上分享 的 PDF 文档《puppet 集中化管理》。 12 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 不同的机器, 不同的系 统, 使用 不同的软件版 本,配置也不 一样 。这 样为 了提升效率 Puppet 就派上了大用场。 关于 Puppet 文/守住每一天 专题 Special uppet 是 一 种 Linux 、 Unix 平 台 的 集 中 配 置 管 理 系 统 , 使 用 自 有 的 puppet 描述语言, 可管 理 配置文 件、用户、 cron 任 务、 软件包、系 统 服 务等。 puppet 把这些系统实体称之为资源,其设计目标是简 化对这些资源的管理以及妥善处理资源间的依 赖关系。 p 虽然 Ubuntu 的官方软件源中已经加入了 Puppet,但是官方源中的 Puppet 版本太老, 不但很多新功能没有,而且旧版本还可能有 bug(比如在 Puppet 2.6.4 版本中的一个重 大 bug #6541 会在 not-a-checksum MD5 不对的情况下清空 file 文件【消息来源 】)。 结果就是我们仍然不得不手动安装 Puppet。 Screenage 的博主,资深 Linux 咨询师与 系 统 管 理 员 Caspar Clemens Mierau 提 供 了两个脚本可以快速安装 Puppet,大大简化 了安装过程。 客户端安装: $ bash < <(wget -qO - https://bit.ly/install-puppet-agent) Master 安装: $ bash < <(wget -qO - https://bit.ly/install-puppet-master) (注:bit.ly 是国外流行的短网址服务,实 际地址在 github 上: https://raw.github.com/moviepilot/puppet/ma ster/tools/install-puppet-agent.sh https://raw.github.com/moviepilot/puppet/ma ster/tools/install-puppet-master.sh 不放心的朋友们可以自己检查脚本内容。 客户端安装脚本: #!/bin/bash if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi # refresh package list apt-get update # bootstrap ruby env apt-get -y install irb libopenssl-ruby libreadline-ruby rdoc ri ruby ruby- dev git-core # get a working gem version and update it to the most recent one cd /usr/local/src wget http://production.cf.rubygems.org/rub ygems/rubygems-1.5.2.tgz tar -xzf rubygems-1.5.2.tgz cd rubygems-1.5.2 ruby setup.rb update-alternatives --install /usr/bin/gem gem /usr/bin/gem1.8 1 gem update --system # install puppet itself 13 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 虽然 Ubuntu 的官方软件源中已经加入了 Puppet ,但是官方源中的 Puppet 版本太老, 不但很多新功能没有,而且旧版本还可能有 bug 在 Ubuntu 上快速安装最新版本的 Puppet 翻译/杨赛 专题 Special gem install puppet --no-ri --no-rdoc Master 端安装脚本: #!/bin/bash if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi # refresh package list apt-get update # bootstrap ruby env apt-get -y install irb libopenssl-ruby libreadline-ruby rdoc ri ruby ruby- dev git-core # get a working gem version and update it to the most recent one cd /usr/local/src wget http://production.cf.rubygems.org/rub ygems/rubygems-1.5.2.tgz tar -xzf rubygems-1.5.2.tgz cd rubygems-1.5.2 ruby setup.rb update-alternatives --install /usr/bin/gem gem /usr/bin/gem1.8 1 gem update --system # install puppet itself gem install puppet --no-ri --no-rdoc # we want sqlite3 and rails for stored configs on the puppet master apt-get -y install sqlite3 libsqlite3- ruby libsqlite3-dev gem install sqlite3-ruby --no-ri --no- rdoc gem install rails -v 2.3.11 --no-ri --no-rdoc 这 两 行 命 令 会 从 github 获 取 最 新 的 Puppet 安装脚本,在你的机器上从 Ubuntu 官方源获取安装 Ruby(版本老了点,但是运 行 Puppet 是没问题的),获取一个上游版本 的 gem 软件(注:gem 是打包好的 Ruby 应 用库,可以大大简化 Ruby 环境的搭建过程。 你 可 以 将 其 想 象 为 红 帽 的 yum 机 制 或 Debian 的 apt-get 机制)并将其更新至最新 版本,最后安装 Puppet 的 gem。 ▌※ 原文: http://www.screenage.de/blog/2011/06/06/bo ostrapping-a-puppet-agentmaster-on- ubuntu/ 译文: http://os.51cto.com/art/201106/267349.htm 14 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 勘误声明 《Linux 运维趋势》第八期的第 17 页: 《手把手教你实现 MySQL 双机数据 同步》一文中,有一处错误: 原 文 : ” Master 和 slave 端 的 MySQL 版 本 最 好 要 一 样 的 , 或 者 Master 端的版本高于 Slave 端。”,实 际应为“Master 和 slave 端的 MySQL 版本最好要一样的,或者 Master 端的版 本 低 于 Slave 端 。 ” 相 关 信 息 可 参 考 MySQL 手 册有 关 replication 兼容 性 一 节 。 特此勘误。 感谢读者金步军指出此错误!希望大家 能够继续积极反馈您对《趋势》的意见与 建议,帮助我们做的更好:) 专题 Special 1.概述 puppet 是一个开源的软件自动化配置和部 署工具,它使用简单且功能强大,正得到了越 来越多地关注,现在很多大型 IT 公司均在使 用 puppet 对集群中的软件进行管理和部署, 如 google 利用 puppet 管理超过 6000 台的 mac 桌面电脑(2007 年数据)。 2.设计架构 puppet 是基于 c/s 架构的。服务器端保存 着 所 有 对 客 户 端 服 务 器 的 配 置 代 码 , 在 puppet 里 面 叫 做 manifest 。 客 户 端 下 载 manifest 之后, 可 以根据 manifest 对 服 务 器进行配置,例如软件包管理,用户管理和文 件管理等等。 puppet 工作过程中有两点值得注意。第一, 为了保证安全,client 和 master 之间是基于 ssl 和 证 书 的 , 只 有 经 master 证 书 认 证 的 client 可以与 master 通信;第二,puppet 会让系统保持在你所期望的某种状态并一直维 持下去,如检测某个文件并保证其一直存在, 保证 ssh 服务始终开启,如果文件被删除了或 者 ssh 服 务 被 关 闭 了 , puppet 下 次 执 行 时 (默认 30 分钟),会重新创建该文件或者启 动 ssh 服务。 3.软件安装 可直接从源代码进行安装,需要安装的软 件有 ruby,facter 和 puppet。 3.1 安装步骤 编 辑 /etc/host 以 修 改 主 机 名 , 因 为 puppet 是基于证书的,证书中包含主机名; 在 master 和 slave 上 依 次 安 装 ruby 、 facter 和 puppet 。 安 装 facter 和 puppet 时,要使用 ruby install.rb。 3.2 安装后的目录结构 (1)安装目录 安 装目录默认存为/etc/puppet,该目录 下的 manifests 存放 manifest 文件。 其他可执行文件在/user/sbin 下,主要有: puppet : 用 于 执 行 用 户 所 写 独 立 的 mainfests 文件,如: puppet -l /tmp/manifest.log manifest.pp puppetd: 运行在被管理主机上的客户端 程序,如: puppet -server servername -waitforcert 60 puppetmasterd:运行在管理机上的服务 器程序,如: puppetmasterd -debug 15 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com puppet 是 基 于 c/s 架 构 的 。 服 务 器 端 保 存 着 所 有 对 客 户 端 服 务 器 的 配 置 代 码 , 在 puppet 里面叫做 manifest 。 Puppet 使用方法总结 文/董西成 专题 Special puppetca puppet 认 证 程 序 , 主 要 用 于 对 slave 的证书进行认证,如: 查看需认证的 slave:puppetca -list 对这些 slave 进行认证:puppetca -s -a puppetrun 用于连接客户端,强制运行本 地配置文件,如: puppetrun -p 10 -host host1 -host host2 -t remotefile -t webserver (2)配置文件 puppet.conf Puppet 的主配置文件,如果是 root 用户 配置文件为 /etc/puppet/puppet.conf 普通用户,配置文件为 ~user/.puppet/puppet.conf fileserver.conf puppet 文件服务器的配置文件。用 path 配置文件路径,allow/deny 配置访问权限。 3.3 验证安装是否成功 (此处略,感兴趣的读者可参考原文) 4.配置脚本编写 为了便于管理,puppet 将资源模块化,即 每个功能模块的 manifest 单独放在一个目录 下。每个模块包含一个主要的 manifest 文件 (init.pp,它是模块的入口,类似于 C 语言 中的 main 函数),里面包含若干个 class 对 该 模 块 的 资 源 进 行 封 装 , 常 见 的 资 源 有 file,package,service 等,每种资源由自 己的属性,如 file 有属性 name, owner, mode 等。 本节主要介绍 puppet 中 manifest 的编写 方法,将依次介绍资源属性,资源,节点管理 函数和模块的编写方法。 4.1 资源属性 资源属性有两种,一种是资源专属属性, 另一种是资源共同属性,对于资源专属属性, 将在下一节介绍;而资源共同属性是所有资源 共有的属性,主要有: before 用于控制不同对象(资源)的执行顺序关 系,表示某个对象(资源)在另一个对象之后 发生(require 与之相反,它表示之前发生)。 如: file { “/var/nagios/configuration”: source => “…”, recurse => true, before => Exec["nagios-rebuid"] } exec { “nagios-rebuild”: command => “/usr/bin/make”, cwd => “/var/nagios/configuration” } 这段代码保证用 make 编译之前,所有代 码都是最新的。也可以 before 多个资源,如: before => [ File["/usr/local"], File["/usr/local/scripts"] ] subscribe 检测某个资源,当它发生变化时,该资源 会重新加载,如: class nagios { file { “/etc/nagios/nagios.conf”: source => “puppet://server/module/nagios.conf”, alias => nagconf # just to make things easier for me } service { nagios: ensure => running, 16 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special subscribe => File[nagconf] } } 当 检 测 到 文 件 nagconf 被 修 改 时 , 服 务 nagios 会相应的更新。需要注意的是,目前 支 持 subscribe 的 资 源 只 有 exec , service 和 mount。 4.2 资源 常用的资源主要有以下几个: file:文件管理 package:软件包管理 service:系统服务管理 cron:配置定期任务 exec:运行 shell 命令 4.3 节点管理 puppet 如何区分不同的客户端,并且给不 同的服务端分配 manifest 呢?puppet 使用 node 资源做这件事情,node 后面跟客户端 的主机名,例如: node ‘ slave00 ‘ { include ssh } node ‘ slave11 ‘ { $networktype=”tele” $nagioscheckport=”80,22,3306″ include apache, mysql, php } 资源 node 中可使用变量,也可直接通过 include 把其他 manifest 包含进来。 4.4 类和函数 类可以把多个相关的资源定义在一起,组成 一个类。类可以继承,具体参见: http://docs.puppetlabs.com/guides/language _guide.html#resource-collections 函数(defination)可以把多个资源包装 成一个资源,或者把一个资源包装成一个模型 便于 使 用 。 例 如, 在 debian 里 面管 理 一 个 apache 虚拟机,只需要把虚拟主机配置文件 放 到 /etc/sites-available/ 里 面 , 然 后 做 一 个符号链接到/etc/sites-enabled 目录。 你 可以为每个虚拟主机复制同样的配置代码,但 是如果你使用下面的代码就会更好更简单: define virtual_host($docroot, $ip, $order = 500, $ensure = “enabled”) { $file = “/etc/sites-available/ $name.conf” # The template fills in the docroot, ip, and name. file { $file: content => template(“virtual_host.erb”), notify => Service[apache] } file { “/etc/sites-enabled/$order- $name.conf”: ensure => $ensure ? { enabled => $file, disabled => absent } } } 然 后 , 你 就 可 以 使 用 这 个 定 义 来 管 理 一 个 apache 虚拟主机,如下面代码所示: virtual_host { “reductivelabs.com”: order => 100, ip => “192.168.0.100 ,″ docroot => “/var/www/reductivelabs.com/htdocs” } 4.5 模块 一个模块就是一个 /etc/puppet/modules 17 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 目 录 下 面 的 一 个 目 录 和 它 的 子 目 录 , 在 puppet 的主文件 site.pp 里面用 import modulename 可以插入模块。新版本的 puppet 可以自 动插入 /etc/puppet/modules 目录下的模块。通过引入模块,可以结构 化代码,便于分享和管理,比如关于 apache 的所有配置都写到 apache 模块下面。一个模 块 目 录 下 面 通 常 包 括 三 个 目 录 : files , manifests, templates。 manifests 里面必须要包括一个 init.pp 的 文件,这是该模块的初始(入口)文件,导入 一个模块的时候,会从 init.pp 开始执行。可 以把所有的代码都写到 init.pp 里面,也可以 分成多个 pp 文件,init 再去包含其他文件。 files 目 录 是 该 模 块 的 文 件 发 布 目 录 , puppet 提供一个文件分发机制,类似 rsync 的模块。 templates 目录包含 erb 模型文件,这个 和 file 资源的 template 属性有关。 puppet 安装好以后,modules 目录是没 有的,自己建立一个就行,然后在里面可以新 增加你的模块。 5.编程实例 5.1 Hello World 本节介绍了一个非常简单的编程实例:一 个 slave 从 master 中获 取其 manifest ,该 maniftest 要求 slave 依次做以下工作:安装 gcc,创建文件夹/home/dxc/test,下载文 件 hello.c 程序,编译 hello.c。 (1) 代码结构组织 Master 上代码的目录结构如下: |– auth.conf |– fileserver.conf #puppet 文件服务器 配置文件 |– manifests #puppet 主文件所在目录 | |– modules.pp #puppet 各个模 块汇总 | |– nodes #各个 slave 要处理的 模块 | | `– execHello.pp #hello 模 块对应由那些 slave 处理 | `– site.pp #puppet 主文件(入口文件) |– modules #puppet 的各个模块所在文 件 | `– hello #hello 模块 | |– files #该模块对应的文件资 源,可能是要发送给 slave 的配置文件等 | | `– hello.c | `– manifests #模块的 manifest 文件 | `– init.pp #模块入口文件 `– ssl #puppet 的证书文件目录 (2)代码调用顺序 Slave 发起连接请求 → site.pp → nodes → modules → init.pp ▌※ 本文为节选,完整内容和代码下载见原文: http://dongxicheng.org/cluster- managemant/puppet/ 参考资料: puppet 官方网站 puppet 中文 wiki puppet 中文博客 18 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 文 将 介 绍 puppet 的 语 法 。 因 为 puppet 是 用 ruby 编 写 的 , 因 此 puppet 的语法也和 ruby 类似,都是很简单 的面对对象的高级语言。 本 一、资源 定义一个资源,需要指定资源的类型和资 源的 title。看一个例子: file { "/etc/passwd": name => "/etc/passwd" , owner => root , group => root , mode => 644; } 上 面 的 代 码 让 /etc/passwd 的 权 限 保 持 644,并且属于 root 用户和 root 用户组,file 是指定资源的类型是"file"类型。 第 二 行 的 "/etc/passwd" 是 资 源 的 title, title 的作用是让 puppet 能唯一标识这个资 源。 第三行的 name 指定了要对那个文件操作, 默认情况下,name 都等于 title,所以很多时 候 name 是可以省略的。 资 源 的 title 是 sshdconfig , 但 是 name 却可以通过判定操作系统自己选择合适的值。 这样,当其他的资源要依赖 sshdconfig 的时 候,只需要说明依赖 sshdconfig 就行,而不 需要关心文件到底在什么路径下面。例如下面 的代码: service { "sshd": subscribe => file[sshdconfig] , } 指定了一个 sshd 的服务,这个服务如果发 现 文 件资源 sshdconfig 有变 动,就 会自己 reload 配置文件。注意上面的 subscribe 后 面的 File,第一个字母要大写,定义资源关系 的时候,这里的字母要大写。 通常,在 puppet 代码里面可能会定义很 多 相 同的资源 , 可 以 用[]把所有资源 的 title 写在一起,例如: file { ["/etc/passwd" , "/etc/hosts"]: owner => root , group => root , mode => 644; } 你可能已经发现了,每次定义文件的时候 如果都输入 mode,owner,group 会很繁琐, 因此你可以在 puppet 的 site.pp 的开头定义 资源的默认值。 19 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 使用节点的时候,尽量把所有的配置写成类,节点里面定义好变量和包含相应的类就可以 了。保证代码的简洁。 磨刀不误砍柴工 Puppet 语法详解 文/huangmingyou 专题 Special 定义资源的默认值需要把资源的第一个资 源大写。例如下面的代码让所有的 file 资源的 mode 是 644,owner 是 root。 File { owner => root , mode => 644 ; } 默认值可以被后面的设置覆盖。 在 puppet 里面可以定义资源之间的关系 例如前面提到的,如果 sshdconfig 文件如果 有修改,sshd 服务就重启。puppet 里面还 有另一个资源关系,依赖。例如资源 A 依赖 资源 B,如果资源 B 不存在,资源 A 就不被执 行。定义资源依赖的属性是 require 。例如: file { "/etc/apache2/port.conf": content => "80" , require => Package ["apache2"] ; } package { "apache2": ensure => installed ; } file 资源设置 port.conf 的内容为 80,但 是在设置 file 资源之前,要求 apache2 这个 软件包配置好了。 二、 类和函数 类的作用是把一组资源收集在一个盒子里 面,一起使用,例如把 sshd 和他的配置文件 做成一个 ssh 类,其他的地方要用到就直接包 含 ssh 类就可以了,方便写出更简洁的代码, 便于维护。类可以继承。看一个具体的例子: class ssh { file { "/etc/ssh/sshd_config": source => "puppet:// $fileserver/ssh/sshd_config.cfg" ; } package { "ssh": ensure => installed ; } service { "ssh": ensure => running ; } } 这 里 , file/etc/ssh/sshd_config 的 内 容 是从 puppet 服务器上面下载的,file 资源的 内容可以从别的 url 得到,也可以 erb 模板生 成。erb 模板是很强大的工具,这个后面会说 到。package 资源安装 ssh 软件,service 资 源保证 ssh 服务在运行状态。类的继承这里就 不讲了,因为是入门手册,另外用的不多。 puppet 的官方文档里面是没有 puppet 函 数这一说法的,而是叫做 define ; 这里我写 做函数,是因为 define 实现的功能其实和函 数 一样 ,而且在 ruby 里面也是 用 define 来 定义一个函数。具体来看一个例子: define svn_repo ( $path ) { exec { "/usr/bin/svnadmin create $path/ $title": unless => "/bin/test -d $path", } } svn_repo { puppet_repo: path => "/var/svn_puppet" } svn_repo { other_repo: path => "/var/svn_other" } 首先用 define 定义了一个 svn_repo 函数, 并且带了一个参数 1 。这个参数可以在函数 里面的资源使用,在这里,exec 资源根据提 供的参数创建 svn 仓库。函数定义好以后, 20 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 后面的两行就用定义好的函数创建了两个 svn 库。 三、 节点 puppet 如何区分不同的客户端,并且给不 同的服务端分配 manifest 呢?puppet 使用叫 做 node 的语法来做这个事情,node 后面跟 客户端的主机名 3,例如下面的例子: node 'host1.example.com' { include ssh } node 'host2.example.com' { include apache, mysql, php } 当 主 机 host1.example.com 来 连 服 务 端 时,只会执行 node 'host1.example.com' 里面的代码,不会执行 node host2.example.com 里面的代码。正如前面所说,可以定义一 个 default 节 点 。 如 果 没 有 针 对 host3 的 node 配置,host3 就用 default 的配置了。 在这里 include 的意思是 include 类。同样, 节点也支持继承。 使用节点的时候,尽量把所有的配置写成 类,节点里面定义好变量和包含相应的类就可 以了。保证代码的简洁。例如: 1、因为可以带参数,所以我觉得翻译成函 数更好 2、注意看函数的使用语法,是不是和使用 资源一样,path 可以看作是属性 3、主机名在 puppet 里面很重要 node 'host4.example.com' { $networktype="tele" $nagioscheckport="80,22,3306" include ssh, apache, mysql } 四、变量和数组 puppet 也和其他语言一样,支持变量和数 组,puppet 用$符号定义变量,变量的内容 用双引号括起来。例如: $test="hello, guys" file{ "/tmp/test": content => $test ; } puppet 利用方括号来定义数组,数组的内 容由逗号分割,例如下面的例子: ["apache2", "httpd", "ssh"] 数组可以用在资源定义里面,例如前面提 到的例子。也可以用在函数里面,例如: define php::pear () { package {"`php-$ {name}": ensure => installed } } php::pear {['ldap','mysql','ps','snmp','sqlite' ,'tidy','xmlrpc']: } 五、 模块 有关 puppet 模块,在上一篇文章中已经 叙述的比较详细,这里略过不再赘述。 ▌※ 本文节选自 huangmingyou 在 Google Code 上分享的 PDF 文档《puppet 入门》,文档下 载地址: http://code.google.com/p/puppet-manifest- share/downloads/list 21 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 我们企业有不少项目是交给外包做的,相 关的项目负责人或开发者有新的或更改过的项 目文件会上传到我们的 SVN 服务器上,再由 我们的系统管理员执行 SVN update 更新页 面。一直以来我们的做法都是,项目负责人或 开发者上传了新文件之后,去找到 SA,SA 再 登录服务器手动执行 svn up。前些日子看到 puppet 这个东西的时候,觉得这就是能够将 项目负责人、开发者和 SA 从这个工作中解放 出来的利器。 一、开发平台 apache+perl-cgi 二、功能介绍 系 统 管 理 员 / 项 目 执 行 者 / 开 发 人 员 通 过 web 的 get 对 应 的 url , 然 后 触 发 更 新 puppet-master 中 的 一 个 文 件 , puppet- client 在同步时间到来的时候(默认半小时, 可改 ) ,判断 master 上 对 应 的项目 文 件 的 md5 值 是 否 有 变 化 , 如 果 有 变 化 , 触 发 puppet 配置中对应的 svn 更新的程序,完成 此项目的更新。 三、系统架构 (见图 1) 四、实施步骤及相关说明解释 1、puppet 配置 安 装方 法我就不 写了 。我 这边是 CentOS 5.4(服务器端)和 CentOS 5.5(客户端), 采用 yum 安装。 图 1 SVN 自助更新系统架构 A、puppet-master 配置 a) 首先是创建 autosign.conf 文件,此文 件用于自动验证。 *.wenzizone.cn 这样所有这个域名过来的请求会自动验证。 b) 修改 puppet.conf 文 件 。如 果是 通过 rpm 或 yum 安装,此文件内容可以基本保持 不变 [main] logdir = /var/log/puppet 22 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com puppet 采用 C/S 星状的结构,所有的客户端和一个或几个服务器交互。每个 puppet 客 户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文 件来配置服务器,保证和该配置信息同步。 SVN 自助更新:运维利器 Puppet 实例讲解 文/蚊子 专题 Special rundir = /var/run/puppet ssldir = $vardir/ssl bindaddress = 192.168.192.199 [puppetd] classfile = $vardir/classes.txt localconfig = $vardir/localconfig 我在这里添加了 bindaddress = 192.168.192.199 这 条 , 因 为 我 并 不 想 让 我 的 puppet- master 被外网访问到,这个可以因个人环境 而定。如果需要看详细的 puppet.conf 内容 可以执行 puppet --genconfig。 c) 修改 fileserver.conf,增加如下内容 [system] path /etc/puppet/modules/system/files allow *.wenzizone.cn allow 192.168.192.0/24 [svnup] path /etc/puppet/modules/svn/files allow *.wenzizone.cn allow 192.168.192.0/24 以上三个文件都放在/etc/puppet 目录下。 d) puppet 功能配置 首先看下 puppet 的目录结构, /etc/puppet/ |-- auth.conf |-- autosign.conf |-- fileserver.conf |-- manifests | |-- huodong_web.pp | `-- site.pp |-- modules | |-- svn | | |-- files | | | |-- hd_zf_up_file | | `-- manifests | | |-- hd_zf_up.pp | | |-- init.pp | `-- system | |-- files | | |-- puppet.client.conf | `-- manifests | |-- init.pp | |-- puppet_client.pp `-- puppet.conf 根 下 的 manifests 目 录 放 置 主 配 置 文 件, modules 下面是各种的模块。在这里我设置 了两个模块,system 和 svn,其中 system 用 来 给 我 的 puppet-client 同 步 puppet.conf 文 件 ,svn 就是 我 这次介绍的 重点了。先看 svn 的这个模块。 files 目录:用来存放触发 svn 更新的文件 的,我们可以在此目录下 touch 任何一个名 字的文件,更新的工作由 perl-cgi 来控制, 我这里使用的名字是:hd_zf_up_file manifests 目录: 用 来 存放 puppet 的脚 本文件的,必须包含 init.pp 文件,通常情况 下可以把脚本都写入到这个一个文件中,但为 了便于管理,最好是按照功能或者项目分开存 放。我这里的 hd_zf_up.pp 就是我为公司线 上的一个项目建立的。内容如下: 1class hd_zf_up 2{ 3 file { 4 "hd_zf_up": 5 group => 'root', 6 mode => '600', 7 owner => 'root', 8 path => "/tmp/hd_zf_up_file", 9 source => "puppet:///svnup/hd_zf_up_file", 10 } 11 12 exec { 13 "svn up": 14 cwd => "/var/www/html/www.51cto.com/zf", 23 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 15 path => "/usr/bin:/usr/sbin:/bin", 16 subscribe => File["hd_zf_up"], 17 refreshonly => true, 18 } 19} 下面详细解释一下: 3 行 是 puppet 的 file 方 法 ,网上 的 介绍 file 是一种资源,我这里认为当作方法比较合 适,这样就可以跟 php 的类相似了,file 后 面大括号里的都是 file 这个方法的属性。属性 用来赋值,方法用来调用。当然怎样理解因人 而异。 4 行给这个 file 方法定义了一个方便使用的 别名 9 行定义了从 puppet-master 的什么文件 拿 到 那 个 文 件 。 这 里 就 用 到 了 前 fileserver.conf 定 义 的 内 容 , 可 以 看 到 svnup 是预定义的别名,它实际对应的路径 是/etc/puppet/modules/svn/files,这样后 面跟的文件就会到这个路径下去取。整个 svn 这部分的配置理解就是:puppet-client 要从 source 定义的路径拿到 hd_zf_up_file 文件 放到 client 的/tmp 目录下并将文件所以权给 root 用户和组,访问模式是 600。 12 行定义了 puppet 的 exec 方 法 , 这 个 方法是使 puppet 执行系统命令或脚本用的。 13 行是定义了 exec 要执行的命令,在这 里是要求 puppet 执行 svn up 这个命令 16 行定义了一个依存关系,我们这里和 17 行联合起来解释,当 file 方法定义里的那个文 件的 md5 值发生变化的时候,此 exec 方法 触 发 , 即 当 上 面 source 里 面 定 义 的 文 件 md5 值发生 改 变了 ,就执行 svn up 这 个 命 令。 接下来看看 init.pp 里面的内容 class svn { import "hd_zf_up.pp" } 这里只是引入了我们定义好的 pp 文件。 下 面 来介绍 system 那 个模块的内 容, 这 部 分内 容我 主要讲同步 puppet-client 端 配 置文件的这个功能,这样方便我们一次性配置 好 client 端的 puppet。 files 目录下放置的是 puppet.client.conf 文件,主要内容如下 [main] logdir = /var/log/puppet rundir = /var/run/puppet ssldir = $vardir/ssl [puppetd] classfile = $vardir/classes.txt localconfig = $vardir/localconfig server = app-21-199.wenzizone.cn runinterval = 300 show_diff=true 基本上和 master 上一样,主要区别是后三 行,server 用于指明 master 的名字,可以是 ip 或 对 应 的 主 机 名 。 runinterval 用 于 指 定 puppet-client 每次执行的间隔,单位是秒。 最后一行是当文件被替换的时候是否显示不一 样的地方。 manifests 目录下同样放置了 init.pp 文件, 同时我还自定义了一个 puppet_client.pp, 内容如下: 1 class puppet_client 2 { 3 file 4 { 5 "puppet_conf": 24 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 6 path => "/etc/puppet/puppet.conf", 7 source => "puppet:///system/puppet.client.conf" , 8 } 9 exec 10 { 11 "reload-puppet-client": 12 command => "/etc/init.d/puppet force-reload", 13 require => Service["puppet_client"], 14 refreshonly => true, 15 } 16 service 17 { 18 "puppet_client": 19 name => "puppet", 20 enable => true, 21 ensure => running, 22 hasrestart => true, 23 hasstatus => true, 24 subscribe =>File["puppet_conf"], 25 } 26 } 大部分内容跟之前一样。这里 exec 部分的 11 行并不是直接写的要执行的命令,而是定 义 了 富 有 含 义 的 名 字 , 然 后 在 12 行 通 过 command 定义了要执行的命令。 19 行定义的名字必须和/etc/init.d 下对应 的名字一样 20 行表示此服务在开机时是否启动 21 行表示是否运行此服务 22 行指出管理脚本是否支持 restart 参数, 如果不支 持 ,就用 stop 和 start 实 现 restart 效果。 23 行指 出管 理脚本 是 否支 持 status 参数。 puppet 用 status 参数 来判断服 务 是 否 已 经 在 运 行 。 如果不支 持 status 参数 , puppet 利用查找运行进程列表里面是否有服务名来判 断服务是否在运行。 24 行表示,此服务运行依赖 file 这个方法, 同 时 exec 又 require 了 service , 这 样 当 file 里定义的配置文件有变化及文件 md5 值 不 一 样 的 时 候 , exec 就 执 行 force-reload 的命令。 再来看 init.pp 内容 1 class system 2 { 3 import "puppet_client.pp" 4 } 到此 puppet 上自定义的两大功能就介绍 完成了,下面看看 puppet 如何加载。 回到/etc/puppet/manifests 目录,有两 个主要文件 site.pp 和 huodong_web.pp。 site.pp 是 主 文 件 ,huodong_web.pp 是 我 为我需要 svn 更新的 web 服务器做的。内容 如下 1 node "app198-vhost-192-55" { 2 #系统初始化工具 3 include system 4 include puppet_client 5 #祝福活动页面更新 6 include svn 7 include hd_zf_up 8 } 接下来看 site.pp 的内容 1 node default 2 { 3 import "huodong_web.pp" 4 } 25 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special 到此 master 上 puppte 部分的配置就全部 完毕了。接下来看 client 端上的配置 B、puppet-client 上的配置 a ) 登 录 到 app198-vhost-192-55 , yum 安装 puppet,然后执行 puppetd --server app-21- 199.wenzizone.cn -test 由于我们是做的自动签名,并且在服务器 上配置了 puppet-client 的配置文 件 ,所以 执行完过后 puppet 自动会以守护进程的方式 启动 b) 配置 svn 更 新 主 目录,及 web 页 面项 目 的 主 目 录 ,在我这个案例中的主目 录 是 /var/www/html/www.51cto.com/zf , 进入到这里使用 svn co svn_source./将初始 的项目导入出来。 至此,puppet-client 上 的准 备工 作全部 完毕。那么下面就是 perl-cgi 部分了。 C、部署 svn 自助更新 web 脚本 这里可以将脚本部署在和 puppet-master 同一台主机上,当然也可以考虑分布式的,那 样就需要调整这个脚本。现在先以同一台机器 为例。 a)安装 apache,配置 cgi 目录 因 为 我 们 的 访 问 量 不 会 很 大 , 我 直 接 用 yum 安装了。所以 cgi 目录使用的是默认的 cgi-bin 目录。 b)编写对应的脚本 pjupdate.cgi #! /bin/env perl use CGI; my $query = CGI->new(); #初始化 cgi 实例 my $file_name = $query- >param('pjname'); #将 url 中 pjname 的值赋给$file_name 变量 my $up_time = `date +%s`; #获得从 1970-01-01 00:00:00 UTC 到现在的 秒数 my $dst_dir = "/etc/puppet/modules/svn/files/"; #目标文件的目录 my $success = open FH,">".$dst_dir. $file_name; #开的目标文件,即触发 svn 的文件 if(!$success) { print "Content-type:text/html\n\n"; print "不能更新此项目,请联系管理 员!"; #如果打开不成功进行提示,通常 是权限问题,文件属主改成 apache 执行用户 } else { print FH"$up_time"; #更 新文件内容,为了达到变更此文件 md5 值的效 果 print "Content-type:text/html\n\n"; print "更新已经开始,请 5~10 分钟后查 看页面"; } close(FH); 五、总结 到此,这个自助 svn 更新系统就介绍完毕 了。有几点需要注意的: 请确认部署环境中有对应的主机名到 ip 地 址 的 解 析 环 境 , 本 文 所 在 环 境 已 存 在 内 部 dns,所以全部使用主机名。 所有 puppet 主机时间要保持一致。 注意防火墙对 puppet 端口的限制。 ▌※ 本文为节选,原文见: http://os.51cto.com/art/201012/240992.htm 26 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 专题 Special Q: puppet 的证书机制是什么样的? A: puppet 服务器端在安装或者首次启动 的时候,会自动生产一个根证书和服务器证书, 证书和主机名相关,因此如果证书生成后又改 了主机名,那就会出问题。puppet 客户端在 首次启动的时候,也会自动生成证书,但是这 个证书需要得到 puppet 服务器端的签名才行。 因此,puppet 客户端第一次连接服务器的时 候,会发送一个证书请求,服务器端需要对这 个证书进行签名。 Q:debian 下面的证书出错,怎么解决? A: 首 先 在 puppetmaster( 服 务 器 端 ) 删 除 /var/lib/puppet/ssl 目 录 ; 然 后 启 动 puppetmasterd ; 然 后 在 客 户 端 也 删 除 /var/lib/puppet/ssl 目 录 。 把 puppetmaster 机器的主机名和对应的 ip 地 址写入客户端机器的/etc/hosts。然后执行 puppetd --test --server server.example.com #发送证书请求 把 server.example.com 替换成你自己的 服务器主机名。执行这个命令,会有提示信息, 不用理会。 然后登录到 puppetmaster 服务器机器, 执行命令: puppetca --list #列出所有证书请求 看看是否有客户端的证书请求;如果没有, 请检查前面的步骤是执行正确,以及网络连接 是否正常。如果 puppetca --list 能看到请求, 那么执行命令: puppetca -s -a #签名所有证书 对所有的证书请求签名。 最后回到 puppet 客户端机器,执行 puppetd --test --server server.example.com #得到证书 Q: 如何配置 puppetrun? A: 在 puppet 客 户 端 建 立 一 个 文 件 /etc/puppet/auth.conf ,增加两行内容 path / allow * 然后用下面的参数启动 puppetd,便于调 试。 puppetd --no-client --listen --verbose --no-daemonize –server server.puppet.com 启 动 好 以 后 , 用 ss -nlp | grep puppet 命令看看 puppetd 是否监听到了 8139 端口。 如果正常,在其他机器上运行 puppetrun --host host1.puppet.com 来看看 puppetrun 是否正常。▌※ 本文节选自 huangmingyou 分享的 PDF 文档 《puppet 入门》,文档下载地址: http://code.google.com/p/puppet-manifest- share/downloads/list 27 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com puppet 服务器端在安装或者首次启动的时候 , 会自动生产一个根证书和服务器证书 , 证书 和主机名相关 , 因此如果证书生成后友改了主机名 , 那就会出问题 。 Puppet 常见 FAQs 文/huangmingyou 技巧 Tips 1.显示消耗内存/CPU 最多的 10 个进程 ps aux | sort -nk +4 | tail ps aux | sort -nk +3 | tail 2.查看 Apache 的并发请 求数及其 TCP 连 接状态 netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 3.找出自己最常用的 10 条命令及使用次数 (或求访问最多的 ip 数) sed -e ‘s/| /\n/g’ ~/.bash_history |cut -d ‘ ‘ -f 1 | sort | uniq -c | sort -nr | head 关 于这条命 令有 读者 问 sed 语句的 用处具 体是什么,我这里详细说明下:我们平时用命 令是如是用了很多管道符“|”吗,比如 ps aux | sort -nk +4 | tail /s…/g 就 是 把 管 道 符 “ |” 换 成 换 行 符”\n”,于是 ps aux | sort -nk +4 | tail 就变成如下: ps aux sort -nk +4 tail 4.日志中第 10 个字段表示连接时间,求平 均连接时间 cat access_log |grep “connect cbp” |awk ‘BEGIN{sum=0;count=0;}{sum+=$10;count+ +;}END{printf(“sum=%d,count=%d,avg= %f\n”,sum,count,sum/count)}’ 5.lsof 命令 lsof abc.txt #显示开启文件 abc.txt 的进程 lsof -i :22 #知道 22 端口现在运行什么程序 lsof -c abc #显示 abc 进程现在打开的文件 lsof -p 12 #看进程号为 12 的进程打开了哪些文件 6.杀掉一个程序的所有进程 pkill -9 httpd killall -9 httpd 注意尽量不用-9,数据库服务器上更不能轻 易用 kill,否则造成重要数据丢失后果将不堪 设想。 7.rsync 命令(要求只同步某天的压缩文件, 而且远程目录保持与本地目录一致) /usr/bin/rsync -azvR -password- file=/etc/rsync.secrets `find . -name “*$yesterday.gz” -type f ` storage@192.168.2.23::logbackup/13.21/ 8.把目录下*.sh 文件改名为*.SH find . -name “*.sh” | sed ’s/\ (.*\)\.sh/mv \0 \1.SH/’ |sh find . -name “*.sh” | sed ’s/\ (.*\)\.sh/mv & \1.SH/’|sh (跟上面那个效果一样) 9.ssh 执行远程的程序,并在本地显示 ssh -n -l zouyunhao 192.168.2.14 “ls -al /home/zouyunhao” 28 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 注意尽量不用 -9 ,数据库服务器上更不能轻易用 kill ,否则造成重要数据丢失后果将不堪 设想。 分享平时工作中那些给力的 shell 命令 文/孤风颠影 技巧 Tips 10. 直接用命令行修改密码 echo “zouyunhaoPassword” |passwd -stdin zouyunhao 11. 快速生成 ssh 密钥对并上传 ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub user@remoteServer 12.以 http 方式共享当前文件夹的文件 $ python -m SimpleHTTPServer 在浏览器访问 http://IP:8000/即可下载当 前目录的文件。 13.shell 段注释 :<<’echo hello,world!’ 14.查看服务器序列号 dmidecode |grep “Serial Number” (查看机器其他硬件信息也可用这个命令) 15.查看网卡是否有网线物理连接 /sbin/mii-tool 16.查看 linux 系统或者 mysql 错误码表示 的意思 如查看 13 错误码表示的意思: perror 13 17.关于 cpu 个数 查看逻辑 cpu 个数: cat /proc/cpuinfo | grep “processor” | wc -l 查看物理 cpu 个数: cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l 查看每个物理 cpu 的核数 cores: cat /proc/cpuinfo | grep “cpu cores” 如果所有物理 cpu 的 cores 个数加起来小 于逻辑 cpu 的个数,则该 cpu 使用了超线程 技术。 查看每个物理 cpu 中逻辑 cpu 的个数: cat /proc/cpuinfo | grep “siblings” 18.从格式不规范的日志中截取字符串 perl -ne ’print “$1\n” if /servletPath=(\S+)/g’ test.log ▌※ 原文: http://yunhaozou.org/perl-shell/162.html 相关阅读: 省时省力 Shell 小技巧一则 PowerShell 与 Unix Shell 对比:八大实例 29 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 新书推荐 《Linux 内核编程》 本书以 Linux 操作 系 统 为基 础, 详 细介绍了 Linux 内核子系统,并辅以大 量内核源代码和示例程序进行演示,引 领读者深入 Linux 内核。本书的主要内 容包括:Linux 基础知识、内核探索工 具集、进程的生命周期、内存区、页面、 Slab 分配器、用于输入/ 输出的各种设 备、文件系统、抢占、自旋锁、信号量、 内核引导、构建 Linux 内核,以及向内 核添加代码等,同时还简单介绍了一些 应用工具和实用程序。详细 >> 技巧 Tips 户执行的每个 shell 命令记入日志比 最初想象的要来得困难。shell 的历 史功能原本旨在帮助用户使用以前用过的命令 我们都知道这种使用场合:你刚输入了一个长 长的字段,可是拼错了一个字符。shell 的历 史让你可以改正这一个字符,而不必输入其余 的所有字符。 用 然而, shell 历史很难满足审计的目的。换 言之,它不是为了确保系统安全而设计的。 对于 bash shell 来说,问题显得尤其困难, 因为该 shell 的目的是,不管用什么办法,尽 可能为用户简化生活——所以,它拥有所有的 “花哨功能”(bells and whistles)。必须 顾及所有这些多种功能,并且防止对历史文件 进行更改。 Korn shell 比较简单,使得保护 shell 的历 史比较容易。 如果想要严加保管这些 shell 的历史,需要 执行一系列的步骤。 首先,锁定 shell 的历史文件本身。 更 改 它 的 属 性 , 末 尾 只 添 加 chattr +a .sh_history 或 chattr +a .bash_history 。 这样一来,就不可能删除或更改文件中的数据 连用户都无法改变属性——只有 root 用户才 能改变。 其次,确保历史变量设置合理、无法更改。 这 些 历 史 变 量 包 括 最 重 要 的 HISTFILE 、 HISTCOMMAND 和 HISTIGNORE 。 要 做 到 这一点,使用 shell 的 typeset 命令,带-r 选 项,这使得指定的变量拥有只读属性。良好的 操作规范是使所有历史环境变量都变为只读, 比如: export HISTCONTROL= export HISTFILE=$HOME/.bash_history export HISTFILESIZE=2000 export HISTIGNORE= export HISTSIZE=1000 export HISTTIMEFORMAT="%a %b %Y %T %z " typeset -r HISTCONTROL typeset -r HISTFILE typeset -r HISTFILESIZE typeset -r HISTIGNORE typeset -r HISTSIZE typeset -r HISTTIMEFORMAT HISTTIMEFORMAT 是 bash shell 的扩展, 将在历史文件中提供时间戳。 对于 bash shell 来说,你需要更改历史的 一些标准选项: shopt -s cmdhist #设置 cmdhist 将把多行命令放入到单单一个历 史行 shopt -s histappend 30 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 注意尽量不用 -9 ,数据库服务器上更不能轻易用 kill ,否则造成重要数据丢失后果将不堪 设想。 完善 Linux/UNIX 审计 将每个 shell 命令记入日志 编译/布加迪 技巧 Tips #设置 histappend 将确保被添加到历史文件,而 不是像通常的做法那样覆盖历史文件。 另 外 对 于 bash shell 来 说 , 还 要 设 置 PROMPT_COMMAND: PROMPT_COMMAND="history -a" typeset -r PROMPT_COMMAND 这是由于 bash shell 实际上把历史写入到 内存中,历史文件仅在 shell 会话结束时加以 更新。这个命令会把上一个命令附加到磁盘上 的历史文件。 最后,创建一个 SIGDEBUG 陷阱,将命令 发送到系统日志(syslog)。 VMware 的 ESXi 借 助 自 己 版 本 的 ash shell 已经具有这样的功能。简而言之,应创 建一 个把当 前 命 令 记 入 日 志(从历 史文 件获 取)的函数,然后用 logger 命令,把它发送 到 系 统 日 志 。 这 一 步 在 bash shell 和 Korn Shell 中都适用。 这些步骤有些冗长,不过在新版的 bash 和 ksh 中有一些新的功能特性,让这一切变得极 其容易。GNU Bash 在 4.1 版中添加了记入到 系统日志中的功能,只需要编译 shell 的时候 开启该功能即可激活。 自推出 ksh93 以来,Korn Shell 就一直具 有审计功能。类似 bash 4.1,用户审计是一 项编译时功能。想看看你所用的 ksh93 版本是 否安装了审计功能,可以执行下列命令中的某 一条: echo ${.sh.version} echo $KSH_VERSION 在 Ubuntu 10.10 中 , 我 得 到 了 来 自 ksh93 的这个输出: # echo ${.sh.version} Version JM 93t+ 2009-05-01 如果审计功能开启,特征字符串(JM)还 会有字母 A(开启审计功能),可能还有字母 L ( 开 启 针 对 用 户 的 审 计 功 能 ) 。 IBM DeveloperWorks 和 Musings of an OS Plumber 都刊有介绍 Korn Shell 审计的出色 文章。 Bash shell 含有审 计功能的 可能 性也 比较 小。Ubuntu 10.10 上 的 bash 是 4.1.5(1)版 本。 对于仍在使用 C shell(以及尤其是 tsch) 的 用 户 , tcsh 有 一 个 变 种 名 为 “ tcsh- bofh”,它支持记入到系统日志中。遗憾的是, tcsh-bofh 并 没 有 得 到 长 期 的 维 护 。 早 在 2010 年 1 月,tcsh-bofh 的 FreeBSD 端口就 从 FreeBSD 端口树(port tree)去除了。 上述信息也可以在 shell 之外获取。比如有 两个 命 令 : lastcomm(来 自 Ubuntu Main 软件仓库中 的 acct 程序包)和 auditctl(来 自 Ubuntu Universe 软 件 仓 库 中 的 auditd 程序包)。另外, Linux Journal 在 2002 年 刊发过一篇关于 Linux 进程统计的好文章 。另 外还有 rootsh 和 snoopylogger 这两个程序 包 , 只 是 两 者 都 不 在 Ubuntu 软 件 仓 库 中 。 Rootsh 好 比 是 typescript 的 执 行 版 本 , 而 snoopylogger 是你可以添加到用户环境的系 统 库 。 ( 这 些 方 法 有 许 多 来 自 在 serverfault.com 上所提的一个问题,请参阅 这个帖子 。)▌※ 英文原文:Logging every shell command 本文为节选,原文: http://os.51cto.com/art/201106/266928.htm 31 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 技巧 Tips inux 和 Windows 之间最 主要的差异 在于,Linux 服务器默认情况下一般不 提供 GUI,而是命令行界面;它的主要目的是 高效处理非交互式进程,响应时间并不是那么 重要,能够长时间处理高负载才是最关键的。 在这篇文章中,我们将讨论一些提高 Linux 服 务器性能的技巧。 L 1、为磁盘 I/O 调整 Linux 内核电梯算法 在选择文件系统后,有一些内核和挂载选项 可能会影响到它的性能表现。其中一个内核设 置是电梯算法,通过调整电梯算法,系统可以 平衡低延迟需求,收集足够的数据,以有效地 组织对磁盘的读和写请求。 2、禁用不必要的守护进程,节省内存和 CPU 资源 每台服务器上都运行着许多守护进程或服务, 而具有讽刺意味的是,有很多通常不是必需的 这些服务没有发挥作用,但却消耗了宝贵的内 存和 CPU 时间,而且还可能将服务器置于危 险境地。因此,你应该将它们从服务器移除。 一些应该被禁用的守护进程: Apmd、Nfslock、Isdn、Autofs、Send mail、Xfs 3、关掉 GUI 一般说来,Linux 服务器是不需要 GUI 的, 因此最好关掉 GUI,重定向 X 显示或通过一个 Web 浏览器界面显示。为了禁用 GUI,“init level(启动级别)”应 该 被设置为 3(命 令 行登 录),而不是 5(图形登录)。如果需要 GUI,可 以随时运行 startx。 4、清理不需要的模块或功能 在服务器软件包中有太多被启动的功能或模 块实际上是不需要的(如 Apache 中的许多功 能模块)。仔细查看 Apache 配置文件,确定 FrontPage 支持或其它额外的模块是否真的要 用到。 5、禁用控制面板 在 linux 中 有 许 多 流 行 的 控 制 面 板 , 如 Cpanel,Plesk,Webmin,phpMyAdmin 等,相信每个 Linux 初级用户都很喜欢这些控 制面板。但是,禁用掉这些软件包可以释放出 大约 120MB 内存。 6、改善 Linux Exim 服务器性能 有许多种方法改善服务器的 Exim 性能,其 中一个办法是使用 DNS 缓存守护进程,它可 以降低解析 DNS 记录需要的带宽和 CPU 时间。 32 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 每台服务器上都运行着许多守护进程或服务,而具有讽刺意味的是,有很多通常不是必需 的,这些服务没有发挥作用,但却消耗了宝贵的内存和 CPU 时间。 20 个你不得不知的 Linux 服务器性能调优技巧 文/ Mikaye,Vardanyan 翻译/黄永兵 技巧 Tips DNS 缓 存 避 免 了 每 次 都 从 根 节 点 开 始 查 找 DNS 记录,从而改善了网络性能。Djbdns 是 一个非常强大的 DNS 服务器,它具有 DNS 缓 存功能,而且比 BIND DNS 服务器更安全, 性能更好。可以直接通过 http://cr.yp.to/下 载,或通过 Red Hat 提供的软件包获得。 7、使用 AES256 增强 gpg 文件加密安全 为了提高备份文件或敏感信息的安全,许多 Linux 系统管理员都会使用 gpg 进行加密。在 使用 gpg 时,最好指定 gpg 使用 AES256 加 密算法。AES256 使用 256 位密钥,它是一个 开放的加密算法,美国国家安全局(NSA)都使 用它保护绝密信息,没有什么比它更安全的了。 8、远程备份服务安全 安全是选择远程备份服务最重要的因素,大 多数系统管理员都害怕两件事:(黑客)可以删 除备份文件,不能从备份恢复系统。 为了保证备份文件 100%的安全,备份服务 公 司提供远程备份服 务 器 , 使 用 scp 脚本或 RSYNC 通过 SSH 传输数据。这样,没有人可 以直接进入和访问远程系统,因此也没有人可 以从备份服务删除数据。在选择远程备份服务 提供商时,最好从多个方面了解其服务强壮性 如果可以,亲自测试一下。 9、更新默认内核参数设置 为了顺利运行企业应用程序,如数据库服务 器,可能需要更新一些默认的内核参数设置, 例如,2.4.x 系列内核消息队列参数 msgmni 有一个默认值(例如,共享内存,或 shmmax 在 Red Hat 系 统 上 默 认 只 有 33554432 字 节),它只允许有限的数据库并发连接,下面 为数据库服务器更好地运行提供了一些建议值 (来自 IBM DB2 支持网站): kernel.shmmax=268435456 (32 位) kernel.shmmax=1073741824 (64 位) kernel.msgmni=1024 fs.file-max=8192 kernel.sem=”250 32000 32 1024″ 10、优化 TCP 优化 TCP 协议有助于提高网络吞吐量。跨 广域网的通信使用的带宽越大,延迟时间越长 建议使用教大的 TCP Linux 大小以提高数据传 输速率。TCP Linux 大小决定了发送主机在没 有收到数据传输确认时,可以向接收主机发送 多少数据。 11、选择正确的文件系统 使用 ext4 文件系统取代 ext3,好处如下: ●ext4 扩展了存储限制 ●ext4 具有日志功能,保证高水平的数据完 整性(在非正常关闭事件中) ●在非正常关闭和重启时,ext4 不需要检查 磁盘(这是一个非常耗时的动作) ●更快的写入速度 12、使用 noatime 文件系统挂载选项 在 文 件 系 统 启 动 配 置 文 件 fstab 中 使 用 noatime 选项,如果使用了外部存储,这个挂 载选项可以有效改善性能。 13、调整 Linux 文件描述符限制 Linux 限制了任何进程可以打开的文件描述 符数量,默认限制是每进程 1024,这些限制 可 能 会 阻 碍 基 准 测 试 客 户 端 ( 如 httperf 和 apachebench)和 Web 服务器获得最佳性能。 33 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 技巧 Tips Apache 每个连接使用一个进程,因此不会 受到影 响,但单进程 Web 服 务 器 ,如 Zeus 是每连接使用一个文件描述符,因此很容易受 默认限制的影响。 打 开 文 件 限 制 可 以 用 ulimit 命 令 调 整 。 ulimit -aS 命令显示当前的限制,ulimit -aH 命令显示硬限制(在未调整/proc 中的内核参数 前,你不能增加限制)。 14、正确配置 MySQL 为 了 给 MySQL 分 配 更 多 的 内 存 , 可 设 置 MySQL 缓存大小。要是 MySQL 服务器实例 使 用 了 更 多 内 存 , 就 减 少 缓 存 大 小 ; 如 果 MySQL 在 请 求 增 多 时 停 滞 不 动 , 就 增 加 MySQL 缓存。 15、正确配置 Apache 检 查 Apache 使 用 了 多 少 内 存 , 再 调 整 StartServers 和 MinSpareServers 参数,以 释放更多的内存。这将有助于你节省 30-40% 的内存。 16、分析 Linux 服务器性能 ● 当大型应用程序同时运行时,计算机可能 会开始变慢,内存不足的出现几率更高。 ● 如果启动时真的很慢,可能是应用程序初 次启动需要较长的加载时间,一旦启动好后运 行就正常了;否则,很可能是硬盘太慢了。 ● CPU 负 载 持 续 很 高 , 内 存 也 够 用 , 但 CPU 利用率很低。可以使用 CPU 负载分析工 具监控负载时间。 17、学习 5 个 Linux 性能命令 top、vmstat、iostat、free 和 sar 18、将日志文件转移到内存中 当一台机器处于运行中时,最好是将系统日 志放在内存中,当系统关闭时再将其复制到硬 盘。当你运行一台开启了 syslog 功能的笔记 本电脑或移动设备时,ramlog 可以帮助你提 高系统电池或移动设备闪存驱动器的寿命,使 用 ramlog 的一个好处是,不用再担心某个守 护进程每隔 30 秒向 syslog 发送一条消息。 19、先打包,后写入 在内存中划分出固定大小的空间保存日志文 件。注意 ramlog 使用的内存空间大小是固定 的,否则系统内存会很快被用光。如果笔记本 使 用 固 态 硬 盘 , 可 以 分 配 50-80MB 内 存 给 ramlog 使用。 20、一般调优技巧 尽可能使用静态内容替代动态内容,如果你 在生成天气预告,或其它每隔 1 小时就必须更 新的数据,最好是写一个程序,每隔 1 小时生 成一 个静态的 文 件 , 而 不 是 让 用户运 行 一 个 CGI 动态地生成报告。 为 动 态 应 用 程 序 选 择 最 快 最 合 适 的 API。CGI 可能最容易编程,但它会为每个请 求产生一个进程。FastCGI 是更好的选择,和 Apache 的 mod_perl 一样,都可以极大地提 高应用程序的性能。▌※ 本文为节选,原文: http://os.51cto.com/art/201105/263266.htm 英文原文: 20 Linux Server Performance Tips 34 http://g.51cto.com/linuxops/ http://os.51cto.com/linux/ 投稿信箱:yangsai@51cto.com 《Linux 运维趋势》是由 51CTO 系统频道策划、针 对 Linux/Unix 系统运维人员的一份电子杂志,内 容从基础的技巧心得、实际操作案例到中、高端 的运维技术趋势与理念等均有覆盖。 《Linux 运维趋势》是开放的非盈利性电子杂志,其 中所有内容均收集整理自国内外互联网(包含 51CTO 系统频道本身的内容)。对于来自国内的 内容,编辑都会事先征求原作者的许可(八卦, 趣闻&数字栏目例外)。如果您认为本杂志的内容 侵 犯 到 了 您 的 版 权 , 可 发 信 至 yangsai@51cto.com 进行投诉。 招募启事 《Linux 运维趋势》的建设需要您的加入! 您可以通过如下方式参与我们杂志的建设: 1、推荐文章 无论是您在互联网上看到的好文章,还是您自己总结/整理的资料;无论是英文 还是中文;无论是入门的还是高端的,都欢迎推荐!推荐方式包括: a)在技术圈中分享:http://g.51cto.com/linuxops b)发邮件给编辑:yangsai@51cto.com 2、投稿 如果您认为自己在 Linux 方面具有专家级别的能力,并且有与大家分享您技术经 验的热诚,同时也有兴趣挣点稿费花花,那么欢迎您的投稿! 如果您在 IT 技术方面的翻译有很高的能力,能够快速、高质量的完成译文,并 且也经常浏览到一些 Linux 方面的优秀外文,那么也欢迎您的投稿,或加入我们 51CTO 的翻译团队! 投稿信箱:yangsai@51cto.com 3、推广与意见 如果您喜欢我们的杂志,认为这本杂志对于您的工作有所帮助,请向您的 Linux 好友、同事们推荐它! 如果您觉得这份杂志还有什么地方需要改进或补充,也希望您能够提出您的宝贵 意见! 联系人:yangsai@51cto.com 下期预告 下期主题为:日志分析。欢迎关注! 本刊为月刊,预定每月发布日期为: 每个月的第二个星期五 您可以通过如下方式检查新刊发布: 1、通过电子邮件订阅: 订阅方式请参考本杂志的专题页: http://os.51cto.com/art/201011/233915.htm 2、经常光顾 51CTO Linux 频道: http://os.51cto.com/linux/
还剩34页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 2 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

fzud

贡献于2014-04-21

下载需要 2 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf