Puppet实战手册(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-02 20:54:37

点击下载

作者:[英]约翰,阿伦德尔(John Arundel)

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Puppet实战手册

Puppet实战手册试读:

前言

IT运维领域正在进行一场革命。新一代的配置管理工具可以在几秒内完成大量服务器的构建(配置)和整个网络自动化。为了充分利用云计算的强大功能,并且建立可靠、可扩展、安全、高性能的系统,拥有Puppet这样的工具是必不可少的。

本书不仅讲解了Puppet的基础知识,而且深入探讨了Puppet的所有强大功能,详细展示了如何解决现实中的各种问题和应用场景。每一步操作都完整地展示了需要录入的命令,并且每一个技巧都有完整的代码示例。

本书带领读者从Puppet的基本知识开始,完整、专业地讲解Puppet的最新和最先进的功能、社区的最佳实践、优秀的配置清单(manifest)的编写、扩展性和性能,以及通过添加定制的提供者(provider)和资源(resource)来扩展Puppet的方法。

本书还包含来自生产系统环境的真实示例,以及一些世界上最大的Puppet用户群所使用的技巧。书中会展示利用Puppet来做事的不同方法,并指出这些方法的优点和缺点。

本书的组织结构使读者在任何时候都可以深入到某个技巧进行尝试,而无须通读全书。每个主题都有提供更多信息的链接和参考阅读,读者可以根据自己的需要进一步自己探索。无论读者的Pupept经验水平如何,从简单的工作流程提示到更高级的高性能Puppet架构,这里都有合适的内容。

作为一名 DevOps 顾问,我极力去编写这种对我日常工作有帮助的书。我希望它能激励每一名读者去学习、去尝试,并将自己最新的创意快速运用到这个令人激动和快速发展的领域中。

本书涵盖的内容

本书包括以下几章内容。

第1章展示了第一次安装Puppet的方法,包括安装Puppet的指令、创建第一个清单、配合Puppet使用版本控制、基于Git构建分布式Puppet架构、编写脚本让Puppet清单生效、自动运行Puppet、用Rake来引导机器和部署变更,以及使用Git钩子(hook)实现清单的自动语法检查。

第2章涵盖了编写优秀的Puppet代码的方方面面,包括如何使用Puppet社区风格、通过 puppet-lint检查清单、用模块的方式组织清单、采用标准的命名和风格规范、使用内联模板、使用选择器和 case语句、字符串操作,以及采用迭代器、条件语句和正则表达式。

第3章深入探讨Puppet,提高代码质量和可用性的特殊功能细节,包括数组和定义、根据依赖关系排序资源、继承节点和类、传递参数给类、覆盖参数、从环境变量中读取信息、编写可复用的清单、使用标签(tag)和运行阶段。

第4章处理一些系统管理员最常见的任务,包括管理配置文件、使用Augeas、从代码片段和模板生成文件、管理第三方软件仓库、使用GnuPG加密Puppet中的机密数据,以及从源代码构建软件包。

第5章阐释了什么是虚拟资源,以及它们如何帮助用户管理不同机器上的用户和软件包的不同组合,并展示了如何使用Puppet的资源调度和审计功能。

第6章专注于可能需要Puppet管理的某些特定的应用程序,包括Apache和Nginx、MySQL及Ruby的完整技巧。

第7章通过Vagrant和EC2实例扩展Puppet的能力(在云上的虚拟机和在桌面系统上)来管理虚拟机。此外,还展示了如何用HAProxy设置负载均衡,如何利用iptables设置防火墙,如何利用NFS设置网络文件系统,如何利用Heartbeat设置高可用服务。

第8章着眼于Puppet周边已经成熟的工具,包括Hiera、Facter和rspec-puppet,还介绍了一些高级主题,包括编写自己的资源类型、提供者和外部节点分类器(ENC)。

第9章涵盖了Puppet报告自己做了些什么的信息和系统的状态的方法,包含报告、日志、调试消息、依赖关系图、测试和空运行(dry-running)清单,以及Puppet常见错误消息的排查指南。

阅读本书需要做的准备

为了运行这本书中的示例,需要有一台安装了Ubuntu Linux 12.04系统的计算机,并且要能够连接互联网。

本书的目标读者

假定读者具有一些 Linux 系统管理的经验,包括熟悉命令行、文件系统和文本编辑,但不需要任何编程经验。

书中的排版约定

读者会发现,本书中使用了一些不同样式的文本,用以区别不同类型的信息。下面是这些样式的示例及其含义的解释。

正文中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、用户输入和Twitter处理接口等都是用等宽字体,如下所示:“可以使用puppet-lint工具来检查配置清单的风格兼容性。”

代码块设置如下:

node 'cookbook' {

cron { 'randomised cron job':

command =>'/bin/echo Hello, world >>/tmp/hello.txt',

hour => '*',

minute => random_minute(),

}

}

若要提醒读者注意代码块中特定的部分时,会加粗相关代码行或某特定部分来进行标识:

newparam(:path) do

validate do |value|

basepath = File.dirname(value)

unless File.directory?(basepath)

raise ArgumentError , "The path %s doesn't exist" % basepath

end

end

end

命令行输入或输出如下所示:

ubuntu@cookbook:~/puppet$ papply

Notice: Hello, I was included by your ENC!

Notice: /Stage[main]/Admin::Helloenc/Notify[Hello, I was included by your

ENC!]/message: defined 'message' as 'Hello, I was included by your ENC!'

Notice: Finished catalog run in 0.29 seconds

新术语和重要词汇以黑体显示,在屏幕上显示的单词,比如出现在菜单或者对话框中的文本,在正文中显示为:“点击Next按钮跳转到下一个屏幕。”

读者反馈

我们总是欢迎来自读者的反馈,请告诉我们你觉得这本书怎么样——喜欢哪些内容,不喜欢哪些内容。读者的反馈对我们来说很重要,因为通过反馈,我们可以挖掘出更多有益于读者的主题。

普通的反馈只需发送电子邮件到feedback@packtpub.com,并在邮件主题中注明相应的书名即可。

如果你是某一些主题的专家并且对写作或撰写一本书有兴趣,可以访问www.packtpub.com/authors,阅读我们的作者指南。

客户支持

现在,你已经成为Packt出版社的尊贵用户,为了使你的购买物超所值,我们为你做了很多事情。

示例代码下载

如果你已经购买了本书,那么可以使用自己的账户从 http://www.packtpub.com 下载本书所有示例代码文件。如果在其他地方购买了本书,那么可以访问http://www.packtpub.com/support并注册,我们会将示例代码直接通过邮件发给你。

勘误

尽管我们已尽力确保内容的准确性,但错误仍然在所难免。如果读者在书中发现了错误(也许是一个文件或一段代码)并愿意反馈给我们,我们将不胜感激。这样做可以让其他读者免受这些错误的困扰,并且可以帮我们在下一版中进行改善。如果读者发现任何错误,请访问http://www.packtpub.com/submit-errata,选择书名,点击“提交勘误表格”链接,并在勘误表中填写详细的报告信息。一旦提交的勘误被确认,就会被采纳并上传到网站上,或者追加到该书的“勘误”部分已经存在的勘误列表中。任何现有的勘误都可以从http://www.packtpub.com/support选择书名进行查看。

版权说明

盗版的盛行是互联网上一直存在的问题。在Packt,我们地对待版权及许可的保护非常认真,如果读者发现在互联网上有任何非法复制我们的作品的情况,无论是什么形式,都请立即将网络地址或网站名称提供给我们,以便我们采取补救措施。

请通过copyright@packtpub.com联系我们,并附上涉嫌盗版内容的链接。

我们非常感谢你对作者权益的保护,你的协助同时也保障了我们带给你更多有价值内容的能力。

疑问

如果对于本书的某些方面有任何问题,可以通过 questions@packtpub.com 联系我们,我们会尽力解决。作者简介

John Arundel是一名DevOps顾问。这意味着他解决过很多非常复杂的实际问题(一般难度的问题可用不上咨询他)。

他在技术行业已经工作了20年,这些年间他犯过(或见过)计算机领域几乎所有你可能犯过的错误。由此累积的经验教训,是他作为技术顾问最大的资本之一。至今,他的经验依然在增长。

他热爱写作,尤其是Puppet相关(他的《The Puppet 3 Beginner’s Guide》已经出版)。不少读者都很喜欢读他的著作。他还提供Puppet方面的培训和辅导,这可比单单完成他自己的工作要难得多。

工作之余,他开着路虎远游登山。平常,他住在康沃尔郡的小农庄里。他相信,只要有一个花园、一座图书馆,就已经拥有一切!

可以关注他的Twitter账号@bitfield。

感谢Rene Lehmann、Cristian Leonte、German Rodriguez、Keiran Sweet、Dean Wilson 和Dan White帮助我完成校对并提出建议。尤其感谢Lance Murray 和Sebastiaan van Steenis,他们认真阅读和测试了每一章的内容,并且对优劣之处都提供了宝贵的意见。审校者简介

Dhruv Ahuja 是一名主机服务商的技术负责人。他专门从事基础架构解决方案设计和配置工作,同时关注mechanical sympathy(Martin Thompson 的硬件编程博客)。他第一次接触 Puppet是在 2011年,当时他正在为一个多功能网格计算平台开发动态扩展计算节点的方案。他获得过伦敦国王学院高级软件工程硕士学位,在2012年因提供优秀的解决方案赢得 Red Hat 英国渠道顾问年度大奖。长期的传统软件开发和复杂的系统管理工作经验让他同时在这两个领域具有极高的水准。他以一种隔离处理的方式,填补了很多架构中的缺失。在基础架构即代码的时代,他坚信,声明的抽象是一个可维护的系统生命周期过程中必不可少的。

Carlos N. A. Corrêa 是一名 IT 运维经理和顾问,也是一名 Puppet 爱好者和老派的Linux黑客。他拥有系统虚拟化方面的硕士学位,同时通过了 CISSP和RHCE认证。在系统管理领域工作 15年后,Carlos现在同时领导着公司在巴西和非洲的 IT运维团队。他还是兼职教授,在巴西教授本科和研究生课程。Carlos 与他人合著了不少网络虚拟化和OpenFlow方面的研究论文,在IEEE和ACM会议上发表供世界范围内同行评审。

我感谢上帝给予我们辛勤劳作的机会,以及一路走来总能找到的所有可爱的人。这其中最可爱的,就是我的妻子 Nanda。我感谢所有这些推动我前行的关怀和支持。对我父母——Nilton和Zélia,我想说,我做的一切都来源于你们的启发。

Daniele Sluijters是一名信息工程的学生,但是已经做过几年的运维工作。一开始,这只是一个业余爱好,但最终它发展成了他学习和工作的主要领域。过去几年,他在学习和工作中曾经主要关注由Unix系统组成的大规模网络如何给互联网世界提供的服务,如何管理和防护这些系统、系统提供的服务以及系统所使用的网络。他还在《Zabbix Network Monitoring Essentials》和《Munin Plugin Starter》两本书中做过贡献。第1章Puppet基础设施未来计算机可能只有1000个真空管,而且只有1.5吨重。——《大众机械》(Popular Mechanics),1949

本章内容包括:

□ 安装Puppet

□ 创建一个配置清单

□ 利用Git管理配置清单

□ 创建去中心化Puppet架构

□ 编写papply 脚本

□ 使用cron 运行Puppet

□ 利用Rake部署变更

□ 利用Rake引导Puppet运行

□ 利用Git钩子自动进行语法检查1.1简介

本书包含一些代表着Puppet社区认同的最佳实践的实例,一些可以帮助读者在工作中更容易使用Puppet的小提示和技巧,还有介绍一些读者以前不知道的功能。虽然有些技巧操作起来比较快捷,但是本书不建议读者将其作为标准操作流程使用(这些技巧在紧急情况下是非常有用的)。最后,还有一些读者可能想尝试一下的实验性例子,但这些只用于(或适用于)大规模基础设施或不同寻常的场景。

希望通过从头至尾的阅读和思考本书介绍的方法,读者能够对Puppet是如何工作的,以及如何利用Puppet提高基础设施配置有更深、更广的理解。只有本人能判断一个特定的配置是否适合自己和自己的团队,但希望本书中的内容可以激励读者去尝试和发现更多方法、技巧。更重要的是,能够找到使用Puppet的乐趣!

Linux发行版

因为 Ubuntu、Red Hat 和 CentOS 等不同 Linux 发行版本在包名、配置文件路径及许多其他配置细节不同,加上篇幅的原因,最好的方法就是挑选一个Linux发行版并固定使用它。因此,本书决定采使用 Ubuntu 12.04 来讲解。当然,Puppet 可以运行在大多数流行的操作系统上,即便使用自己喜欢的操作系统和发行版,应该也只会碰到很小的问题。

Puppet版本

在编写本书的时候,Puppet 3.2 是最新稳定版本。因此,本书选择此版本做为Puppet 参考版本在本书中使用。由于 Puppet 命令的语法会经常发生变化,因此需要注意虽然旧版本是完全可用的,但旧版本的语法有可能不支持本书中所描述的全部功能或语法。1.2安装Puppet

如果已安装好了Puppet,那么可以跳过此步骤。如果没有,或者想要升级或重装Puppet,则可以按以下开始一步一步完成相应的安装过程。

本书将使用亚马逊的EC2云实例来演示如何设置Puppet,不过读者可能更喜欢使用一台物理服务器、一个Linux工作站,或是一个Vagrant、VMWare、VirtualBox这样的虚拟机。本书会以ubuntu用户登录并使用sudo命令来执行需要root权限的命令(sudo是Ubuntu系统默认自带获取root权限的命令)。在EC2的Ubuntu镜像中,ubuntu用户默认已经有以root身份执行任何命令的sudo权限。如果使用其他Linux发行版本或者没有使用EC2,则需要通过/etc/sudoers文件来配置增加这个权限。

准备工作

需要给安装Puppet的机器设置主机名。[1]

1. 在服务器上设置适当的主机名 (忽略sudo的所有警告):

ubuntu@domU-12-31-39-09-51-23:~$ sudo hostname cookbook

ubuntu@domU-12-31-39-09-51-23:~$ sudo su -c 'echo cookbook

>/etc/hostname'

sudo: unable to resolve host cookbook

2. 退出系统并重新登录后,可以检查主机名已经正确设置:

ubuntu@cookbook:~$

3. 查找本机的本地IP 地址:

ubuntu@cookbook:~$ ip addr show |grep eth0

inet 10.96.247.132/23 brd 10.96.247.255 scope global eth0

4. 复制服务器IP 地址(这里是10.96.247.132)并添加到/etc/hosts文件(使用自己的主机名和域名),参考如下:

10.96.247.132 cookbook cookbook.example.com

操作步骤

Puppet Labs为包含Ubuntu 在内的大多数Linux 发行版提供了Puppet软件包。本书将以Ubuntu 12.04 Precise 为例,讲解如何安装Puppet。

1. 从Puppet Labs网站下载仓库(repo)软件包:

ubuntu@cookbook:~$ wget http://apt.puppetlabs.com/puppetlabs-release-precise.deb

2. 安装仓库(repo)软件包:

ubuntu@cookbook:~$ sudo dpkg -i puppetlabs-release-precise.deb

Selecting previously unselected package puppetlabs-release.

(Reading database ... 33975 files and directories currently installed.)

Unpacking puppetlabs-release (from puppetlabs-release-precise.deb)

Setting up puppetlabs-release (1.0-5)

3. 更新APT配置:

ubuntu@cookbook:~$ sudo apt-get update如果使用的不是Ubuntu 12.04,可以在线学习如何安装Puppet仓库,网址如下:http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html。

4. 安装Puppet:

ubuntu@cookbook:~$ sudo apt-get -y install puppet如果读者使用的是MAC,可以 从Puppet Labs官方网站下载DMG文件进行安装,网址如下:https://downloads.puppetlabs.com/mac/。如果读者使用的是Windows,可以从Puppet Labs官方网站下载MSI文件进行安装,网址如下:https://downloads.puppetlabs.com/windows/。

5. 运行下面的命令,检查Puppet是否安装成功:

ubuntu@cookbook:~$ puppet --version

3.2.2

如果安装的Puppet 版本与本书不完全相同,不用担心,可以从Puppet Labs 获取由它提供的最新稳定版本。在很长的一段时间之内,Puppet 的版本都会是 3.x 系列,读者不用担心本书的示例无法运行。

如果读者安装的是比较老的Puppet版本,就会发现很多东西无法工作或者不符合自己的预期。如果可以,本书建议升级到Puppet 3.x或更新版本。

现在,Puppet已经安装完成,可以通过创建一个配置清单去改变配置文件。下一节将讲解如何去实现。1.3创建一个配置清单

如果读者已经有一些Puppet代码(也就是Puppet配置清单 manifest),那么可以跳过此步骤继续下一步。如果没有,就来学习一下如何去创建和应用一个简单的配置清单。

操作步骤

按照如下步骤进行操作。

1. 首先,创建一个适合的目录结构,存放配置清单代码。

ubuntu@cookbook:~$ mkdir puppet

ubuntu@cookbook:~$ cd puppet

ubuntu@cookbook:~/puppet$ mkdir manifests

2. 在puppet目录里中,创建manifests/site.pp文件,内容如下:

import 'nodes.pp'

3. 参照下面的内容,创建manifests/nodes.pp文件(使用读者自己机器的主机名替换

cookbook):

node 'cookbook' {

file { '/tmp/hello':

content => "Hello, world\n",

}

}

4. 使用puppet apply命令测试前面的配置清单。这将告知Puppet读取该配置清单,并与服务器的状态进行对比,对服务器进行必要的修改以使其状态一致。

ubuntu@cookbook:~/puppet$ sudo puppet apply manifests/site.pp

Notice: /Stage[main]//Node[cookbook]/File[/tmp/hello]/ensure:

defined content as '{md5}a7966bf58e23583c9a5a4059383ff850'

Notice: Finished catalog run in 0.06 seconds

5. 运行下面的命令,验证 Puppet 是否按预期做了修改(创建内容为 Hello,world 的/tmp/hello文件):

ubuntu@cookbook:~/puppet$ cat /tmp/hello

Hello, world1.4利用Git管理配置清单

把Puppet配置清单存放在版本控制系统Git或Subversion中管理(推荐Git),所有Puppet管理的机器都从仓库取出配置,这是一个非常好的想法。它有以下几个优点。

□ 可以取消对配置清单的更改并回滚至以前任意一个版本。

□ 可以使用新的分支(branch)来测试新功能。

□ 如果有多人需要修改配置清单,可以分别独立在自己的工作副本上进行,然后再合并所有的修改。

□ 可以使用git log功能查看谁在什么时候做了什么修改。

准备工作

本节将导入现有的清单文件到Git仓库。如果读者已经在上一节创建了puppet目录,就使用它;否则,就使用当前的清单目录。

本书将使用流行的GitHub服务作为本书的Git服务器。不强制读者这么做,读者也可以很容易地运行自己的Git服务器,但GitHub的确简化了很多事情。如果读者已经在使用Git并有一台合适的服务器,就可以放心地使用自己的。需要注意的是,目前GitHub只提供公开的免费仓库(也就是说,每个人都可以看到仓库里的 Puppet 配置清单)。当配置清单中有机密数据(如密码)时,使用GitHub就不是一个好主意。使用本书中的示例来玩一玩,做些实验还可以,但在生产环境中使用时,需要考虑使用私有的GitHub仓库来代替。

参照下面的步骤导入配置清单。

1. 首先,在服务器上安装Git。

ubuntu@cookbook:~/puppet$ sudo apt-get install git

2. 其次,需要一个GitHub 账号(免费的开源项目,或支付少量费用创建私有仓库)和一个仓库。按照github.com的说明创建并初始化仓库(repository),确保勾选了github.com的版权说明Initialize this repository with a README。

3. 授权 SSH 密钥来读/写仓库(参考 GitHub 帮助页面 https://help.github.com/获得具体方法的指导)。

操作步骤

现在,将配置清单添加到 Git 仓库。复制仓库并移动配置清单文件到仓库中,操作步骤如下。

1. 首先,将puppet目录改名。

mv puppet puppet.import

2. 在服务器上克隆GitHub 上的仓库到puppet目录(使用在GitHub 上创建的仓库URL,可以在GitHub页面上获取)。

ubuntu@cookbook:~$ git clone

git@github.com:bitfield/cookbook.git puppet

Cloning into 'puppet'...

remote: Counting objects: 3, done.

remote: Total 3 (delta 0), reused 0 (delta 0)

Receiving objects: 100% (3/3), done.

3. 将puppet.import目录下所有文件移动到puppet目录。

ubuntu@cookbook:~$ mv puppet.import/* puppet/

4. 添加并提交新的文件至GitHub 仓库,如果有必要,设置Git详细认证资料。

ubuntu@cookbook:~$ cd puppet

ubuntu@cookbook:~/puppet$ git status

# On branch master

# Untracked files:

# (use "git add ..." to include in what will be committed)

#

#  manifests/

nothing added to commit but untracked files present (use "git add" to track)

ubuntu@cookbook:~/puppet$ git add manifests/

ubuntu@cookbook:~/puppet$ git config --global user.name "John Arundel"

ubuntu@cookbook:~/puppet$ git config --global user.email

"john@bitfieldconsulting.com"

ubuntu@cookbook:~/puppet$ git commit -m "Importing"

[master a063a5b] Importing

Committer: John Arundel

2 files changed, 6 insertions(+)

create mode 100644 manifests/nodes.pp

create mode 100644 manifests/site.pp

5. 最后,将变更推送至GitHub。

ubuntu@cookbook:~/puppet$ git push -u origin master

Counting objects: 6, done.

Compressing objects: 100% (4/4), done.

Writing objects: 100% (5/5), 457 bytes, done.

Total 5 (delta 0), reused 0 (delta 0)

To git@github.com:bitfield/cookbook.git

6d6aa51..a063a5b master -> master

工作原理

Git会跟踪文件的变更,并存储完整的变更历史记录。仓库的历史记录由多个提交组成。一次Git提交包含使用git commit命令提交时仓库的状态和注释。

现在,已经将Puppet配置清单文件添加到仓库并创建了第一条提交。这个提交更新了仓库的历史,但仅保存在本地工作副本中。如果要将副本的变化同步到GitHub上,还需要运行git push命令推送所有变更。

更多参考

现在,有一个中心Git仓库来管理Puppet配置清单,这样就可以在不同地方检出它的副本,修改并提交变更。比如,有一个工作团队,团队中每一个成员都可以将这个仓库复制至本地,并通过GitHub同步他们的修改。

使用Git控制Puppet的配置清单后,还需要使用一种简单、可扩展的方式将清单文件分发至大量的机器。下一节讲解如何来实现这些。1.5创建去中心化Puppet架构

有些系统分散管理时会工作得更好。

使用 Puppet 最常见的方法就是运行一台 Puppet Master 服务器,Puppet 客户端连接到Puppet Master 并接收各自的配置清单。然而,Puppet Master 并不是必需的,可以直接在配置清单文件上运行puppet apply命令来应用变更。

ubuntu@cookbook:~/puppet$ puppet apply manifests/site.pp

Notice: Finished catalog run in 0.08 seconds

换句话说,如果能安排适当的清单文件分发至客户端上,就可以使用Puppet直接执行而不需要通过Puppet Master来控制。这将消除由于仅有一台主服务器导致的性能瓶颈,也消除了单点故障。同时,这也避免了添加新的客户端时颁发SSL签名证书的问题。

有很多方法可以将清单文件分发至客户端,但是Git(或其他版本控制系统)为此做了大量工作。用户可以在本地副本中编辑清单,然后提交至Git,并推送至中心仓库。在那里,它们会自动分发至客户端。

准备工作

如果Puppet配置清单没有存放在Git中,参考上面步骤将清单加入Git中管理。

此时,需要第二台机器来检出Puppet仓库的副本。如果使用EC2实例,则创建另一个实例,并给它取个主机名,如cookbook2。

操作步骤

具体步骤如下。

1. 在新机器上检出GitHub 仓库。

ubuntu@cookbook2:~$ git clone

git@github.com:bitfield/cookbook.git puppet

Cloning into 'puppet'...

remote: Counting objects: 8, done.

remote: Compressing objects: 100% (5/5), done.

remote: Total 8 (delta 0), reused 5 (delta 0)

Receiving objects: 100% (8/8), done.

2. 参照下面的内容,修改manifests/nodes.pp文件:

node 'cookbook', 'cookbook2' {

file { '/tmp/hello':

content => "Hello, world\n",

}

}

3. 运行以下命令:

ubuntu@cookbook2:~/puppet$ sudo puppet apply manifests/site.pp

Notice: /Stage[main]//Node[cookbook2]/File[/tmp/hello]/ensure:

defined content as '{md5}a7966bf58e23583c9a5a4059383ff850'

Notice: Finished catalog run in 0.05 seconds

工作原理

新机器上已经创建了一个Puppet仓库的副本。

ubuntu@cookbook2:~$ git clone git@github.com:bitfield/cookbook.git puppet

在运行Puppet前,必须首先在配置清单中针对cookboo2创建节点声明。

node 'cookbook', 'cookbook2' {

...

}

现在应用这些配置清单,让它们生效。

ubuntu@cookbook2:~/puppet$ sudo puppet apply manifests/site.pp

Puppet找到cookbook2的节点声明,并应用与之前用于cookbook相同的配置清单:

Notice: /Stage[main]//Node[cookbook2]/File[/tmp/hello]/ensure:

defined content as '{md5}a7966bf58e23583c9a5a4059383ff850'

更多参考

此处已经将Puppet基础设施从一台机器扩展到了另外一台,现在可以将其扩展到任意多台。只需要检出Git 仓库,并执行puppet apply命令。

这是一个非常好的方法,不需要复杂的配置,也不用多余的机器作为Puppet Master,就可以将现在的机器交由Puppet管理。笔者的很多客户都已经使用了这种基于Git的基础设施,它简单、易于扩展和维护。

需要考虑的一个改进就是要让每台机器自动从GitHub拉取修改并使用Puppet应用这些修改。然后要做的就只是推送变更至GitHub,变更的内容就会在某一个时间部署至所有Puppet管理的机器。接下来,读者将在下一节看到如何做到这一点。1.6编写papply脚本

人们希望可以尽量简单和简单地将Puppet配置应用到主机上,因此,通常会写一个脚本,它包含 puppet apply 命令和所需要的参数。要部署这个脚本到需要它的地方,除了Puppet,还有什么更好的工具吗?

操作步骤

具体步骤如下。

1. 在Puppet仓库目录中创建puppet模块必需的目录。

ubuntu@cookbook:~/puppet$ mkdir modules

ubuntu@cookbook:~/puppet$ mkdir modules/puppet

ubuntu@cookbook:~/puppet$ mkdir modules/puppet/manifests

ubuntu@cookbook:~/puppet$ mkdir modules/puppet/files

2. 参照下面的内容,创建modules/puppet/files/papply.sh文件,sudo puppet apply命令应该全部写在同一行中(修改/home/ubuntu/puppet目录为 Puppet 仓库所在的目录),内容如下:

#!/bin/sh

sudo puppet apply /home/ubuntu/puppet/manifests/site.pp

--modulepath=/home/ubuntu/puppet/modules/ $*

3. 创建modules/puppet/manifests/init.pp文件,内容如下:

class puppet {

file { '/usr/local/bin/papply':

source => 'puppet:///modules/puppet/papply.sh',

mode => '0755',

}

}

4. 修改manifests/node.pp文件,内容如下:

node 'cookbook' {

include puppet

}

5. 应用这些修改。

ubuntu@cookbook:~/puppet$ sudo puppet apply manifests/site.pp

--modulepath=/home/ubuntu/puppet/modules

Notice: /Stage[main]/Puppet/File[/usr/local/bin/papply]

/ensure: defined content as '{md5}

171896840d39664c00909eb8cf47a53c'

Notice: Finished catalog run in 0.07 seconds

6. 测试脚本是否工作正常。

ubuntu@cookbook:~/puppet$ papply

Notice: Finished catalog run in 0.07 seconds

现在,当需要运行Puppet时,只需要简单运行papply即可。将来需要应用Puppet变更时,也只需要运行papply而不是运行完整的puppet apply命令。

工作原理

可以看到,在一台机器上运行 Puppet 和应用指定的清单文件,只需要运行 puppet apply命令。

puppet apply manifests/site.pp

使用模块(如刚刚创建的puppet模块)时,还需要告诉Puppet去哪里搜索模块,使用modulepath参数指定模块搜索目录。

puppet apply manifests/site.pp --

modulepath=/home/ubuntu/puppet/modules

为了使用root权限运行Puppet,必须在命令前使用sudo。

sudo puppet apply manifests/site.pp --

modulepath=/home/ubuntu/puppet/modules

最后,通过添加$*参数,任何传递给papply的额外参数都会传递给Puppet。

sudo puppet apply manifests/site.pp --

modulepath=/home/ubuntu/puppet/modules $*

由于需要输入太多字符,可以把它们写进一个脚本以简化操作。同时,添加一个Puppet file资源,用来部署papply脚本到/usr/local/bin目录并使其执行。

file { '/usr/local/bin/papply':

source => 'puppet:///modules/puppet/papply.sh',

mode => '0755',

}

最后,需要在cookbook节点声明中包括include puppet:

node 'cookbook' {

include puppet

}

读者可以在Puppet管理其他任何节点中使用同样的方法来部署papply脚本。1.7使用cron运行Puppet

通过已有的配置,已经可以做很多事情,包括在团队中管理Puppet清单,通过GitHub同步变更,使用papply脚本在机器上手动应用配置变更。

然而,截至目前还是需要手动登录到每台机器上更新 Git 仓库并重新运行 Puppet。如果每台机器可以自动更新并应用变更,就更方便了。这样,只需要将修改推送至仓库,所有机器就会在一定时间范围内自动完成配置的变更。

做到这一点最简单的方法就是使用cron作业,定期从仓库更新配置文件并在有变更时运行Puppet。

准备工作

首先,需要在前面的1.4节和1.5节中设置的Git仓库以及1.6节中的papply脚本。

然后,还需要创建一个SSH秘钥,每台机器使用它进行认证,从Git仓库拉取变更。创建SSH秘钥可参考如下步骤。

1. 运行以下命令,创建密钥文件。

ubuntu@cookbook:~/puppet$ ssh-keygen -f ubuntu

Generating public/private rsa key pair.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in ubuntu.

Your public key has been saved in ubuntu.pub.

The key fingerprint is:

ae:80:48:1c:14:51:d6:b1:73:4f:60:e2:cf:3d:ce:f1 ubuntu@cookbook

The key's randomart image is:

+--[ RSA 2048]----+

| ++o.o.o  |

| +   |

| +   |

| = +  |

| o oS=  |

|  o +  |

|  o E  |

|    |

|    |

+-----------------+

2. 打印ubuntu.pub文件的内容。

ubuntu@cookbook:~/puppet$ cat ubuntu.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8EsdLAZHIg1nnMzJuIQ5jEcFL1W

I5AVhml6Z3Gw4zc4xw6F1Citomc+3DexcaD+y3VrD3WEOGcXweCsxJF0EGyJoc4RbP

AJaP3D4V/+9FQVZcH90GukasvtIrfJYy2KFfRBROKtrfckMbBlWF7U2U+FwaalMOtg

LzZeECSDU4eYuheN3UVcyg9Zx87zrLYU5EK1JH2WVoZd3UmdH73/rwPJWtSEQ3xs9A

2wMr0lJsCF4CcFCVwrAIoEf5WzIoHbhWyZaVyPR4gHUHd3wNIzC0rmoRiYwE5uYvVB

ObLN10uZhn7zGPWHEc5tYU7DMbz61iTe4NLtauwJkZxmXUiPJh ubuntu@cookbook

复制上面的内容并将其作为部署密钥添加至GitHub仓库(参考GitHub关于这部分内容的操作指南)。这样,会授权这个密钥可以从GitHub中克隆Puppet仓库。

操作步骤

具体步骤如下。

1. 移动公钥文件到puppet模块。

ubuntu@cookbook:~/puppet$ mv ubuntu.pub

modules/puppet/files/ubuntu.pub

2. 不要将私钥放进Puppet仓库(需要通过其他通道来分发私钥到那些需要检出仓库的机器中)。

3. 参照下面的内容,创建modules/puppet/files/pull-updates.sh文件。

#!/bin/sh

cd /home/ubuntu/puppet

git pull && /usr/local/bin/papply

4. 参照下面的内容,修改modules/puppet/manifests/init.pp文件。

class puppet {

file { '/usr/local/bin/papply':

source => 'puppet:///modules/puppet/papply.sh',

mode => '0755',

}

file { '/usr/local/bin/pull-updates':

source => 'puppet:///modules/puppet/pull-updates.sh',

mode => '0755',

}

file { '/home/ubuntu/.ssh/id_rsa':

source => 'puppet:///modules/puppet/ubuntu.priv',

owner => 'ubuntu',

mode => '0600',

}

cron { 'run-puppet':

ensure => present,

user => 'ubuntu',

command => '/usr/local/bin/pull-updates',

minute => '*/10',

hour => '*',

}

}

5. 运行Puppet。

ubuntu@cookbook:~/puppet$ papply

Notice: /Stage[main]/Puppet/Cron[run-puppet]/ensure: created

Notice: /Stage[main]/Puppet/File[/usr/local/bin/pull-updates]/ensure:

defined content as'{md5}20cfc6cf2a40155d4055d475a109137d'

Notice: /Stage[main]/Puppet/File[/home/ubuntu/.ssh/id_rsa]/ensure:

defined content as '{md5}db19f750104d3bf4e2603136553c6f3e'

Notice: Finished catalog run in 0.27 seconds

6. 测试新的SSH 密钥是否已经正确获得GitHub 授权。

ubuntu@cookbook:~/puppet$ ssh git@github.com

PTY allocation request failed on channel 0

Hi bitfield/cookbook! You've successfully authenticated, but

GitHub does not provide shell access.

Connection to github.com closed.

7. 检查pull-updates脚本是否正常工作。

ubuntu@cookbook:~/puppet$ pull-updates

Already up-to-date.

Notice: Finished catalog run in 0.16 seconds

工作原理

到现在为止,已经实现了从被管理的服务器上通过 SSH 认证访问 GitHub(使用 SSH代理转发),但是如果不登录到服务器并执行相关命令,服务器就不能自动拉取更新。所以,此处创建了一个新的SSH密钥对,将公钥作为部署密钥添加到GitHub,使拥有密钥文件的服务器可以访问仓库。

将这个私钥作为ubuntu用户默认的SSH密钥。

file { '/home/ubuntu/.ssh/id_rsa':

source => 'puppet:///modules/puppet/ubuntu.priv',

owner => 'ubuntu',

mode => '0600',

}

这使得用户 ubuntu 可以在 puppet 目录运行 git pull 命令。此外,还增加了pull-updates脚本来执行这条命令,并在有任何配置更改时运行Puppet。

#!/bin/sh

cd /home/ubuntu/puppet

git pull && papply

将这个脚本部署到所有的Puppet主机上:

file { '/usr/local/bin/pull-updates':

source => 'puppet:///modules/puppet/pull-updates.sh',

mode => '0755',

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载