【问题标题】:What gems do you recommend to use for this kind of automation?您推荐使用哪些 gem 来实现这种自动化?
【发布时间】:2011-12-28 23:15:48
【问题描述】:

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

我需要做一个这样的 CLI 界面(示例场景):

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

这里我只是在维护服务器上用原始ip地址创建回环接口,并在sites-enabled中创建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 监控所做的更改来动态计算用这个脚本?

此脚本将首先用于大规模数据中心物理迁移,然后用于计划停机时间的标准用途。

谢谢

【问题讨论】:

    标签: ruby command-line rubygems automation nginx


    【解决方案1】:

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

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

    就我个人而言,我倾向于使用 SQLite 方法来存储数据,但我有偏见(拥有强大的 SQL 背景)。

    【讨论】:

    • 做 SQL 对我来说不是问题。可能是一个问题是“真实”状态的同步,以及数据库中的状态,以确保数据库不是陈旧的。但也许我可以将数据库仅用于记录更改和站点注册(名称-> IP),并从运行配置中获取真实状态
    【解决方案2】:

    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 数据库来存储键/值对以及您正在寻找的信息。

    【讨论】:

      【解决方案3】:

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

      • 小应用程序(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 模块)

      【讨论】:

        猜你喜欢
        • 2013-03-17
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2010-09-06
        • 2011-08-05
        • 1970-01-01
        • 2011-07-08
        • 2010-10-14
        相关资源
        最近更新 更多