您建议将哪些宝石用于此类自动化?

时间:2011-11-14 20:07:43

标签: ruby command-line rubygems automation nginx

我必须创建一个脚本来管理托管公司的维护页面服务器。

我需要做一个类似于此的CLI界面(示例场景):

(这里假设mcli是脚本的名称,1.1.1.1原始服务器地址(托管网站,www.exemple.com)

这里我只使用原始IP地址在维护服务器上创建环回接口,并在启用站点的地方创建特定于nginx站点的配置文件

$ mcli register www.exemple.com 1.1.1.1
[DEBUG] Adding IP 1.1.1.1 to new loopback interface lo:001001001001
[WARNING] No root directory specified, setting default maintenance page.
[DEBUG] Registering www.exemple.com maintenance page and reloading Nginx: OK

然后,当我想启用维护页面并完全关闭网站时:

$ mcli maintenance www.exemple.com
[DEBUG] Connecting to router with SSH: OK
[DEBUG] Setting new route to 1.1.1.1 to maintenance server: OK
[DEBUG] Writing configuration: Ok

然后删除维护页面:

$ mcli nomaintenance www.exemple.com
[DEBUG] Connecting to router with SSH: OK
[DEBUG] Removing route to 1.1.1.1: Ok
[DEBUG] Writing configuration: Ok

我需要一个功能来查看网站的实际状态

$ mcli list
+------------------+-----------------+------------------+
| Site Name        | Server I.P      | Maintenance mode |
+------------------+-----------------+------------------+
| www.example.com  | 1.1.1.1         | Enabled          |
| www.example.org  | 1.1.1.2         | Disabled         |
+------------------+-----------------+------------------+

$ mcli show www.example.org
Site Name:        www.example.org
Server I.P:       1.1.1.1
Maintenance Mode: Enabled
Root Directory :  /var/www/maintenance/default/

但我从来没有用Ruby编写这种脚本。你对这类东西推荐什么宝石?对于命令行解析?柱/彩色输出? SSH连接(需要连接到cisco路由器)

您是否建议我使用本地数据库(sqlite)存储元数据(阶段更改,实际状态),还是建议我通过分析nginx / interfaces配置文件并使用syslog监视更改来动态计算用这个脚本?

此脚本将首次用于大规​​模数据中心物理迁移,接下来将用于计划停机时间的标准用途。

谢谢

3 个答案:

答案 0 :(得分:1)

首先,我建议您获取Build awesome command-line applications in Ruby的副本。

那就是说,你可能想检查一下

就个人而言,我会选择SQLite方法来存储数据,但我有偏见(具有强大的SQL背景)。

答案 1 :(得分:0)

Thor是处理CLI选项的好宝石。它允许您的脚本中的这种类型的组织:

class Maintenance < Thor
  desc "maintenance", "put up maintenance page"
  method_option :switch, :aliases => '-s', :type => 'string'
  #The method name is the name of the task that would be run   => mcli maintenance
  def maintenance
    #do stuff
  end

  no_tasks do
    #methods that you don't want cli tasks for go here
  end
end
Maintenance.start

虽然我对列/彩色输出没有任何好的建议。

我绝对建议使用某种数据库来存储状态。也许不是sqlite,我可能会选择一个redis数据库来存储键/值对以及你正在寻找的信息。

答案 2 :(得分:0)

我们有类似的任务。我使用下一个架构

  • 小应用程序(C)生成配置文件
  • 添加nginx init.d脚本新开关update_clusters。仅当配置文件更改时,此脚本才会重新启动nginx
update_clusters() {
   ${CONF_GEN} --outfile=/tmp/nginx_clusters.conf
   RETVAL=$?            
   if [[ "$RETVAL" !=  "0" ]]; then
     return 5
   fi
   if ! diff ${CLUSTER_CONF_FILE} /tmp/nginx_clusters.conf > /dev/null; then
       echo "Cluster configuration changed. Reload service"
       mv -f /tmp/nginx_clusters.conf ${CLUSTER_CONF_FILE}
       reload
   fi                   
}
  • 用于向数据库添加记录的bash脚本集。
  • 用于在数据库中添加/修改/删除记录的Web控制台(extjs + nginx module)