💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 使用 Rake 部署变更 每个人的生活都离不开键盘,但我讨厌不必要的敲打。 如果你按照 [使用版本控制](#ch01sec01) 一节所描述的工作流程工作, 可以添加一些自动化任务使这个处理过程更加容易。 有许多工具可以帮助我们在远程机器上执行命令,包括 Capistrano([https://github.com/capistrano/capistrano](https://github.com/capistrano/capistrano))和 Fabric([https://github.com/fabric/fabric](https://github.com/fabric/fabric)),但在本例中,我们将使用 Rake([http://rake.rubyforge.org/](http://rake.rubyforge.org/))。 #### 准备工作 若你还没有安装 Rake, 运行如下的命令: ``` apt-get install rake ``` 执行这个命令,你需要一个 Internet 连接。 #### 操作步骤 1. 在你的 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 ``` 2. 当你在本地副本上应用 Puppet 配置清单的改动时,可以简单地运行命令: ``` $ rake deploy ``` 3. 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 ``` 4. 你还可以添加一个 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 ``` 5. 当你要在指定客户端上测试你所做的变更时,可以运行如下的命令: ``` 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 ``` 6. 如果你只想查看 Puppet 将会做些什么,而不是实际应用这些变更, 你可以使用 --noop 标志: ``` task :noop => [:deploy] do client = ENV['CLIENT'] sh "#{SSH} #{client} 'sudo puppet agent --test --noop'" end ``` 7. 现在你可以运行: ``` $ rake noop ``` 这将会显示一个变更预览。 #### 工作原理 一个 Rakefile 文件由若干任务组成,任务由关键字 task 来标识。 任务定义了一系列的操作步骤,在本例中,使用一系列的 shell 命令推送你的配置清单到主版本仓库, 然后更新 Puppetmaster 上的工作副本。 任务可以互相引用,因为一个任务可能会依赖其它任务。例如,在我们的 Rakefile 中, apply 任务引用了 deploy 任务,每当你运行 rake apply ,Rake 会先确保完成 deploy 任务,然后再执行 apply 任务。 #### 更多用法 你可以扩展这个 Rakefile 实现更多的自动化任务,包括在更新 Puppet 配置清单之前运行语法检查, 甚至可以在引导启动过程中使用 Puppet 来初始化你的新机器。 Rake 是一个功能强大的工具,在使用 Puppet 管理大型网络时会为我们提供很大的帮助。 #### 参见本书 * 本章的 [使用版本控制](#ch01sec01) 一节 * 本章的 [创建去中心化的分布式 Puppet 架构](#ch01sec10) 一节 * 本章的 [使用提交钩子](#ch01sec02) 一节