2

nginx 構成ファイルを作成するためのいくつかの ruby​​ スクリプトを作成しています。

2 つのファイルがあります。1 つはいくつかのプレースホルダーを含むテンプレートで、もう 1 つは必要なすべての情報を含むシリアル化されたハッシュを格納します。

この情報は、アプリケーションの一般名、URL、使用するポートの数、および最初のポートで構成されます。

わかりやすくするために、短い例を作成します。これは私のテンプレートです:

テンプレート ファイル:

upstream thin {
    {upstream}
}
server {
    listen 80;
    server_name .{url};
    root /var/www/{name};
}

これは、多かれ少なかれ、ruby コードを使用して 2 番目のファイルに情報を格納する方法です。

情報を保存する Ruby スクリプト:

apps = Hash.new { |h, k| h[k] = Hash.new }
apps["foo"] = {"url" => "foo.co.uk", "ports" => 3, "first" => 3000 }
apps["bar"] = {"url" => "bar.com", "ports" => 2, "first" => 3003 }

serialisedApps = Marshal.dump(apps)
File.open('/home/deploy/data/apps', 'w') {|f| f.write(serialisedApps) }

これで、この情報を次のようにロードできます。

apps = Marshal.load File.read('/home/deploy/data/apps')

そして、ハッシュを反復処理して、foo (3000、3001、および 3002) と bar (3003、および 3004) のポートを出力できます。

apps.each {|key, value|
  pn = value["ports"]
  fp = value["first"]

  pn.times do |i|
    currPort = fp + i
    puts "#{key} in port #{currPort}"
  end
}

次に、そのテンプレートを取得して、次のように 2 つのファイル (「foo」と「bar」) を複製する必要があります。

upstream thin {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
}
server {
    listen 80;
    server_name .foo.co.uk;
    root /var/www/foo;
}

テンプレートをロードし、プレースホルダーを置き換えて、別の場所に保存するだけです。bashスクリプトで何とかできたのですが、それは避けてrubyだけにしたいです。それを行う簡単な方法はありますか?

前もって感謝します!

4

1 に答える 1

4

ERB の使用を検討してください。https://ruby-doc.org/stdlib/libdoc/erb/rdoc/ERB.html

これは Ruby の標準ライブラリーに組み込まれており、まさにあなたが望むことを実行します。

于 2012-11-10T17:17:19.403 に答える