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 відбуваютсья такі дії:

  1. Створюється конфіг для apache в каталозі sites-available та сімлінк в sites-enabled.
  2. Створюється конфіг для nginx в каталозі sites-available та сімлінк в sites-enabled.
  3. Додаються записи про нову зону myhost.loc та файл зони в конфіги bind.
  4. Створюються необхідні каталоги проекту (htdocs, log).
  5. Створюється БД myhost, та користувач myhost з повними правами на базу (пароль рендомний).
  6. У каталог проекту записується файл info.txt з даними для доступу до БД.
  7. Перезавантажуються apache, nginx, bind.
Теги: , , , , ,
08.12.2011 13:16 Автор: Strange_V Хіти: 533

Коментарів 2

Напишіть відгук