Flask ImportError: No module named XXX问题解决

koyo 发表了文章 • 0 个评论 • 1488 次浏览 • 2015-09-28 19:59 • 来自相关话题

第一个flask项目,做一个简单的网址导航。部署项目后,浏览器访问报500错误。查看apache日志后,报错如下:
[Tue Jan 06 09:58:22 2015] [error] hello world
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] mod_wsgi (pid=31615): Target WSGI script '/var/www/qianshan/qianshan.wsgi' cannot be loaded as Python module.
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] mod_wsgi (pid=31615): Exception occurred processing WSGI script '/var/www/qianshan/qianshan.wsgi'.
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] Traceback (most recent call last):
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] File "/var/www/qianshan/qianshan.wsgi", line 12, in <module>
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] from qianshan import app as application
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] File "/var/www/qianshan/__init__.py", line 4, in <module>
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] import extras
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] ImportError: No module named extras项目结构
qianshan
├── config.ini
├── extraModules.py
├── extras.py
├── __init__.py
├── qianshan.wsgi
├── static
├── templates
├── test.py
└── venvinit.py代码
from flask import Flask
from flask import render_template
import extraModules
import extras#如果没有这句无报错正常运行,只有一些静态资源没拉到,可能是其他问题
import ConfigParser
import codecs
import logging

logging.basicConfig(filename='qianshan.log', level=logging.INFO)
logging.info('Started')

app = Flask(__name__)

logging.info('App established')

@app.route("/")
def index():
return render_template('index.html')extras.py是实际我想要导入的模块,里面有两个我需要的类;extraModules是测试模块,import extraModules是成功的,apache日志的第一行也打出来了;他们的代码分别如下:
# Filename : extras.py

class Block:
def setNo(self, no):
self.no = int(no)
def getNo(self):
return self.no
def setName(self, name):
self.name = name
def getName(self):
return self.name
def setPriority(self, priority):
self.priority = int(priority)
def getPriority(self):
return self.priority
def setHotKeyAsc(self, hotKeyAsc):
self.hotKeyAsc = hotKeyAsc
def getHotKeyAsc(self):
return self.hotKeyAsc
def setElement(self, equation):
s = equation.split(':')
if(s[0] == 'no'):
self.setNo(s[1])
elif(s[0] == 'name'):
self.setName(s[1])
elif(s[0] == 'priority'):
self.setPriority(s[1])
elif(s[0] == 'hot_key_asc'):
self.setHotKeyAsc(s[1])

class Website:
def setNo(self, no):
self.no = int(no)
def getNo(self):
return self.no
def setName(self, name):
self.name = name
def getName(self):
return self.name
def setUrl(self, url):
self.url = url
def getUrl(self):
return self.url
def setIcon(self, icon):
self.icon = icon
def getIcon(self):
return self.icon
def setBlockNo(self, blockNo):
self.blockNo = int(blockNo)
def setPriority(self, priority):
self.priority = int(priority)
def getPriority(self):
return self.priority
def setHotKeyAsc(self, hotKeyAsc):
self.hotKeyAsc = hotKeyAsc
def getHotKeyAsc(self):
return self.hotKeyAsc
def setElement(self, equation):
s = equation.split(':')
if(s[0] == 'no'):
self.setNo(s[1])
elif(s[0] == 'name'):
self.setName(s[1])
elif(s[0] == 'url'):
self.setUrl(s[1])
elif(s[0] == 'icon'):
self.setIcon(s[1])
elif(s[0] == 'priority'):
self.setPriority(s[1])
elif(s[0] == 'hot_key_asc'):
self.setHotKeyAsc(s[1])

if __name__ == '__main__':
block = Block()
website = Website()extraModules.py代码如下:
# Filename : extraModules.py
print 'hello world'其他背景信息:
项目部署在digital ocean的ubuntu12.x主机上,python版本2.7.3.

还请指导下,是不是extras.py有什么地方大意了,小弟新学python不久,请多敲打点拨

谢谢1L和2L前辈的指点啊!白天一直在上课,以下为1月7日晚更新,我把wsgi以及virtual host的配置也发一下,wsgi中是有配置/var/www/qianshan/为sys.path的。

qianshan.wsgi如下:
#!/usr/bin/python
activate_this = '/var/www/qianshan/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,'/var/www/qianshan/')
sys.path.insert(1,'/var/www/')

from qianshan import app as application
application.secret_key = 'Add your secret key'Virtual Host配置:
<VirtualHost *:80>
ServerName qianshan.co
ServerAdmin spark@qianshan.co
WSGIScriptAlias / /var/www/qianshan/qianshan.wsgi
<Directory /var/www/qianshan/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/qianshan/static
<Directory /var/www/qianshan/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>我会按照1L和2L的方法试试,如果不行再在这里说
 
 
问题解决如下:
 
1.首先确认是文件的权限问题。和import的语法无关。
下图中可以看到目前项目根目录下各个文件的权限,otherModules(就是之前的extras)对root所在的用户组没有读权限。
-rwx------ 1 root root 9091 Jan 3 09:27 config.ini
-rwxr--r-- 1 root root 404 Jan 7 22:58 __init__.py
-rwx------ 1 root root 2316 Jan 7 23:07 otherModules.py
-rwxr--r-- 1 root root 360 Jan 5 23:34 qianshan.wsgi
drwxr-xr-x 2 root root 4096 Jan 3 09:08 static
drwxr-xr-x 2 root root 4096 Jan 3 08:51 templates
-rw-r--r-- 1 root root 262 Jan 7 23:05 testModule.py
-rwx------ 1 root root 1716 Jan 3 09:36 test.py
drwxr-xr-x 6 root root 4096 Jan 3 08:05 venvchmod调整权限后,权限如下,项目可以正常访问,不再报错
-rwxr--r-- 1 root root 9091 Jan 3 09:27 config.ini
-rwxr--r-- 1 root root 404 Jan 7 22:58 __init__.py
-rwxr--r-- 1 root root 2316 Jan 7 23:07 otherModules.py
-rwxr--r-- 1 root root 360 Jan 5 23:34 qianshan.wsgi
drwxrwxr-x 2 root root 4096 Jan 3 09:08 static
drwxrwxr-x 2 root root 4096 Jan 3 08:51 templates
-rw-r--r-- 1 root root 262 Jan 7 23:05 testModule.py
-rwxr--r-- 1 root root 1716 Jan 3 09:36 test.py
drwxr-xr-x 6 root root 4096 Jan 3 08:05 venv大体过程就这样!
原文地址:分享原文 查看全部
第一个flask项目,做一个简单的网址导航。部署项目后,浏览器访问报500错误。查看apache日志后,报错如下:
[Tue Jan 06 09:58:22 2015] [error] hello world
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] mod_wsgi (pid=31615): Target WSGI script '/var/www/qianshan/qianshan.wsgi' cannot be loaded as Python module.
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] mod_wsgi (pid=31615): Exception occurred processing WSGI script '/var/www/qianshan/qianshan.wsgi'.
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] Traceback (most recent call last):
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] File "/var/www/qianshan/qianshan.wsgi", line 12, in <module>
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] from qianshan import app as application
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] File "/var/www/qianshan/__init__.py", line 4, in <module>
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] import extras
[Tue Jan 06 09:58:22 2015] [error] [client 112.64.71.131] ImportError: No module named extras
项目结构
qianshan
├── config.ini
├── extraModules.py
├── extras.py
├── __init__.py
├── qianshan.wsgi
├── static
├── templates
├── test.py
└── venv
init.py代码
from flask import Flask
from flask import render_template
import extraModules
import extras#如果没有这句无报错正常运行,只有一些静态资源没拉到,可能是其他问题
import ConfigParser
import codecs
import logging

logging.basicConfig(filename='qianshan.log', level=logging.INFO)
logging.info('Started')

app = Flask(__name__)

logging.info('App established')

@app.route("/")
def index():
return render_template('index.html')
extras.py是实际我想要导入的模块,里面有两个我需要的类;extraModules是测试模块,import extraModules是成功的,apache日志的第一行也打出来了;他们的代码分别如下:
# Filename : extras.py

class Block:
def setNo(self, no):
self.no = int(no)
def getNo(self):
return self.no
def setName(self, name):
self.name = name
def getName(self):
return self.name
def setPriority(self, priority):
self.priority = int(priority)
def getPriority(self):
return self.priority
def setHotKeyAsc(self, hotKeyAsc):
self.hotKeyAsc = hotKeyAsc
def getHotKeyAsc(self):
return self.hotKeyAsc
def setElement(self, equation):
s = equation.split(':')
if(s[0] == 'no'):
self.setNo(s[1])
elif(s[0] == 'name'):
self.setName(s[1])
elif(s[0] == 'priority'):
self.setPriority(s[1])
elif(s[0] == 'hot_key_asc'):
self.setHotKeyAsc(s[1])

class Website:
def setNo(self, no):
self.no = int(no)
def getNo(self):
return self.no
def setName(self, name):
self.name = name
def getName(self):
return self.name
def setUrl(self, url):
self.url = url
def getUrl(self):
return self.url
def setIcon(self, icon):
self.icon = icon
def getIcon(self):
return self.icon
def setBlockNo(self, blockNo):
self.blockNo = int(blockNo)
def setPriority(self, priority):
self.priority = int(priority)
def getPriority(self):
return self.priority
def setHotKeyAsc(self, hotKeyAsc):
self.hotKeyAsc = hotKeyAsc
def getHotKeyAsc(self):
return self.hotKeyAsc
def setElement(self, equation):
s = equation.split(':')
if(s[0] == 'no'):
self.setNo(s[1])
elif(s[0] == 'name'):
self.setName(s[1])
elif(s[0] == 'url'):
self.setUrl(s[1])
elif(s[0] == 'icon'):
self.setIcon(s[1])
elif(s[0] == 'priority'):
self.setPriority(s[1])
elif(s[0] == 'hot_key_asc'):
self.setHotKeyAsc(s[1])

if __name__ == '__main__':
block = Block()
website = Website()
extraModules.py代码如下:
# Filename : extraModules.py
print 'hello world'
其他背景信息:
项目部署在digital ocean的ubuntu12.x主机上,python版本2.7.3.

还请指导下,是不是extras.py有什么地方大意了,小弟新学python不久,请多敲打点拨

谢谢1L和2L前辈的指点啊!白天一直在上课,以下为1月7日晚更新,我把wsgi以及virtual host的配置也发一下,wsgi中是有配置/var/www/qianshan/为sys.path的。

qianshan.wsgi如下:
#!/usr/bin/python
activate_this = '/var/www/qianshan/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,'/var/www/qianshan/')
sys.path.insert(1,'/var/www/')

from qianshan import app as application
application.secret_key = 'Add your secret key'
Virtual Host配置:
<VirtualHost *:80>
ServerName qianshan.co
ServerAdmin spark@qianshan.co
WSGIScriptAlias / /var/www/qianshan/qianshan.wsgi
<Directory /var/www/qianshan/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/qianshan/static
<Directory /var/www/qianshan/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我会按照1L和2L的方法试试,如果不行再在这里说
 
 
问题解决如下:
 
1.首先确认是文件的权限问题。和import的语法无关。
下图中可以看到目前项目根目录下各个文件的权限,otherModules(就是之前的extras)对root所在的用户组没有读权限。
-rwx------ 1 root root 9091 Jan  3 09:27 config.ini
-rwxr--r-- 1 root root 404 Jan 7 22:58 __init__.py
-rwx------ 1 root root 2316 Jan 7 23:07 otherModules.py
-rwxr--r-- 1 root root 360 Jan 5 23:34 qianshan.wsgi
drwxr-xr-x 2 root root 4096 Jan 3 09:08 static
drwxr-xr-x 2 root root 4096 Jan 3 08:51 templates
-rw-r--r-- 1 root root 262 Jan 7 23:05 testModule.py
-rwx------ 1 root root 1716 Jan 3 09:36 test.py
drwxr-xr-x 6 root root 4096 Jan 3 08:05 venv
chmod调整权限后,权限如下,项目可以正常访问,不再报错
-rwxr--r-- 1 root root 9091 Jan  3 09:27 config.ini
-rwxr--r-- 1 root root 404 Jan 7 22:58 __init__.py
-rwxr--r-- 1 root root 2316 Jan 7 23:07 otherModules.py
-rwxr--r-- 1 root root 360 Jan 5 23:34 qianshan.wsgi
drwxrwxr-x 2 root root 4096 Jan 3 09:08 static
drwxrwxr-x 2 root root 4096 Jan 3 08:51 templates
-rw-r--r-- 1 root root 262 Jan 7 23:05 testModule.py
-rwxr--r-- 1 root root 1716 Jan 3 09:36 test.py
drwxr-xr-x 6 root root 4096 Jan 3 08:05 venv
大体过程就这样!
原文地址:分享原文

php不重新编译添加模块

采菊篱下 发表了文章 • 0 个评论 • 1065 次浏览 • 2015-09-27 23:58 • 来自相关话题

php如何使用第三方软件

本例是: php(mysql_connect()函数)使用mysql(第三方软件).




观察上图,php能使用大量的第三方非php库(典型性是C语言写库), 为了达到此目的,你必须具备两个条件:条件I. 安装第三方库(软件)
条件II. 安装了该软件的php扩展如果只是安装mysql,满足条件I,但是条件II不满足, 为了满足条件二, 我们需要了解php安装扩展的知识.

安装php, 大的方面还可以分为两种方式:方式1. 将扩展编译到php
方式2. 将扩展单独编译成动态连接库so文件

方式1的优点是运行速度快,但是为了一个扩展需要重新安装整个php
方式2灵活,但是运行速度稍慢.
windows平台下的php程序员大多只熟悉方式2,因为方式2是windows下安装Php扩展的唯一方式.之前如果安装了php, 如果没有删除php源码目录,重新进入该目录, 那么此时重新编译运行将采用增量方式,实际上比方式2还更方便些,永远的三步曲:./configure --prefix=/usr/local/php --with-mysql
make
make install有人质疑:
我安装mysql sdk,./configure命令一个–with-mysql就知道我安装的目录,还是有点神奇,难道他全硬盘搜索.h文件? 不是, 如果你用yum方式安装sdk,那么LD_LIBRARY_PATH系统变量就指示了该sdk相关信息 ,如果你使用源码(tar)安装mysql sdk,你的–with-mysql参数不得不像这样: –with-mysql=/your_mysql_sdk_dir/ 来指定了。
 
方式2:
以添加ftp模块为例子:进入源码目录
#cd php-5.2.8/ext/ftp
运行phpize configure
#/usr/local/php/bin/phpize
编译,指定php-config,留意这里的php-config,不是php.ini
#./configure --with-php-config='/usr/local/php/bin/php-config'
#上面可以添加--enable-ftp,也可以不添加
编译安装
(留意:假如之前有过添加其他模块肯定 要先 make clean ,不然 编译报错。)
#make && make install
生成一个目录来存放扩展的模块
#mkdir /usr/local/php/etc/php/ext
复制ftp.so到模块目次
#cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ftp.so /usr/local/php/etc/ext/
编辑 php.ini文件,指定PHP到哪个目次读模块
#vi /usr/local/php/etc/php.ini
#extension_dir="/usr/local/php/etc/ext"
Load模块
#extension=ftp.so
#保存退出

重启apache,或者其他web服务器
再用/usr/local/php/bin/php -m|grep ftp #验证是否有ftp.so 查看全部


php如何使用第三方软件


本例是: php(mysql_connect()函数)使用mysql(第三方软件).
pload.png

观察上图,php能使用大量的第三方非php库(典型性是C语言写库), 为了达到此目的,你必须具备两个条件:
条件I. 安装第三方库(软件) 
条件II. 安装了该软件的php扩展
如果只是安装mysql,满足条件I,但是条件II不满足, 为了满足条件二, 我们需要了解php安装扩展的知识.

安装php, 大的方面还可以分为两种方式:
方式1. 将扩展编译到php 
方式2. 将扩展单独编译成动态连接库so文件

方式1的优点是运行速度快,但是为了一个扩展需要重新安装整个php
方式2灵活,但是运行速度稍慢.
windows平台下的php程序员大多只熟悉方式2,因为方式2是windows下安装Php扩展的唯一方式.
之前如果安装了php, 如果没有删除php源码目录,重新进入该目录, 那么此时重新编译运行将采用增量方式,实际上比方式2还更方便些,永远的三步曲:
./configure --prefix=/usr/local/php --with-mysql 
make
make install
有人质疑:
我安装mysql sdk,./configure命令一个–with-mysql就知道我安装的目录,还是有点神奇,难道他全硬盘搜索.h文件? 不是, 如果你用yum方式安装sdk,那么LD_LIBRARY_PATH系统变量就指示了该sdk相关信息 ,如果你使用源码(tar)安装mysql sdk,你的–with-mysql参数不得不像这样: –with-mysql=/your_mysql_sdk_dir/ 来指定了。
 
方式2:
以添加ftp模块为例子:
进入源码目录
#cd php-5.2.8/ext/ftp
运行phpize configure
#/usr/local/php/bin/phpize
编译,指定php-config,留意这里的php-config,不是php.ini
#./configure --with-php-config='/usr/local/php/bin/php-config'
#上面可以添加--enable-ftp,也可以不添加
编译安装
(留意:假如之前有过添加其他模块肯定 要先 make clean ,不然 编译报错。)
#make && make install
生成一个目录来存放扩展的模块
#mkdir /usr/local/php/etc/php/ext
复制ftp.so到模块目次
#cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ftp.so /usr/local/php/etc/ext/
编辑 php.ini文件,指定PHP到哪个目次读模块
#vi /usr/local/php/etc/php.ini
#extension_dir="/usr/local/php/etc/ext"
Load模块
#extension=ftp.so
#保存退出

重启apache,或者其他web服务器
再用/usr/local/php/bin/php -m|grep ftp #验证是否有ftp.so

Ansible工作原理(2)

采菊篱下 发表了文章 • 0 个评论 • 1285 次浏览 • 2015-09-27 10:39 • 来自相关话题

HOW ANSIBLE WORKS

1.有效的体系结构
Ansible作品通过连接节点和推出小程序,称为“Ansible模块”。这些程序都写资源模型系统的所期望的状态。Ansible然后执行这些模块通过SSH(默认情况下),并完成后删除它们。

你的库的模块可以驻留在任何机器上,并且没有服务器守护进程,或数据库。通常你会使用你最喜欢的终端程序,一个文本编辑器,可能版本控制系统来跟踪你的内容的变化。

你的朋友SSH KEYS

支持密码,但SSH keys with key-agent使用Ansible是最好的方法之一。但如果您想要使用Kerberos,不错。很多选择!root不需要登录,您可以登录任何用户,然后su或sudo任何用户。

Ansible“authorized_key”模块是一个伟大的方式使用Ansible控制什么机器可以访问主机。其他选项,如kerberos或身份管理系统,也可以使用。
ssh-agent bash
ssh-add ~/.ssh/id_rsa管理你的主机在简单的文本文件中

默认情况下,Ansible代表什么机器使用一个非常简单的INI文件管理,管理你所有的机器组自己的选择。

添加新的机器,没有额外的SSL签名服务器的参与,所以没有任何麻烦决定为什么一个特定的机器没能联系起来,由于模糊的NTP或DNS问题。

如果在你的基础设施有一个真理的来源,也可以,用插件,如图库存,组,和来自像EC2,Rackspace,OpenStack变量的信息,或者更多。

下面是一个纯文本文件清单:
[webservers]
www1.example.com
www2.example.com

[dbservers]
db0.example.com
db1.example.com一旦库存列出主机变量可以分配给他们在简单的文本文件(子目录称为“group_vars /”或“host_vars /”或直接在库存文件。

或者,正如前面提到的,使用一个动态库存,库存等数据源EC2,Rackspace,或者OpenStack。
2.基础知识:使用ANSIBLE特设并行任务执行
一旦你有了一个实例,你可以谈论它,没有任何额外的设置:
ansible all -m ping
ansible foo.example.com -m yum "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"请注意,我们已经访问原始状态的资源模块以及运行命令。这些模块是非常容易编写和Ansible ships with a fleet of them的大部分工作已经完成。

Ansible包含一个巨大的工具箱构建模块,超过200个。Module: http://docs.ansible.com/modules_by_category.html

Playbooks:一个简单+强大的自动化语言

Playbooks可以精心编排多个片基础设施拓扑,和非常详细的控制有多少机器来解决。这是Ansible开始变得最有趣的地方。

Ansible编排的方法是一个良好的简单,因为我们相信你的自动化代码应该完美的意义,应该有很少记住关于特殊的语法或特性。

这是一个Playbooks是什么样子的。作为一个提醒,这只是这里的宣传片,跳在docs.ansible.com的完整的文档和所有可能的。
---
[list]
[*]hosts: webservers[/*]
[/list] serial: 5 # update 5 machines at a time
roles:
- common
- webapp


[list]
[*]hosts: content_servers[/*]
[/list] roles:
- common
- contentAN EXAMPLE app_config.yml MIGHT LOOK LIKE:
---
[list]
[*]yum: name= state=installed[/*]
[/list] with_items:
- app_server
- acme_software

[list]
[*]service: name=app_server state=running enabled=yes[/*]
[/list]
[list]
[*]template: src=/opt/code/templates/foo.j2 dest=/etc/foo.conf[/*]
[/list] notify:
- restart app serverThe Ansible doc explores this in much greater depth. There’s a LOT more that you can do, including:
Ansible文档探索在更大的深度。还有很多,你可以做的,包括:
[]机器的负载平衡器和监控窗口[/][]有一个服务器知道所有其他人的IP地址使用事实收集关于这些特定的服务器,使用这些动态构建配置文件[/][]设置一些变量和其他提示,当他们没有设置默认值[/][]使用一个命令的结果决定是否运行另一个[/]
有很多先进的可能性但很容易开始最重要的是,语言仍是可读的、透明的,你从来没有声明明确的订购关系或编程语言编写代码。

EXTEND ANSIBLE: MODULES, PLUGINS and API

Should you want to write your own, Ansible modules can be written in any language that can return JSON (Ruby, Python, bash, etc). Inventory can also plug in to any datasource by writing a program that speaks to that datasource and returns JSON. There’s also various Python APIs for extending Ansible’s connection types (SSH is not the only transport possible), callbacks (how Ansible logs, etc), and even for adding new server side behaviors.

延长ANSIBLE:模块、插件和API

如果你想写自己的,Ansible模块可以用任何语言编写,可以返回JSON(Ruby、Python、bash等)。库存也可以插入到任何数据源通过编写一个程序,说到数据源并返回JSON。还有各种Python api扩展Ansible的连接类型(SSH可能不是唯一的运输),回调(如何Ansible日志等),甚至添加新的服务器端行为。

翻译原文:http://www.ansible.com/how-ansible-works 查看全部


HOW ANSIBLE WORKS


1.有效的体系结构
Ansible作品通过连接节点和推出小程序,称为“Ansible模块”。这些程序都写资源模型系统的所期望的状态。Ansible然后执行这些模块通过SSH(默认情况下),并完成后删除它们。

你的库的模块可以驻留在任何机器上,并且没有服务器守护进程,或数据库。通常你会使用你最喜欢的终端程序,一个文本编辑器,可能版本控制系统来跟踪你的内容的变化。

你的朋友SSH KEYS

支持密码,但SSH keys with key-agent使用Ansible是最好的方法之一。但如果您想要使用Kerberos,不错。很多选择!root不需要登录,您可以登录任何用户,然后su或sudo任何用户。

Ansible“authorized_key”模块是一个伟大的方式使用Ansible控制什么机器可以访问主机。其他选项,如kerberos或身份管理系统,也可以使用。
ssh-agent bash
ssh-add ~/.ssh/id_rsa
管理你的主机在简单的文本文件中

默认情况下,Ansible代表什么机器使用一个非常简单的INI文件管理,管理你所有的机器组自己的选择。

添加新的机器,没有额外的SSL签名服务器的参与,所以没有任何麻烦决定为什么一个特定的机器没能联系起来,由于模糊的NTP或DNS问题。

如果在你的基础设施有一个真理的来源,也可以,用插件,如图库存,组,和来自像EC2,Rackspace,OpenStack变量的信息,或者更多。

下面是一个纯文本文件清单:
    [webservers]
www1.example.com
www2.example.com

[dbservers]
db0.example.com
db1.example.com
一旦库存列出主机变量可以分配给他们在简单的文本文件(子目录称为“group_vars /”或“host_vars /”或直接在库存文件。

或者,正如前面提到的,使用一个动态库存,库存等数据源EC2,Rackspace,或者OpenStack。
2.基础知识:使用ANSIBLE特设并行任务执行
一旦你有了一个实例,你可以谈论它,没有任何额外的设置:
ansible all -m ping 
ansible foo.example.com -m yum "name=httpd state=installed"
ansible foo.example.com -a "/usr/sbin/reboot"
请注意,我们已经访问原始状态的资源模块以及运行命令。这些模块是非常容易编写和Ansible ships with a fleet of them的大部分工作已经完成。

Ansible包含一个巨大的工具箱构建模块,超过200个。Module: http://docs.ansible.com/modules_by_category.html

Playbooks:一个简单+强大的自动化语言

Playbooks可以精心编排多个片基础设施拓扑,和非常详细的控制有多少机器来解决。这是Ansible开始变得最有趣的地方。

Ansible编排的方法是一个良好的简单,因为我们相信你的自动化代码应该完美的意义,应该有很少记住关于特殊的语法或特性。

这是一个Playbooks是什么样子的。作为一个提醒,这只是这里的宣传片,跳在docs.ansible.com的完整的文档和所有可能的。
---
[list]
[*]hosts: webservers[/*]
[/list] serial: 5 # update 5 machines at a time
roles:
- common
- webapp


[list]
[*]hosts: content_servers[/*]
[/list] roles:
- common
- content
AN EXAMPLE app_config.yml MIGHT LOOK LIKE:
---
[list]
[*]yum: name= state=installed[/*]
[/list] with_items:
- app_server
- acme_software

[list]
[*]service: name=app_server state=running enabled=yes[/*]
[/list]
[list]
[*]template: src=/opt/code/templates/foo.j2 dest=/etc/foo.conf[/*]
[/list] notify:
- restart app server
The Ansible doc explores this in much greater depth. There’s a LOT more that you can do, including:
Ansible文档探索在更大的深度。还有很多,你可以做的,包括:
    []机器的负载平衡器和监控窗口[/][]有一个服务器知道所有其他人的IP地址使用事实收集关于这些特定的服务器,使用这些动态构建配置文件[/][]设置一些变量和其他提示,当他们没有设置默认值[/][]使用一个命令的结果决定是否运行另一个[/]

有很多先进的可能性但很容易开始最重要的是,语言仍是可读的、透明的,你从来没有声明明确的订购关系或编程语言编写代码。

EXTEND ANSIBLE: MODULES, PLUGINS and API

Should you want to write your own, Ansible modules can be written in any language that can return JSON (Ruby, Python, bash, etc). Inventory can also plug in to any datasource by writing a program that speaks to that datasource and returns JSON. There’s also various Python APIs for extending Ansible’s connection types (SSH is not the only transport possible), callbacks (how Ansible logs, etc), and even for adding new server side behaviors.

延长ANSIBLE:模块、插件和API

如果你想写自己的,Ansible模块可以用任何语言编写,可以返回JSON(Ruby、Python、bash等)。库存也可以插入到任何数据源通过编写一个程序,说到数据源并返回JSON。还有各种Python api扩展Ansible的连接类型(SSH可能不是唯一的运输),回调(如何Ansible日志等),甚至添加新的服务器端行为。

翻译原文:http://www.ansible.com/how-ansible-works

Ansible介绍(1)

采菊篱下 发表了文章 • 0 个评论 • 1498 次浏览 • 2015-09-27 10:25 • 来自相关话题

Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。

Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加速插座模式和拉模式选择),和设计语言,人类可审核性的——甚至是那些不熟悉程序。

我们认为简单是所有大小的环境和相关的设计对于忙碌的所有类型的用户——这是否意味着开发人员、系统管理员,发布工程师,经理,无处不在。Ansible适合管理小设置少量的实例以及与许多成千上万的企业环境。

Ansible管理机器以最好的方式。没有一个问题如何升级远程守护进程或无法管理系统的问题因为守护进程是卸载。OpenSSH是最同行评议的开源组件,使用该工具的安全风险大大降低。Ansible是分散的,它依赖于现有的操作系统凭证来控制访问远程机器,如果需要使用Kerberos,它可以很容易地连接LDAP和其他管理系统的集中式身份验证。

Ansible是一个彻底的简单自动化引擎,自动化云配置,配置管理、应用程序部署,intra-service编排,以及许多其他的需求。

被设计为多层部署自第一天,Ansible模型你的IT基础设施,描述如何推动你所有的系统,而不仅仅是管理一个系统。

它使用没有代理,没有额外的自定义安全基础设施,所以很容易部署,最重要的是,它使用一个非常简单的语言(YAML Ansible Playbooks的形式),让你描述你的自动化工作的方式方法简明英语。

我们利用Ansible主要是作为内网服务器的一些管理,因为他用ssh来管理配置,内网同学还是很快速的,外网主要是利用Saltstack,利用消息队列远程通信,我感觉是比Ansible好的。 查看全部
Ansible是一个自动化工具。它可以配置系统,部署软件,编排更高级的任务,比如连续部署或零停机时间滚动更新。

Ansible的目标是最简单和最易用。它也有一个强烈关注安全性和可靠性,以最少的移动部件,使用OpenSSH运输(加速插座模式和拉模式选择),和设计语言,人类可审核性的——甚至是那些不熟悉程序。

我们认为简单是所有大小的环境和相关的设计对于忙碌的所有类型的用户——这是否意味着开发人员、系统管理员,发布工程师,经理,无处不在。Ansible适合管理小设置少量的实例以及与许多成千上万的企业环境。

Ansible管理机器以最好的方式。没有一个问题如何升级远程守护进程或无法管理系统的问题因为守护进程是卸载。OpenSSH是最同行评议的开源组件,使用该工具的安全风险大大降低。Ansible是分散的,它依赖于现有的操作系统凭证来控制访问远程机器,如果需要使用Kerberos,它可以很容易地连接LDAP和其他管理系统的集中式身份验证。

Ansible是一个彻底的简单自动化引擎,自动化云配置,配置管理、应用程序部署,intra-service编排,以及许多其他的需求。

被设计为多层部署自第一天,Ansible模型你的IT基础设施,描述如何推动你所有的系统,而不仅仅是管理一个系统。

它使用没有代理,没有额外的自定义安全基础设施,所以很容易部署,最重要的是,它使用一个非常简单的语言(YAML Ansible Playbooks的形式),让你描述你的自动化工作的方式方法简明英语。

我们利用Ansible主要是作为内网服务器的一些管理,因为他用ssh来管理配置,内网同学还是很快速的,外网主要是利用Saltstack,利用消息队列远程通信,我感觉是比Ansible好的。

python利用ansible磁盘检测报警

采菊篱下 发表了文章 • 0 个评论 • 1250 次浏览 • 2015-09-24 15:16 • 来自相关话题

简单的利用python调用ansible检测内网服务器磁盘,然后报警,看代码吧,写得有点糙,很多地方都没有考虑异常抛出,和处理,暂时能用就行,The following code:

#!/usr/bin/env python
# encoding: utf-8
#Author: Lucky chen

import datetime,time,traceback
import smtplib,os,re
import threading
from string import join

def sendmail(subject='', msg='', fromaddr='lucky@hadoope.com', toaddrs=):
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
mail_msg = MIMEMultipart()
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
#print mail_msg.as_string()
try:
[size=16]# Intranet mail server[/size]
s = smtplib.SMTP('10.3.8.2')
s.sendmail(fromaddr, toaddrs, mail_msg.as_string())
s.quit()
except:
error_result = traceback.format_exc()
print error_result


def check_sendmail(zn,hn):
#The recipient email
mailto_list=['ronghua@139.com', 'lucky@hadoope.com']
f = '%'
mail_content = "host %s %s zone used gt 95%s" % (hn, zn, f)
sub = "online host Disk usage"
sendmail(subject=sub, msg=mail_content, toaddrs=mailto_list)


def check_result(cmd,hname):
resu = os.popen(cmd).read().strip().split()
#print resu
#To obtain / /data zone Pointer to the location
rnum, dnum = resu.index("/") - 1 , resu.index("/data") - 1
[size=16] get root /data zone % num[/size]
rzone, dzone = int(resu[rnum].split('%')[0]), int(resu[dnum].split('%')[0])
#print type(rzone)
#print rzone,dzone,hname

if rzone > 95:
check_sendmail(zn="/",hn=hname)
if dzone > 95:
check_sendmail(zn='/data',hn=hname)

if __name__=='__main__':
[size=16]ansible host list /etc/ansible/hosts[/size]
host=['web1','web2','db1','db2']
for dest in host:
comm = "ansible %s -m shell -a 'df -h'" % (dest)
#print comm
#check_result(cmd=comm,hname=dest)
s = threading.Thread(target = check_result,args = (comm,dest))
s.start() 查看全部
python.png


简单的利用python调用ansible检测内网服务器磁盘,然后报警,看代码吧,写得有点糙,很多地方都没有考虑异常抛出,和处理,暂时能用就行,The following code:


#!/usr/bin/env python
# encoding: utf-8
#Author: Lucky chen

import datetime,time,traceback
import smtplib,os,re
import threading
from string import join

def sendmail(subject='', msg='', fromaddr='lucky@hadoope.com', toaddrs=):
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
mail_msg = MIMEMultipart()
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
#print mail_msg.as_string()
try:
[size=16]# Intranet mail server[/size]
s = smtplib.SMTP('10.3.8.2')
s.sendmail(fromaddr, toaddrs, mail_msg.as_string())
s.quit()
except:
error_result = traceback.format_exc()
print error_result


def check_sendmail(zn,hn):
#The recipient email
mailto_list=['ronghua@139.com', 'lucky@hadoope.com']
f = '%'
mail_content = "host %s %s zone used gt 95%s" % (hn, zn, f)
sub = "online host Disk usage"
sendmail(subject=sub, msg=mail_content, toaddrs=mailto_list)


def check_result(cmd,hname):
resu = os.popen(cmd).read().strip().split()
#print resu
#To obtain / /data zone Pointer to the location
rnum, dnum = resu.index("/") - 1 , resu.index("/data") - 1
[size=16] get root /data zone % num[/size]
rzone, dzone = int(resu[rnum].split('%')[0]), int(resu[dnum].split('%')[0])
#print type(rzone)
#print rzone,dzone,hname

if rzone > 95:
check_sendmail(zn="/",hn=hname)
if dzone > 95:
check_sendmail(zn='/data',hn=hname)

if __name__=='__main__':
[size=16]ansible host list /etc/ansible/hosts[/size]
host=['web1','web2','db1','db2']
for dest in host:
comm = "ansible %s -m shell -a 'df -h'" % (dest)
#print comm
#check_result(cmd=comm,hname=dest)
s = threading.Thread(target = check_result,args = (comm,dest))
s.start()

Python系统信息模块Psutil介绍

采菊篱下 发表了文章 • 0 个评论 • 3157 次浏览 • 2015-09-23 00:52 • 来自相关话题

   
     psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU 、内存、磁盘、网络等)信息,它主要应用于系统监控,分析和限制系统资源以及进程的管理。它可以实现等同于命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和SunSolaris等操作系统,支持从2.4到3.4的python版本,目前最新版本为2.0.0。
 
    通常我们获取操作系统信息往往采用编写shell脚本来实现,如获取当前系统的物理内存总大小和使用大小,shell命令如下:物理内存total值: free -m |grep Mem |awk ‘{print $2}’
物理内存used值:free -m |grep Mem | awk ‘{print $3}’    相比较而言,使用psutil库实现起来就更加简单了。psutil大小单位一般采用字节(Byte),如下:>>> import psutil
[quote]>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(8361156608L, 8215703552L)
转换成M为单位的话可以如下:
>>> print mem.total/1024/1024,mem.used/1024/1024
7973 7835

psutil的安装

    centos下:[root@crh]#yum search python |grep psutil
python26-psutil.x86_64 : A process and system utilities module for Python
所以我只需要yum -y install python26-psutil 就可以了    源码安装:[root@crh]#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz
[root@crh]#tar zxf psutil-2.0.0.tar.gz
[root@crh]#cd psutil-2.0.0
[root@crh]#python setup.py install
安装完成后,进入到python交互模式你可以导入试试。。。。

获取系统性能信息

    采集系统的基本性能信息包括(cpu、内存、磁盘、网络等,可以完整描述当前系统的运行的状态以及质量。psutil模块已经封装好了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用,那我们就开始来学习吧。走起。。。。。
 
1.CPU信息
    Linux操作系统的CPU利用率主要有以下几个部分:
[]User Time, 执行用户进程的时间百分比;[/][]System Time,执行内核进程和中断的时间百分比;[/][]Wait IO, 由于IO等待而让CPU处于idle(空闲)状态的时间百分比;[/][]Idle, CPU处于idle状态的时间百分比。[/]
    我们使用Python的psutil.cpu_times()方法可以非常简单的获取到这些信息,同时也可以获取到CPU的硬件相关的信息,比如CPU的物理个数和逻辑个数,具体看下面的操作例子:>>> import psutil
>>> psutil.cpu_times() [size=16]使用cpu_items方法获取CPU完整信息[/size]
cputimes(user=202656.94, nice=0.85999999999999999, system=83652.119999999995, idle=10823517.810000001, iowait=1242.27, irq=632.41999999999996, softirq=8720.3500000000004)[/quote]

[quote]>> psutil.cpu_times(percpu=True) #[size=16]#显示所有逻辑CPU的信息,指定percpu=True就好[/size]
[cputimes(user=8798.4200000000001, nice=0.029999999999999999, system=4920.2399999999998, idle=1376294.9399999999, iowait=40.539999999999999, irq=0.01, softirq=24.239999999999998), cputimes(user=35990.419999999998, nice=0.20000000000000001, system=13513.059999999999, idle=1338291.54, iowait=431.29000000000002, irq=95.420000000000002, softirq=1756.3499999999999), cputimes(user=23382.98, nice=0.080000000000000002, system=9391.4300000000003, idle=1356101.8899999999, iowait=102.27, irq=48.829999999999998, softirq=1050.73), cputimes(user=36171.690000000002, nice=0.28999999999999998, system=13764.790000000001, idle=1337939.1399999999, iowait=383.88, irq=91.719999999999999, softirq=1726.6199999999999), cputimes(user=9241.1200000000008, nice=0.070000000000000007, system=5088.5100000000002, idle=1375672.72, iowait=36.68, irq=0.01, softirq=38.950000000000003), cputimes(user=35656.849999999999, nice=0.089999999999999997, system=13522.209999999999, idle=1339042.3700000001, iowait=114.27, irq=84.890000000000001, softirq=1657.29), cputimes(user=17315.099999999999, nice=0.0, system=9599.6100000000006, idle=1362112.8, iowait=28.25, irq=224.88999999999999, softirq=797.25999999999999), cputimes(user=36109.360000000001, nice=0.070000000000000007, system=13855.99, idle=1338251.4299999999, iowait=105.06999999999999, irq=86.640000000000001, softirq=1669.28)][/quote]

[quote]>> psutil.cpu_times().user [size=16]# 获取CPU的但单项数据,如用户的CPU时间比[/size]
202673.82000000001[/quote]

[quote]>> psutil.cpu_count() [size=16]#获取cpu逻辑个数,默认logical=True ****注释如果你的psutil的版本不对的话可能没有cpu_count这个方法[/size][/quote]

8

[quote]>> psutil.cpu_count(logical=False) [size=16]#获取cpu的物理个数[/size][/quote]

12.内存信息
    Linux 系统的内存信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取到这些信息。>>> mem = psutil.virtual_memory() #使用psutil.virtual_memory方法获取内存完整信息

[quote]>> mem[/quote]

svmem(total=8361156608L, available=5626871808L, percent=32.700000000000003, used=8166158336L, free=194998272L, active=2812674048, inactive=4402806784, buffers=290136064L, cached=5141737472)

[quote]>>[/quote]

[quote]>> mem.total/1024/1024 #获取内存总数[/quote]

7973L

[quote]>> mem.free/1024/1024 #获取内存空闲数[/quote]

185L

[quote]>> psutil.swap_memory() #获取swap分区信息[/quote]

sswap(total=8587182080L, used=143360L, free=8587038720L, percent=0.0, sin=0, sout=143360)3.磁盘信息
    在系统磁盘信息中我们比较关注的是磁盘的利用率和IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。>>> psutil.disk_partitions() #使用psutil.disk_partions()获取磁盘完整信息

[sdiskpart(device=’/dev/sda2′, mountpoint=’/’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda5′, mountpoint=’/data’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda1′, mountpoint=’/boot’, fstype=’ext3′, opts=’rw’)]

[quote]>> psutil.disk_usage(‘/’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=52005134336, used=3963228160, free=45357588480, percent=7.5999999999999996)

[quote]>> psutil.disk_usage(‘/data’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=423282647040, used=32194187264, free=369240064000, percent=7.5999999999999996)

[quote]>> psutil.disk_io_counters() #使用psutil.disk_io_counters获取硬盘总的IO个数读写信息[/quote]

sdiskio(read_count=95397, write_count=3333898, read_bytes=1524504064, write_bytes=90824263168, read_time=256049, write_time=20039375)

[quote]>> psutil.disk_io_counters(perdisk=True) [size=16]”perdisk=True” 参数获取单个分区IO个数读写信息[/size][/quote]

{‘sda4′: sdiskio(read_count=5, write_count=0, read_bytes=5120, write_bytes=0, read_time=50, write_time=0), ‘sda5′: sdiskio(read_count=29679, write_count=1161203, read_bytes=594831360, write_bytes=46546737152, read_time=79547, write_time=12518375), ‘sda2′: sdiskio(read_count=65407, write_count=2172728, read_bytes=927507456, write_bytes=44279271424, read_time=175431, write_time=7521025), ‘sda3′: sdiskio(read_count=39, write_count=3, read_bytes=831488, write_bytes=143360, read_time=158, write_time=10), ‘sda1′: sdiskio(read_count=267, write_count=26, read_bytes=1328640, write_bytes=28160, read_time=863, write_time=32)}4.网络信息
    系统的网络信息和磁盘信息类似,涉及几个关键的点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent(发送数据包数)、packets_recv(接受数据包数)等。这些网络信息可以使用psutil.net_io_counters()方法获取。>>> psutil.net_io_counters() [size=16]使用psutil.net_io_counters获取到网络总的IO信息,默认pernic=False[/size]

snetio(bytes_sent=98373481869, bytes_recv=630483790117, packets_sent=869376956, packets_recv=894221315, errin=0, errout=0, dropin=0, dropout=0)

[quote]>> psutil.net_io_counters(pernic=True) [size=16]pernic=True,输出每个网络接口的IO信息[/size][/quote]

{‘lo': snetio(bytes_sent=1064059797, bytes_recv=1064059797, packets_sent=6473544, packets_recv=6473544, errin=0, errout=0, dropin=0, dropout=0), ‘sit0′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth3′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth2′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth1′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth0′: snetio(bytes_sent=97313244366, bytes_recv=629446229973, packets_sent=862937674, packets_recv=887781757, errin=0, errout=0, dropin=0, dropout=0)}5.其他一些系统信息
     除了前面介绍的几个获取系统的基本信息的方法,psutil模块还支持获取用户登录、开机时间信息>>> psutil.users() #使用psutil.users方法获取当前登陆用户的信息

[suser(name=’root’, terminal=’pts/0′, host=’111.206.162.94′, started=1417013248.0)]

[quote]>> psutil.boot_time() #使用psutil.boot_time方法获取开机时间,默认以linux时间戳返回[/quote]

1415455455.0

[quote]>> import datetime [size=16]#导入datetime模块,格式化时间戳,转换成自然时间格式[/size][/quote]

[quote]>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%M-%d %H:%M:%S”)[/quote]

‘2014-04-08 22:04:15′

系统进程管理方法

 
    获取当前系统的进程信息,可以让运维得知当前应用程序的运行状态,包括进程的启动时间,查看或设置CPU亲和度,内存使用率,IO信息,socket链接,线程数等。这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化,问题定位提供了很好的数据参考。
 
 1.进程信息
    psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。>>> psutil.pids() #获取所有进程的PID

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 105, 116, 117, 118, 119 …… ]

[quote]>> p = psutil.Process(5926) #实例化一个Process对象,参数为一个进程PID[/quote]

[quote]>> p.name() #进程名[/quote]

‘httpd’

[quote]>> p.exe() #进程bin路径[/quote]

‘/usr/local/apache2/bin/httpd’

[quote]>> p.cwd() #进程工作绝对路径目录[/quote]

‘/data/www/crh/monitor’

[quote]>> p.status() #进程状态[/quote]

‘sleeping’

[quote]>> p.create_time() #进程创建时间,时间戳格式[/quote]

1417019136.6400001

[quote]>> p.uids() #进程uid信息[/quote]

puids(real=2, effective=2, saved=2)

[quote]>> p.gids() #进程gid信息[/quote]

pgids(real=2, effective=2, saved=2)

[quote]>> p.cpu_times() # 进程cpu时间信息[/quote]

pcputimes(user=0.68000000000000005, system=0.13)

[quote]>> p.memory_info() #进程内存利用率[/quote]

pmem(rss=9306112, vms=147357696)

[quote]>> p.io_counters() # 进程io信息,包括读写io数以及字节数[/quote]

pio(read_count=8390, write_count=1282, read_bytes=0, write_bytes=311296)

[quote]>> p.connections() #返回打开进程socket的namedutples列表[/quote]

[pconn(fd=3, family=10, type=1, laddr=(‘::’, 8001), raddr=(), status=’LISTEN’)]

[quote]>> p.num_threads() #进程开启线程数[/quote]

12.popen类的使用
    psutil提供的popen类的作用是获取用户启动应用程序的信息,以便跟踪程序进程的允许状态。>>> import psutil

[quote]>> from subprocess import PIPE[/quote]

[size=16]通过psutil的Popen方法启动应用程序,可以跟着应用程序的相关信息[/size]

[quote]>> p = psutil.Popen([“/usr/bin/python”, “-c”, “print (‘hello’)”], stdout=PIPE)[/quote]

[quote]>> p.name()[/quote]

‘python’

[quote]>> p.username()[/quote]

‘root’

[quote]>> p.communicate()[/quote]

(‘hello\n’, None)

[quote]>> p.cpu_times()[/quote]

pcputimes(user=0.02, system=0.060000000000000001) psutile更多方法参考:https://github.com/giampaolo/psutil

模块说明官网:http://pythonhosted.org/psutil/ 查看全部
py1.jpeg
   
     psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU 、内存、磁盘、网络等)信息,它主要应用于系统监控,分析和限制系统资源以及进程的管理。它可以实现等同于命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和SunSolaris等操作系统,支持从2.4到3.4的python版本,目前最新版本为2.0.0。
 
    通常我们获取操作系统信息往往采用编写shell脚本来实现,如获取当前系统的物理内存总大小和使用大小,shell命令如下:
物理内存total值: free -m |grep Mem |awk ‘{print $2}’
物理内存used值:free -m |grep Mem | awk ‘{print $3}’
    相比较而言,使用psutil库实现起来就更加简单了。psutil大小单位一般采用字节(Byte),如下:
>>> import psutil
[quote]>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(8361156608L, 8215703552L)
转换成M为单位的话可以如下:
>>> print mem.total/1024/1024,mem.used/1024/1024
7973 7835


psutil的安装


    centos下:
[root@crh]#yum search python |grep psutil
python26-psutil.x86_64 : A process and system utilities module for Python
所以我只需要yum -y install python26-psutil 就可以了
    源码安装:
[root@crh]#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz
[root@crh]#tar zxf psutil-2.0.0.tar.gz
[root@crh]#cd psutil-2.0.0
[root@crh]#python setup.py install
安装完成后,进入到python交互模式你可以导入试试。。。。


获取系统性能信息


    采集系统的基本性能信息包括(cpu、内存、磁盘、网络等,可以完整描述当前系统的运行的状态以及质量。psutil模块已经封装好了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用,那我们就开始来学习吧。走起。。。。。
 
1.CPU信息
    Linux操作系统的CPU利用率主要有以下几个部分:
    []User Time, 执行用户进程的时间百分比;[/][]System Time,执行内核进程和中断的时间百分比;[/][]Wait IO, 由于IO等待而让CPU处于idle(空闲)状态的时间百分比;[/][]Idle, CPU处于idle状态的时间百分比。[/]

    我们使用Python的psutil.cpu_times()方法可以非常简单的获取到这些信息,同时也可以获取到CPU的硬件相关的信息,比如CPU的物理个数和逻辑个数,具体看下面的操作例子:
>>> import psutil
>>> psutil.cpu_times() [size=16]使用cpu_items方法获取CPU完整信息[/size]
cputimes(user=202656.94, nice=0.85999999999999999, system=83652.119999999995, idle=10823517.810000001, iowait=1242.27, irq=632.41999999999996, softirq=8720.3500000000004)[/quote]

[quote]>> psutil.cpu_times(percpu=True) #[size=16]#显示所有逻辑CPU的信息,指定percpu=True就好[/size]
[cputimes(user=8798.4200000000001, nice=0.029999999999999999, system=4920.2399999999998, idle=1376294.9399999999, iowait=40.539999999999999, irq=0.01, softirq=24.239999999999998), cputimes(user=35990.419999999998, nice=0.20000000000000001, system=13513.059999999999, idle=1338291.54, iowait=431.29000000000002, irq=95.420000000000002, softirq=1756.3499999999999), cputimes(user=23382.98, nice=0.080000000000000002, system=9391.4300000000003, idle=1356101.8899999999, iowait=102.27, irq=48.829999999999998, softirq=1050.73), cputimes(user=36171.690000000002, nice=0.28999999999999998, system=13764.790000000001, idle=1337939.1399999999, iowait=383.88, irq=91.719999999999999, softirq=1726.6199999999999), cputimes(user=9241.1200000000008, nice=0.070000000000000007, system=5088.5100000000002, idle=1375672.72, iowait=36.68, irq=0.01, softirq=38.950000000000003), cputimes(user=35656.849999999999, nice=0.089999999999999997, system=13522.209999999999, idle=1339042.3700000001, iowait=114.27, irq=84.890000000000001, softirq=1657.29), cputimes(user=17315.099999999999, nice=0.0, system=9599.6100000000006, idle=1362112.8, iowait=28.25, irq=224.88999999999999, softirq=797.25999999999999), cputimes(user=36109.360000000001, nice=0.070000000000000007, system=13855.99, idle=1338251.4299999999, iowait=105.06999999999999, irq=86.640000000000001, softirq=1669.28)][/quote]

[quote]>> psutil.cpu_times().user [size=16]# 获取CPU的但单项数据,如用户的CPU时间比[/size]
202673.82000000001[/quote]

[quote]>> psutil.cpu_count() [size=16]#获取cpu逻辑个数,默认logical=True ****注释如果你的psutil的版本不对的话可能没有cpu_count这个方法[/size][/quote]

8

[quote]>> psutil.cpu_count(logical=False) [size=16]#获取cpu的物理个数[/size][/quote]

1
2.内存信息
    Linux 系统的内存信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取到这些信息。
>>> mem = psutil.virtual_memory()  #使用psutil.virtual_memory方法获取内存完整信息

[quote]>> mem[/quote]

svmem(total=8361156608L, available=5626871808L, percent=32.700000000000003, used=8166158336L, free=194998272L, active=2812674048, inactive=4402806784, buffers=290136064L, cached=5141737472)

[quote]>>[/quote]

[quote]>> mem.total/1024/1024 #获取内存总数[/quote]

7973L

[quote]>> mem.free/1024/1024 #获取内存空闲数[/quote]

185L

[quote]>> psutil.swap_memory() #获取swap分区信息[/quote]

sswap(total=8587182080L, used=143360L, free=8587038720L, percent=0.0, sin=0, sout=143360)
3.磁盘信息
    在系统磁盘信息中我们比较关注的是磁盘的利用率和IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些IO信息可以使用psutil.disk_io_counters()获取。
>>> psutil.disk_partitions()        #使用psutil.disk_partions()获取磁盘完整信息

[sdiskpart(device=’/dev/sda2′, mountpoint=’/’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda5′, mountpoint=’/data’, fstype=’ext3′, opts=’rw’), sdiskpart(device=’/dev/sda1′, mountpoint=’/boot’, fstype=’ext3′, opts=’rw’)]

[quote]>> psutil.disk_usage(‘/’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=52005134336, used=3963228160, free=45357588480, percent=7.5999999999999996)

[quote]>> psutil.disk_usage(‘/data’) [size=16]使用disk_usage方法指定参数获取指定分区的使用情况。[/size][/quote]

sdiskusage(total=423282647040, used=32194187264, free=369240064000, percent=7.5999999999999996)

[quote]>> psutil.disk_io_counters() #使用psutil.disk_io_counters获取硬盘总的IO个数读写信息[/quote]

sdiskio(read_count=95397, write_count=3333898, read_bytes=1524504064, write_bytes=90824263168, read_time=256049, write_time=20039375)

[quote]>> psutil.disk_io_counters(perdisk=True) [size=16]”perdisk=True” 参数获取单个分区IO个数读写信息[/size][/quote]

{‘sda4′: sdiskio(read_count=5, write_count=0, read_bytes=5120, write_bytes=0, read_time=50, write_time=0), ‘sda5′: sdiskio(read_count=29679, write_count=1161203, read_bytes=594831360, write_bytes=46546737152, read_time=79547, write_time=12518375), ‘sda2′: sdiskio(read_count=65407, write_count=2172728, read_bytes=927507456, write_bytes=44279271424, read_time=175431, write_time=7521025), ‘sda3′: sdiskio(read_count=39, write_count=3, read_bytes=831488, write_bytes=143360, read_time=158, write_time=10), ‘sda1′: sdiskio(read_count=267, write_count=26, read_bytes=1328640, write_bytes=28160, read_time=863, write_time=32)}
4.网络信息
    系统的网络信息和磁盘信息类似,涉及几个关键的点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent(发送数据包数)、packets_recv(接受数据包数)等。这些网络信息可以使用psutil.net_io_counters()方法获取。
>>> psutil.net_io_counters()     [size=16]使用psutil.net_io_counters获取到网络总的IO信息,默认pernic=False[/size]

snetio(bytes_sent=98373481869, bytes_recv=630483790117, packets_sent=869376956, packets_recv=894221315, errin=0, errout=0, dropin=0, dropout=0)

[quote]>> psutil.net_io_counters(pernic=True) [size=16]pernic=True,输出每个网络接口的IO信息[/size][/quote]

{‘lo': snetio(bytes_sent=1064059797, bytes_recv=1064059797, packets_sent=6473544, packets_recv=6473544, errin=0, errout=0, dropin=0, dropout=0), ‘sit0′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth3′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth2′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth1′: snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), ‘eth0′: snetio(bytes_sent=97313244366, bytes_recv=629446229973, packets_sent=862937674, packets_recv=887781757, errin=0, errout=0, dropin=0, dropout=0)}
5.其他一些系统信息
     除了前面介绍的几个获取系统的基本信息的方法,psutil模块还支持获取用户登录、开机时间信息
>>> psutil.users()    #使用psutil.users方法获取当前登陆用户的信息

[suser(name=’root’, terminal=’pts/0′, host=’111.206.162.94′, started=1417013248.0)]

[quote]>> psutil.boot_time() #使用psutil.boot_time方法获取开机时间,默认以linux时间戳返回[/quote]

1415455455.0

[quote]>> import datetime [size=16]#导入datetime模块,格式化时间戳,转换成自然时间格式[/size][/quote]

[quote]>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(“%Y-%M-%d %H:%M:%S”)[/quote]

‘2014-04-08 22:04:15′


系统进程管理方法


 
    获取当前系统的进程信息,可以让运维得知当前应用程序的运行状态,包括进程的启动时间,查看或设置CPU亲和度,内存使用率,IO信息,socket链接,线程数等。这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化,问题定位提供了很好的数据参考。
 
 1.进程信息
    psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。
>>> psutil.pids()  #获取所有进程的PID

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 105, 116, 117, 118, 119 …… ]

[quote]>> p = psutil.Process(5926) #实例化一个Process对象,参数为一个进程PID[/quote]

[quote]>> p.name() #进程名[/quote]

‘httpd’

[quote]>> p.exe() #进程bin路径[/quote]

‘/usr/local/apache2/bin/httpd’

[quote]>> p.cwd() #进程工作绝对路径目录[/quote]

‘/data/www/crh/monitor’

[quote]>> p.status() #进程状态[/quote]

‘sleeping’

[quote]>> p.create_time() #进程创建时间,时间戳格式[/quote]

1417019136.6400001

[quote]>> p.uids() #进程uid信息[/quote]

puids(real=2, effective=2, saved=2)

[quote]>> p.gids() #进程gid信息[/quote]

pgids(real=2, effective=2, saved=2)

[quote]>> p.cpu_times() # 进程cpu时间信息[/quote]

pcputimes(user=0.68000000000000005, system=0.13)

[quote]>> p.memory_info() #进程内存利用率[/quote]

pmem(rss=9306112, vms=147357696)

[quote]>> p.io_counters() # 进程io信息,包括读写io数以及字节数[/quote]

pio(read_count=8390, write_count=1282, read_bytes=0, write_bytes=311296)

[quote]>> p.connections() #返回打开进程socket的namedutples列表[/quote]

[pconn(fd=3, family=10, type=1, laddr=(‘::’, 8001), raddr=(), status=’LISTEN’)]

[quote]>> p.num_threads() #进程开启线程数[/quote]

1
2.popen类的使用
    psutil提供的popen类的作用是获取用户启动应用程序的信息,以便跟踪程序进程的允许状态。
>>> import psutil

[quote]>> from subprocess import PIPE[/quote]

[size=16]通过psutil的Popen方法启动应用程序,可以跟着应用程序的相关信息[/size]

[quote]>> p = psutil.Popen([“/usr/bin/python”, “-c”, “print (‘hello’)”], stdout=PIPE)[/quote]

[quote]>> p.name()[/quote]

‘python’

[quote]>> p.username()[/quote]

‘root’

[quote]>> p.communicate()[/quote]

(‘hello\n’, None)

[quote]>> p.cpu_times()[/quote]

pcputimes(user=0.02, system=0.060000000000000001)
 psutile更多方法参考:
https://github.com/giampaolo/psutil

模块说明官网:http://pythonhosted.org/psutil/


elasticsearch中文分词插件IK使用

采菊篱下 发表了文章 • 0 个评论 • 1677 次浏览 • 2015-09-21 11:40 • 来自相关话题

ES支持中文的前提是安装正确的分词组件,比如elasticsearch-analysis-ik。
版本支持如下:





安装

# git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1
# cd elasticsearch-analysis-ik/
# mvn package
# unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip
OR# git clone https://github.com/medcl/elasticsearch-analysis-ik
# cd elasticsearch-analysis-ik
# mvn compile
# mvn package
# plugin --install analysis-ik --url file:///#{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-1.3.0.zipzip解压得到5个jar包:
[]- elasticsearch-analysis-ik-1.2.9.jar[/][]- httpclient-4.3.5.jar[/][]- httpcore-4.3.2.jar[/][]- commons-logging-1.1.3.jar[/][]- commons-codec-1.6.jar[/]
 
返回ES目录,新建路径./plugins/analysis-ik并把上述jar包全部移进去。
第二步,把elasticsearch-analysis-ik/config/ik文件夹(IK自带的词典)复制到ES目录的./config路径下。
第三步,在./config/elasticsearch.yml文件的最后加上:index:
analysis:
analyzer:
ik:
alias: [news_analyzer_ik,ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

index.analysis.analyzer.default.type : "ik"
OR[b]index.analysis.analyzer.ik.type : "ik"[/b]注意配置分词组件必须在创建索引之前,否则是无效的。

Example

1.create a index# curl -XPUT http://localhost:9200/index2.create a mapping# curl -XPUT http://localhost:9200/index
create a mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"term_vector": "no",
"store": "false"
},
"properties": {
"content": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"include_in_all": "true",
"boost": 8
}
}
}
}'3.index some docs# curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'# curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}
'# curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
' # curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'4.query with highlighting# curl -XPOST http://localhost:9200/index/fulltext/_search -d'
{
"query" : { "term" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'Result{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中国</tag1>渔船 "
]
}
}
]
}
} 查看全部
eslogo.png

ES支持中文的前提是安装正确的分词组件,比如elasticsearch-analysis-ik
版本支持如下:
ik1.png


安装


# git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1
# cd elasticsearch-analysis-ik/
# mvn package
# unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip

OR
# git clone https://github.com/medcl/elasticsearch-analysis-ik
# cd elasticsearch-analysis-ik
# mvn compile
# mvn package
# plugin --install analysis-ik --url file:///#{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-1.3.0.zip
zip解压得到5个jar包:
    []- elasticsearch-analysis-ik-1.2.9.jar[/][]- httpclient-4.3.5.jar[/][]- httpcore-4.3.2.jar[/][]- commons-logging-1.1.3.jar[/][]- commons-codec-1.6.jar[/]

 
返回ES目录,新建路径./plugins/analysis-ik并把上述jar包全部移进去。
第二步,把elasticsearch-analysis-ik/config/ik文件夹(IK自带的词典)复制到ES目录的./config路径下。
第三步,在./config/elasticsearch.yml文件的最后加上:
index:
analysis:
analyzer:
ik:
alias: [news_analyzer_ik,ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

index.analysis.analyzer.default.type : "ik"

OR
[b]index.analysis.analyzer.ik.type : "ik"[/b]
注意配置分词组件必须在创建索引之前,否则是无效的。


Example


1.create a index
# curl -XPUT http://localhost:9200/index
2.create a mapping
# curl -XPUT http://localhost:9200/index
create a mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"term_vector": "no",
"store": "false"
},
"properties": {
"content": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"include_in_all": "true",
"boost": 8
}
}
}
}'
3.index some docs
# curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
# curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}
'
# curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
# curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'
4.query with highlighting
# curl -XPOST http://localhost:9200/index/fulltext/_search  -d'
{
"query" : { "term" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'
Result
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中国</tag1>渔船 "
]
}
}
]
}
}

Elasticsearch索引存储类型

采菊篱下 发表了文章 • 0 个评论 • 2475 次浏览 • 2015-09-20 16:59 • 来自相关话题

文件系统存储类型
    基于文件系统的存储是默认索引存储方式。有不同的实现或存储类型。最好的一个操作系统的自动选择是:mmapfs使用在Windows的64bit系统上,simplefs使用在windows的32bit系统上,除此之外默认是用(hybrid niofs 和 mmapfs)。
 
    你可以通过修改配置文件elasticsearch.yml来指定存储类型:index.store.type: niofs    当然你也可以在创建索引的时候指定:curl -XPUT localhost:9200/my_index -d '{
"settings": {
"index.store.type": "niofs"
}
}';    下面是所有支持的不同存储类型:

Simple FS(简单文件系统)

Simplefs类型是一个简单的实现随机访问文件的文件存储系统(映射到Lucene SimpleFsDirectory的)。该实现的并发性能较差(多线程是个瓶颈)。当你需要将索引持久化,最好使用niofs。

NIO FS(NIO文件系统)

niofs类型是通过NIO将分片索引文件写到文件系统上(映射到Lucene NIOFSDirectory)。它允许多线程同时读取文件。不建议在Windows系统上使用,由于SUN JAVA实现上的一个错误。

MMap FS(内存映射文件系统)

mmapfs类型存储分片索引到文件系统上(映射到Lucene MMapDirectory)通过映射文件到内存中(MMAP)。内存映射的过程中将划分出与被映射文件大小一样的虚拟内存空间。使用这个类之前,请确保您有足够的虚拟地址空间。Linux下虚拟内存设置:
# sysctl -w vm.max_map_count=262144
永久生效:
update the vm.max_map_count setting in /etc/sysctl.conf.
# echo "vm.max_map_count=262144" >> /etc/sysctl.conf && sysctl -p

Hybrid MMap / NIO FS

默认类型存储碎片索引在文件系统中根据不同的文件类型的文件映射到内存(mmap)或使用Java NIO。目前只Lucene术语字典和doc值文件内存映射到减少对操作系统的影响。所有其他文件都使用Lucene NIOFSDirectory打开。
内存
    内存类型索引存储在主内存,使用Lucene的RamIndexStore。
    
    也有节点级别的设置来控制高速缓存(重要的,当使用直接缓冲区):




参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html#store-memory
           https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html#file-descriptors 查看全部
eslogo.png


文件系统存储类型
    基于文件系统的存储是默认索引存储方式。有不同的实现或存储类型。最好的一个操作系统的自动选择是:mmapfs使用在Windows的64bit系统上,simplefs使用在windows的32bit系统上,除此之外默认是用(hybrid niofs 和 mmapfs)。
 
    你可以通过修改配置文件elasticsearch.yml来指定存储类型:
index.store.type: niofs
    当然你也可以在创建索引的时候指定:
curl -XPUT localhost:9200/my_index -d '{
"settings": {
"index.store.type": "niofs"
}
}';
    下面是所有支持的不同存储类型:


Simple FS(简单文件系统)


Simplefs类型是一个简单的实现随机访问文件的文件存储系统(映射到Lucene SimpleFsDirectory的)。该实现的并发性能较差(多线程是个瓶颈)。当你需要将索引持久化,最好使用niofs。


NIO FS(NIO文件系统)


niofs类型是通过NIO将分片索引文件写到文件系统上(映射到Lucene NIOFSDirectory)。它允许多线程同时读取文件。不建议在Windows系统上使用,由于SUN JAVA实现上的一个错误。


MMap FS(内存映射文件系统)


mmapfs类型存储分片索引到文件系统上(映射到Lucene MMapDirectory)通过映射文件到内存中(MMAP)。内存映射的过程中将划分出与被映射文件大小一样的虚拟内存空间。使用这个类之前,请确保您有足够的虚拟地址空间。
Linux下虚拟内存设置:
# sysctl -w vm.max_map_count=262144
永久生效:
update the vm.max_map_count setting in /etc/sysctl.conf.
# echo "vm.max_map_count=262144" >> /etc/sysctl.conf && sysctl -p


Hybrid MMap / NIO FS


默认类型存储碎片索引在文件系统中根据不同的文件类型的文件映射到内存(mmap)或使用Java NIO。目前只Lucene术语字典和doc值文件内存映射到减少对操作系统的影响。所有其他文件都使用Lucene NIOFSDirectory打开。

内存
    内存类型索引存储在主内存,使用Lucene的RamIndexStore。
    
    也有节点级别的设置来控制高速缓存(重要的,当使用直接缓冲区):
estore.png

参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html#store-memory
           https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html#file-descriptors

mysql的ERROR 2006 (HY000): MySQL server has gone away错误分析

Ansible 发表了文章 • 0 个评论 • 732 次浏览 • 2015-09-19 20:43 • 来自相关话题

MySQL下当我导入一个比较大的SQL文件时出现了ERROR 2006 (HY000): MySQL server has gone away错误,具体情况如下:> ll *.sql
-rwxr-xr-x@ 1 bohan staff 27M Mar 26 18:08 91620_all.sql

[quote] mysql test < 91620_all.sql
ERROR 2006 (HY000) at line 17128: MySQL server has gone away上面可以看到,文件大小为27M导入的时候会报这个错误。
 
错误原因

If you are using the mysql client program, its default max_allowed_packet variable is 16MB. To set a larger value, start mysql like this:

shell> mysql --max_allowed_packet=32M

That sets the packet size to 32MB.

我们通过MySQL相关文档可以发现默认大小是16M。
 
解决方法
所有大于16M的SQL文件都会报这个错误,我们可以直接通过命令后增加--max_allowed_packet=32M解决或者登录MySQL客户端,修改系统变量:> ssh mysql
mysql> set GLOBAL max_allowed_packet=32[i]1024[/i]1024;我们也可以通过修改MySQL配置my.cnf文件,在最后一行增加max_allowed_packet=32M就可以了
 
MySQL配置文件的位置:Windows下 C:\ProgamData\MySQL\MySQL Server5.6
Linux下 /etc/mysql
Mac下通过brew安装 /usr/local/Cellar/mysql/5.6.23原文地址:开源技术社区分享[/quote] 查看全部
MySQL下当我导入一个比较大的SQL文件时出现了ERROR 2006 (HY000): MySQL server has gone away错误,具体情况如下:
>  ll *.sql
-rwxr-xr-x@ 1 bohan staff 27M Mar 26 18:08 91620_all.sql

[quote] mysql test < 91620_all.sql
ERROR 2006 (HY000) at line 17128: MySQL server has gone away
上面可以看到,文件大小为27M导入的时候会报这个错误。
 
错误原因


If you are using the mysql client program, its default max_allowed_packet variable is 16MB. To set a larger value, start mysql like this:


shell> mysql --max_allowed_packet=32M


That sets the packet size to 32MB.


我们通过MySQL相关文档可以发现默认大小是16M。
 
解决方法
所有大于16M的SQL文件都会报这个错误,我们可以直接通过命令后增加--max_allowed_packet=32M解决或者登录MySQL客户端,修改系统变量:
> ssh mysql
mysql> set GLOBAL max_allowed_packet=32[i]1024[/i]1024;
我们也可以通过修改MySQL配置my.cnf文件,在最后一行增加max_allowed_packet=32M就可以了
 
MySQL配置文件的位置:
Windows下 C:\ProgamData\MySQL\MySQL Server5.6
Linux下 /etc/mysql
Mac下通过brew安装 /usr/local/Cellar/mysql/5.6.23
原文地址:开源技术社区分享[/quote]

R语言学习文档资料大全

OpenSkill 发表了文章 • 0 个评论 • 801 次浏览 • 2015-09-19 17:12 • 来自相关话题

    现在对R语言感兴趣人的人越来越多,很多人都想快速掌握R语言,然而,由于现在大部分学校没有开设R语言课程,社会上相对培训R语言的机构也较少,导致很多人不知道如何着手学习R语言。

    所以这次开源技术社区给大家分享一份R语言资料,希望对你有帮助!
    文档资料下载地址:http://pan.baidu.com/s/1pJwzUxP
 
    开源技术社区QQ群号:372476089  欢迎加入互相学习
    扫码关注微信号: 查看全部
    现在对R语言感兴趣人的人越来越多,很多人都想快速掌握R语言,然而,由于现在大部分学校没有开设R语言课程,社会上相对培训R语言的机构也较少,导致很多人不知道如何着手学习R语言。

    所以这次开源技术社区给大家分享一份R语言资料,希望对你有帮助!
    文档资料下载地址:http://pan.baidu.com/s/1pJwzUxP
 
    开源技术社区QQ群号:372476089  欢迎加入互相学习
    扫码关注微信号:
opsk.jpg