使用 Rake 部署变更

每个人的生活都离不开键盘,但我讨厌不必要的敲打。 如果你按照 使用版本控制 一节所描述的工作流程工作, 可以添加一些自动化任务使这个处理过程更加容易。 有许多工具可以帮助我们在远程机器上执行命令,包括 Capistrano(https://github.com/capistrano/capistrano)和 Fabric(https://github.com/fabric/fabric),但在本例中,我们将使用 Rake(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:/ /[email protected]/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 管理大型网络时会为我们提供很大的帮助。

参见本书