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
Хіти: 533
Коментарів 2
Напишіть відгук
Ви мусите увійти, щоби коментувати.
Добрий скрипт, планую на bash подібний накидати, але постійно відкладаю, – webmin наше всьо 🙂
Та я теж дуже довго відкладав =))
Webmin щось не юзаю)