return的用法网上太多资料了,利用return把结果存入数据库网上已经有现在的:
1、在master端创建数据库:
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
|
CREATE
DATABASE
`salt`
DEFAULT
CHARACTER
SET
utf8
DEFAULT
COLLATE
utf8_general_ci;
USE `salt`;
--
-- Table structure for table `jids`
--
DROP
TABLE
IF EXISTS `jids`;
CREATE
TABLE
`jids` (
`jid`
varchar
(255)
NOT
NULL
,
`
load
` mediumtext
NOT
NULL
,
UNIQUE
KEY
`jid` (`jid`)
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8;
--
-- Table structure for table `salt_returns`
--
DROP
TABLE
IF EXISTS `salt_returns`;
CREATE
TABLE
`salt_returns` (
`fun`
varchar
(50)
NOT
NULL
,
`jid`
varchar
(255)
NOT
NULL
,
`
return
` mediumtext
NOT
NULL
,
`id`
varchar
(255)
NOT
NULL
,
`success`
varchar
(10)
NOT
NULL
,
`full_ret` mediumtext
NOT
NULL
,
KEY
`id` (`id`),
KEY
`jid` (`jid`),
KEY
`fun` (`fun`)
) ENGINE=InnoDB
DEFAULT
CHARSET=utf8;
|
创建数据库用户,并授权给minion端:
GRANT ALL PRIVILEGES ON salt.* to ‘salt’@'%’ identified by ‘salt’;
(在实际环境中帐号密码应该复杂一些)
2、在master端,创建自定义return脚本,路径在/srv/salt/_returners目录下
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
[root@test81 _returners]
# cat mysql_return.py
from
contextlib
import
contextmanager
import
sys
import
json
import
logging
try
:
import
MySQLdb
HAS_MYSQL
=
True
except
ImportError:
HAS_MYSQL
=
False
log
=
logging.getLogger(__name__)
def
__virtual__():
if
not
HAS_MYSQL:
return
False
return
'test_mysql'
def
_get_options():
'''
Returns options used for the MySQL connection.
'''
defaults
=
{
'host'
:
'192.168.2.100'
,
'user'
:
'salt'
,
'pass'
:
'salt'
,
'db'
:
'salt'
,
'port'
:
3306
}
_options
=
{}
for
attr
in
defaults:
_attr
=
__salt__[
'config.option'
](
'mysql.{0}'
.
format
(attr))
if
not
_attr:
log.debug(
'Using default for MySQL {0}'
.
format
(attr))
_options[attr]
=
defaults[attr]
continue
_options[attr]
=
_attr
return
_options
@contextmanager
def
_get_serv(commit
=
False
):
'''
Return a mysql cursor
'''
_options
=
_get_options()
conn
=
MySQLdb.connect(host
=
_options[
'host'
], user
=
_options[
'user'
], passwd
=
_options[
'pass'
], db
=
_options[
'db'
], port
=
_options[
'port'
])
cursor
=
conn.cursor()
try
:
yield
cursor
except
MySQLdb.DatabaseError as err:
error,
=
err.args
sys.stderr.write(error.message)
cursor.execute(
"ROLLBACK"
)
raise
err
else
:
if
commit:
cursor.execute(
"COMMIT"
)
else
:
cursor.execute(
"ROLLBACK"
)
finally
:
conn.close()
def
returner(ret):
'''
Return data to a mysql server
'''
with _get_serv(commit
=
True
) as cur:
sql
=
'''INSERT INTO `salt_returns`
(`fun`, `jid`, `return`, `id`, `success`, `full_ret` )
VALUES (%s, %s, %s, %s, %s, %s)'''
cur.execute(sql, (ret[
'fun'
], ret[
'jid'
],
str
(ret[
'return'
]), ret[
'id'
],
ret[
'success'
], json.dumps(ret)))
|
注意创建的return名字不要用mysql,这样有可能会和自带的mysql return冲突,至于为什么不用自带的return,我实在找不到配置mysql帐号密码在哪里搞
这里minion端需要用到MySQLdb这个python模块,所以应该先安装这个模块:
/srv/salt/packages/install.sls (目录和文件名都是随便起的)
1
2
|
python26
-
mysqldb:
pkg.installed
|
然后全局推送安装:
1
|
salt
'*'
state.sls packages.install
|
最后推送刚刚我们自定义的return模块:
1
|
salt
'*'
saltutil.sync_returners
|
最后测试一下:
1
|
salt
'*'
cmd.run
'df'
-
-
return
test_mysql
|
然后可以看到数据库里面有结果:
本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1403387如需转载请自行联系原作者
lihuipeng