本节书摘来自异步社区《Puppet实战手册》一书中的第1章,第1.8节,作者:【英】John Arundel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.8 利用Rake部署变更
Rake是一个基于Ruby语言编写的实用工具,它可以帮助自动化完成Puppet的工作流程。虽然有很多其他方法支持在远程服务器上运行命令,但是Rake碰巧是本书使用的方法,它很容易扩展,可以非常方便地使用它做任何事。
此处要让Rake为做的第一件事情是:登录到远程服务器上,运行pull-updates脚本,将新修改的Puppet配置清单应用到该服务器上。做起来非常简单,下面来看看它是如何实现的。
准备工作
你可能已经安装了Rake(尝试运行rake命令进行检查),如果还没有,下面将介绍如何安装Rake。
运行下面的命令安装Rake:
sudo apt-get install rake
操作步骤
具体步骤如下。
1. 在Puppet仓库中,创建内容如下的Rakefile文件。使用正确的ssh命令替换ssh...,登录到服务器。
SSH = 'ssh -A -i ~/git/bitfield/bitfield.pem -l ubuntu'
desc "Run Puppet on ENV['CLIENT']"
task :apply do
client = ENV['CLIENT']
sh "git push"
sh "#{SSH} #{client} pull-updates"
end
2. 在Git中添加这个文件,并将这些变更提交和推送到Git仓库。
ubuntu@cookbook:~/puppet$ git add Rakefile
ubuntu@cookbook:~/puppet$ git commit -m "adding Rakefile"
[master 63bb0c1] adding Rakefile
1 file changed, 8 insertions(+)
create mode 100644 Rakefile
ubuntu@cookbook:~/puppet$ git push
Counting objects: 31, done.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (28/28), 4.67 KiB, done.
Total 28 (delta 1), reused 0 (delta 0)
To git@github.com:bitfield/cookbook.git
a063a5b..63bb0c1 master -> master
3. 如果读者自己的计算机中还没有Puppet仓库副本,从GitHub检出一份下来(将Git URL替换为Git仓库地址)。
[john@Susie:~/git]$ git clone
git@github.com:bitfield/cookbook.git
Cloning into 'cookbook'...
remote: Counting objects: 36, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 36 (delta 1), reused 33 (delta 1)
Receiving objects: 100% (36/36), 5.28 KiB, done.
Resolving deltas: 100% (1/1), done.
4. 运行下面的命令,用服务器地址替换其中的cookbook:
[john@Susie:~/git]$ cd cookbook
[john@Susie:~/git/cookbook(master)]$ rake CLIENT=cookbook apply
(in /Users/john/git/cookbook)
git push
Everything up-to-date
ssh -A -i ~/git/bitfield/bitfield.pem -l ubuntu cookbook
pull-updates
Already up-to-date.
Notice: Finished catalog run in 0.18 seconds
Connection to cookbook closed.
工作原理
通常手动更新配置的方式是:使用SSH登录到服务器,然后运行pull-updates脚本。这个Rakefile文件就是把这几步简单地自动化。首先,需要调整SSH命令行配置。
SSH = 'ssh -A -i ~/git/bitfield/bitfield.pem -l ubuntu'
ssh的参数如下所示。
-A:将SSH密钥转发至远程服务器,这样将来就可以使用它来进行验证。
-i KEYFILE:设置要使用的SSH私钥文件(在本例中,使用的是Amazon AWS的私钥文件,如果已经设置了使用默认密钥来访问该服务器,就无须配置此参数)。
-l ubuntu:使用ubuntu用户登录(这里是使用标准的EC2服务器,如果是本地机器与服务器上使用相同的用户,就不需要使用此参数)。
然后,定义一个叫apply的Rake任务:
desc "Run Puppet on ENV['CLIENT']"
task :apply do
end
desc只是一个有用的描述信息,如果运行rake–T命令,将会列出可用的任务。
$ rake–T
(in /Users/john/git/cookbook)
rake apply # Run puppet on ENV['CLIENT']
运行rake apply命令时,会运行task和end之间的代码,内容如下:
client = ENV['CLIENT']
这里将会捕获环境变量CLIENT的值,告诉脚本需要连接的远程服务器的地址。
下一行命令如下所示:
sh "git push"
sh只是运行本地shell中的命令。在这个例子中,该命令是为了确保本地Puppet仓库中的任何变更都被推送到GitHub中的。如果这些变更没有被推送到GitHub,将不会在远程服务器中应用。
sh "#{SSH} #{client} pull-updates"
这一行代码使用脚本开始时定义的ssh命令行以及客户端地址,连接到那个客户端。登录成功后,以远程用户身份运行pull-updates命令。
目前,已经配置好pull-updates脚本。通过脚本从GitHub获取最新配置清单并在Puppet中应用,这些就是全部要做的。
更多参考
现在可以做出变更,并且无须登录到这些远程服务器就能将Puppet变更应用至远程服务器上。只要在机器上安装了Puppet,检出一份配置清单仓库,并第一次运行了Puppet,以后就可以远程为这台机器做任何管理操作。
怕麻烦的读者肯定早就会问:“能不能使用Rake完成Puppet的初次安装和仓库检出以及所有的配置变更呢?”
当然可以,下一节将讲解如何去实现这一目标。