GNU/Linux → Автоматичне додавання нового хоста на web сервер
У попередній нотатці обіцяв написати про скріпт автоматичного додавання хоста в конфіги nginx, apache, bind9, створення БД та дерева каталогів проекту, так і роблю.
Нижче наведена перша версія скріпта, написана аби лише працювало. Скріпт практично не містить ніяких перевірок, надалі планую допрацювати.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os
import MySQLdb, MySQLdb.cursors
import string, random
# Apache
apache_available = "/etc/apache2/sites-available"
apache_enabled = "/etc/apache2/sites-enabled"
# Nginx
nginx_available = "/etc/nginx/sites-available"
nginx_enabled = "/etc/nginx/sites-enabled"
# BIND
bind_zones = "/etc/bind/named.conf.my-zones"
bind_master = "/etc/bind/master"
# Files
www_data = "/var/www"
# MySQL
mysql_host = "localhost"
mysql_user = "user"
mysql_pass = "password"
# Server
ip = "192.168.0.1"
user_group = "user:user"
if len(sys.argv) < 2:
sys.exit()
host = sys.argv[1]
www_path = os.path.join(www_data, host)
def randstring(n):
a = string.ascii_letters + string.digits
return ''.join([ random.choice(a) for i in range(n) ])
# Apache
apache_str = """
ServerName %s
ServerAlias %s *.%s
ServerAdmin webmaster@localhost
DocumentRoot %s/htdocs
Options FollowSymLinks
AllowOverride All
CustomLog %s/log/access.log combined
ErrorLog %s/log/error.log
"""
f = open(os.path.join(apache_available, host), "w")
f.write(apache_str % (host, host, host, www_path, www_path, www_path))
f.close()
if ( not os.path.exists(os.path.join(apache_enabled, host)) ):
os.symlink(os.path.join(apache_available, host), os.path.join(apache_enabled, host))
# Nginx
nginx_str = """server {
server_name %s www.%s;
access_log %s/log/nginx_access.log;
error_log %s/log/nginx_error.log;
include /etc/nginx/server.cfg;
}
"""
f = open(os.path.join(nginx_available, host), "w")
f.write(nginx_str % (host, host, www_path, www_path))
f.close()
if ( not os.path.exists(os.path.join(nginx_enabled, host)) ):
os.symlink(os.path.join(nginx_available, host), os.path.join(nginx_enabled, host))
# BIND
bind_zstr = """zone "%s" {
type master;
file "master/%s";
};
"""
bind_str = """$ORIGIN %s.
$TTL 86400 ; 1 day
@ IN SOA localhost. root.localhost. (
2008041501 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS localhost.
@ IN A %s
www IN CNAME %s.
"""
f = open(bind_zones, "a")
f.write(bind_zstr % (host, host))
f.close()
f = open(os.path.join(bind_master, host), "w")
f.write(bind_str % (host, ip, host))
f.close()
os.system("chown -R bind:bind " + os.path.join(bind_master, host))
# Files
os.system("mkdir -p " + www_path + "/htdocs")
os.system("mkdir -p " + www_path + "/log")
# MySQL
mysql_user_new = host[0:host.find(".")]
mysql_pass_new = randstring(10)
db = MySQLdb.connect (
host = mysql_host,
user = mysql_user,
passwd = mysql_pass,
cursorclass=MySQLdb.cursors.DictCursor,
charset = "utf8",
use_unicode = True
)
cursor = db.cursor ()
cursor.execute("CREATE DATABASE IF NOT EXISTS " + mysql_user_new + ";")
cursor.execute("GRANT ALL PRIVILEGES ON " + mysql_user_new + ".* TO '"
+ mysql_user_new + "'@'%' IDENTIFIED BY '" + mysql_pass_new
+ "' WITH GRANT OPTION;")
f = open(os.path.join(www_path, "info.txt"), "w")
info_str = """mysql db: %s
mysql_user: %s
mysql_pass: %s
"""
f.write(info_str % (mysql_user_new, mysql_user_new, mysql_pass_new))
f.close()
# Files
os.system("chown -R " + user_group + " "+www_path)
os.system("/etc/init.d/apache2 restart")
os.system("/etc/init.d/nginx restart")
os.system("/usr/sbin/rndc reload")
Після запуску ./addhost.py myhost.loc відбуваютсья такі дії:
- Створюється конфіг для apache в каталозі sites-available та сімлінк в sites-enabled.
- Створюється конфіг для nginx в каталозі sites-available та сімлінк в sites-enabled.
- Додаються записи про нову зону myhost.loc та файл зони в конфіги bind.
- Створюються необхідні каталоги проекту (htdocs, log).
- Створюється БД myhost, та користувач myhost з повними правами на базу (пароль рендомний).
- У каталог проекту записується файл info.txt з даними для доступу до БД.
- Перезавантажуються apache, nginx, bind.
08.12.2011 13:16
Автор: Strange_V
Хіти: 90
Коментарів 2

Добрий скрипт, планую на bash подібний накидати, але постійно відкладаю, – webmin наше всьо
Та я теж дуже довго відкладав =))
Webmin щось не юзаю)