使用 Rake 部署变更
每个人的生活都离不开键盘,但我讨厌不必要的敲打。 如果你按照 使用版本控制 一节所描述的工作流程工作, 可以添加一些自动化任务使这个处理过程更加容易。 有许多工具可以帮助我们在远程机器上执行命令,包括 Capistrano(https://github.com/capistrano/capistrano)和 Fabric(https://github.com/fabric/fabric),但在本例中,我们将使用 Rake(http://rake.rubyforge.org/)。
准备工作
若你还没有安装 Rake, 运行如下的命令:
apt-get install rake
执行这个命令,你需要一个 Internet 连接。
操作步骤
在你的 Puppet 配置清单工作副本的顶级目录下创建一个名为
Rakefile
的文件,例如:john@laptop:~/puppet-work$ vi Rakefile
文件内容看上去像这样:
PUPPETMASTER = 'cookbook' SSH = 'ssh -t -A' task :deploy do sh "git push" sh "#{SSH} #{PUPPETMASTER} 'cd /etc/puppet && sudo git pull'" end
当你在本地副本上应用 Puppet 配置清单的改动时,可以简单地运行命令:
$ rake deploy
Rake 会更新远程 Git 仓库并刷新 Puppetmaster 的工作目录副本:
$ git push Counting objects: 4, done. Delta compression using 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 452 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh:/ /git@cookbook.bitfieldconsulting.com/var/git/cookbook 561e5a6..a8b8c76 master -> master ssh -A -l root cookbook 'cd /etc/puppet && git pull' From ssh://cookbook.bitfieldconsulting.com/var/git/cookbook 561e5a6..a8b8c76 master -> origin/master Updating 561e5a6..a8b8c76 Fast-forward Rakefile | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) create mode 100644 Rakefile
你还可以添加一个 Rake 任务用于在客户端上运行 Puppet:
task :apply => [:deploy] do client = ENV['CLIENT'] sh "#{SSH} #{client} 'sudo puppet agent --test'" do |ok, status| puts case status.exitstatus when 0 then "Client is up to date." when 1 then "Puppet couldn't compile the manifest." when 2 then "Puppet made changes." when 4 then "Puppet found errors." end end end
当你要在指定客户端上测试你所做的变更时,可以运行如下的命令:
rake CLIENT=cookbook apply
替换
cookbook
为你客户端的名字,或设置CLIENT
环境变量,使 Rake 知道你要在哪个客户机上运行 Puppet。info: Caching catalog for cookbook info: Applying configuration version '1292865016' info: Creating state file /var/lib/puppet/state/state.yaml notice: Finished catalog run in 0.03 seconds
如果你只想查看 Puppet 将会做些什么,而不是实际应用这些变更, 你可以使用
--noop
标志:task :noop => [:deploy] do client = ENV['CLIENT'] sh "#{SSH} #{client} 'sudo puppet agent --test --noop'" end
现在你可以运行:
$ rake noop
这将会显示一个变更预览。
工作原理
一个 Rakefile
文件由若干任务组成,任务由关键字 task
来标识。 任务定义了一系列的操作步骤,在本例中,使用一系列的 shell 命令推送你的配置清单到主版本仓库, 然后更新 Puppetmaster 上的工作副本。
任务可以互相引用,因为一个任务可能会依赖其它任务。例如,在我们的 Rakefile
中, apply
任务引用了 deploy
任务,每当你运行 rake apply
,Rake 会先确保完成 deploy
任务,然后再执行 apply
任务。
更多用法
你可以扩展这个 Rakefile
实现更多的自动化任务,包括在更新 Puppet 配置清单之前运行语法检查, 甚至可以在引导启动过程中使用 Puppet 来初始化你的新机器。 Rake 是一个功能强大的工具,在使用 Puppet 管理大型网络时会为我们提供很大的帮助。
参见本书
本章的 使用版本控制 一节
本章的 创建去中心化的分布式 Puppet 架构 一节
本章的 使用提交钩子 一节