Pages

2011/03/31

Nginx用の a2ensite, a2dissite がないのでツールを作る

最近ChefのCookbookを触っているが、Rubyをちゃんと読めるほうが都合がよいので練習がてら。

ubuntuなどのdeb系はapache httpdのサイト管理がよく作られており、サイト単位の有効無効を a2ensite, a2dissiteというツールで切り替えるように工夫がされています。

Nginxでもコマンドでサイト管理やりたいなあと思い作成。
 



使い方


3つのメソッド(サブコマンド)を持ちます、オプションなしでたたくと一応使い方を出すようにしました。


  • list:sites-available にあるコンフィグファイルをリストアップ。
    現在有効なものは+(プラス)を、無効なサイトは-(マイナス)を付与して表示。

  • enable {configfile}:sites-enabled にリンクを作成してnginxをリロード。

  • disable {configfile}:sites-enabled からリンクを削除してnginxをリロード。


 


コマンド例


ngsitectl.rb disable default

とか

ngctlにエイリアスして
ngctl enable example.com

このようにします。


リストはこんな感じで出します。
# ngctl list
- example.com
+ 8082
+ rprox.conf
+ 8081
- default
+ 8083
+ ssl_rprox.conf




リロードがいやな人はコメントアウトしたりgracefulに相当する手続きがあるのでそれを変わりに仕込みましょう。
この辺は改良の余地が大きいですね。
 

コード


自分でつかうのでGithubにも置いてます。
https://github.com/sawanoboly/optools/blob/master/ngsitectl.rb
うちはハイライトしてないからGithubのほうが見やすいですね。

そうそう、1.9.2 p180 で作っているので他のVerについては動くか見てないです。

ngsitectl.rb
#!/usr/bin/env ruby
# encording: utf-8

## Const
AvailDir = "/etc/nginx/sites-available/"
EnableDir = "/etc/nginx/sites-enabled/"


# list up all site and add "+" for enable sites.
def list(sitename)
sitesall = Dir.entries(AvailDir)

# exclude dots
sites = sitesall.select{|elem| elem != "." and elem !=".."}

# enabled sites check.
sites.each do |site|
if File.exist?(EnableDir + site) then
puts "+ " + site
else
puts "- " + site
# File.symlink(AvailDir + site, EnableDir + site)
end
end
end

def enable(sitename)
if File.exist?(EnableDir + sitename) then
puts "Site:" + sitename + " is already enabled.\nDo nothing."
elsif File.exist?(AvailDir + sitename) then
puts "enable: " + sitename
File.symlink(AvailDir + sitename, EnableDir + sitename)
puts `/etc/init.d/nginx reload`
else
puts "Site:" + sitename + " Config not found."
end
list(sitename)
end

def disable(sitename)
if File.exist?(AvailDir + sitename) then
if File.exist?(EnableDir + sitename) then
puts "disable: " + sitename
File.unlink(EnableDir + sitename)
puts `/etc/init.d/nginx reload`
else
puts "Site:" + sitename + " is already disabled.\nDo nothing."
end
else
puts "Site:" + sitename + " Config not found."
end
list(sitename)
end


begin
method(ARGV[0]).call(ARGV[1])
rescue TypeError => ex then
puts <<"HEREDOCS"
Nginx site control script.
Usage:
list: list all available sites
enable {sitename}: enable site and reload nginx
disable {sitename}: disable site and reload nginx
HEREDOCS
rescue => ex
puts "Exception " + "#{ex.class}"
puts "#{ex.message}"
puts
puts <<"HEREDOCS"
Nginx site control script.
Usage:
list: list all available sites
enable {sitename}: enable site and reload nginx
disable {sitename}: disable site and reload nginx
HEREDOCS
end

0 件のコメント:

コメントを投稿