ajenti是Web方式的服务器管理平台,包含一系列常用运维工具,例如文件操作、服务管理、流量/磁盘空间实时监控等。这些工具本身倒是没什么亮点,我自己都写过。使用ajenti主要因为它是Python写的,修改扩展非常简单,我给它加了几个插件,省掉许多以前需要ssh连服务器进行操作。其次是它的界面交互做得不错,非专业人员也能使用,如果以后有多人管理的需求也能用上。本文分享安装和插件制作的步骤。
Install
ajenti支持Ubuntu、Debian、REHL、CentOS、FreeBSD这5种Linux发行版,我是在两台Ubuntu和一台FreeBSD上安装的,流程都很简单,以Ubuntu为例:
$ sudo add-key key # 如果提示找不到命令,请使用 sudo apt-key add key
$ sudo echo “deb http://repo.ajenti.org/ng/debian main main ubuntu” >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install ajenti
$ sudo service ajenti restart
Stopping Ajenti:
* not running
Starting Ajenti:
* started
用浏览器打开:https://127.0.0.1:8000 (证书根据需要设置)就能看到ajenti的界面了:
Plugin
例如这台服务器的8001/8002端口上都有站点,我希望打开ajenti时能看到这些站点是否正常,所以制作一个名为monitor的插件,返回这两个站点的状态码。
ajenti的插件目录是/var/lib/ajenti/plugins/,目录结构自然是跟Python其他包一样,需要包含__init__.py文件。插件主要逻辑一般是写在main.py里,用xml文件定义布局,静态文件放在content目录下,因此基本的插件目录结构如下:
├── content/
├── layout/
│ ├── main.xml
│ └── widget.xml
├── __init__.py
├── widget.py
└── main.py
content文件本例中不会用到,只介绍其他文件。首先是__init__.py文件,主要用来申明插件的名称、图标、依赖等信息。
from ajenti.api import *
from ajenti.plugins import *
info = PluginInfo(
title='Monitor',
icon='desktop',
dependencies=[
PluginDependency('main'),
],
)
def init():
import main
import widget
然后是layout/main.xml文件,定义界面,包括Site1(8001端口的站点)/Site2(8002端口的站点)状态码如何显示。本例中,Site1是加载时直接显示,Site2是点击按钮后显示:
<body>
<pad>
<vc>
<formline text="Site 1">
<label id="site1"/>
</formline>
<formline text="Site 2">
<label id="site2"/>
<button icon="refresh" id="load" text="Load" />
</formline>
</vc>
</pad>
</body>
最后是main.py文件,用Python自带的库请求Site1/Site2,返回状态码:
from ajenti.api import plugin
from ajenti.plugins.main.api import SectionPlugin
from ajenti.ui import on
import urllib2
@plugin
class Monitor (SectionPlugin):
# 获取状态码
@staticmethod
def status_code(port):
connection = urllib2.urlopen('http://127.0.0.1:%d' % port)
status_code = connection.getcode()
connection.close()
return str(status_code)
def init(self):
# 以下定义会在左侧导航菜单显示
self.title = 'Monitor'
self.icon = 'desktop'
self.category = 'Custom'
self.append(self.ui.inflate('monitor:main'))
# 加载时显示Site1的状态码
self.find('site1').text = self.status_code(8001)
# 点击load按钮时显示Site2的状态码
@on('load', 'click')
def on_load(self):
self.find('site2').text = self.status_code(8002)
Widget
Dashboard里可以添加插件附带的Widget(点击右上方的“添加小部件”按钮弹出列表),把一些常用操作/信息放在Dashboard,省掉了点导航菜单的操作。上面的代码在__init__.py文件里import了widget,也创建了widget.xml和widget.py文件,用来实现一个很简单的Widget,以下是代码:
<hc>
<box width="20">
<icon id="icon" icon="monitor" />
</box>
<box width="100">
<label style="bold" id="site1"/>
</box>
</hc>
from ajenti.api import plugin
from ajenti.plugins.dashboard.api import ConfigurableWidget
import main
@plugin
class MonitorWidget (ConfigurableWidget):
name = 'Monitor'
icon = 'desktop'
def on_prepare(self):
self.append(self.ui.inflate('monitor:widget'))
def on_start(self):
status_code = main.Monitor.status_code(8001)
self.find('site1').text = 'Site on port 8001 return %s' % status_code
Afterword
ajenti在github的repo地址是:https://github.com/Eugeny/ajenti ,开发插件时主要是参考源码。
相比同类产品来说,ajenti很突出:界面交互上比webmin好太多,免费开源,又把Cpanel和DA比下去了。没找到它具体的授权协议,但对于个人用户是“Completely free”,目前是可以放心使用的。硬件提供商需要申请“Special licensing conditions apply”,想省钱就请期待山寨产品出现吧。
我一直在想我的服务器内存太小了,想跑好多东西都很无奈……不知有什么好办法
换机器… 加内存… 改内核关掉所有不需要的服务包括防火墙等安全装置(不推荐)…
vps不好加内存啊,毕竟不是实体的服务器……当初改内核就是加上了防火墙…………感觉除了换vps没有啥好方法了……
是的= = BTW:这里有便宜货 https://www.digitalocean.com/
现在的和这个差不多…2G的24刀每月
要不找几个技术宅合租,弄台强大的
是个好主意啊