mirror of https://github.com/jumpserver/jumpserver
167 lines
5.8 KiB
Python
167 lines
5.8 KiB
Python
# coding: utf-8
|
||
|
||
from jasset.models import *
|
||
from jumpserver.api import *
|
||
import uuid
|
||
import re
|
||
from ansible.playbook import PlayBook
|
||
from ansible import callbacks, utils
|
||
|
||
from jumpserver.models import Setting
|
||
|
||
|
||
def get_object_list(model, id_list):
|
||
"""根据id列表获取对象列表"""
|
||
object_list = []
|
||
for object_id in id_list:
|
||
if object_id:
|
||
object_list.extend(model.objects.filter(id=int(object_id)))
|
||
|
||
return object_list
|
||
|
||
|
||
def get_rand_file_path(base_dir=os.path.join(BASE_DIR, 'tmp')):
|
||
"""获取随机文件路径"""
|
||
filename = uuid.uuid1().hex
|
||
return os.path.join(base_dir, filename)
|
||
|
||
|
||
def get_inventory(host_group):
|
||
"""生成资产表库存清单"""
|
||
path = get_rand_file_path()
|
||
f = open(path, 'w')
|
||
for group, host_list in host_group.items():
|
||
f.write('[%s]\n' % group)
|
||
for ip in host_list:
|
||
asset = get_object(Asset, ip=ip)
|
||
if asset.use_default:
|
||
f.write('%s\n' % ip)
|
||
else:
|
||
f.write('%s ansible_ssh_port=%s ansible_ssh_user=%s ansible_ssh_pass=%s\n' %
|
||
(ip, asset.port, asset.username, CRYPTOR.decrypt(asset.password)))
|
||
f.close()
|
||
return path
|
||
|
||
|
||
def get_playbook(template, var):
|
||
"""根据playbook模板,生成playbook"""
|
||
str_playbook = open(template).read()
|
||
for k, v in var.items():
|
||
str_playbook = re.sub(r'%s' % k, v, str_playbook) # 正则来替换传入的字符
|
||
path = get_rand_file_path()
|
||
f = open(path, 'w')
|
||
f.write(str_playbook)
|
||
return path
|
||
|
||
|
||
def playbook_run(inventory, playbook, settings):
|
||
stats = callbacks.AggregateStats()
|
||
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
|
||
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)
|
||
# run the playbook
|
||
if settings:
|
||
playbook = PlayBook(host_list=inventory,
|
||
playbook=playbook,
|
||
forks=5,
|
||
remote_user=settings.default_user,
|
||
remote_port=settings.default_port,
|
||
private_key_file=settings.default_pri_key_path,
|
||
callbacks=playbook_cb,
|
||
runner_callbacks=runner_cb,
|
||
stats=stats,
|
||
become=True,
|
||
become_user='root')
|
||
else:
|
||
playbook = PlayBook(host_list=inventory,
|
||
playbook=playbook,
|
||
forks=5,
|
||
callbacks=playbook_cb,
|
||
runner_callbacks=runner_cb,
|
||
stats=stats,
|
||
become=True,
|
||
become_user='root')
|
||
|
||
results = playbook.run()
|
||
results_r = {'unreachable': [], 'failures': [], 'success': []}
|
||
for hostname, result in results.items():
|
||
if result.get('unreachable', 2):
|
||
results_r['unreachable'].append(hostname)
|
||
print "%s >>> unreachable" % hostname
|
||
elif result.get('failures', 2):
|
||
results_r['failures'].append(hostname)
|
||
print "%s >>> Failed" % hostname
|
||
else:
|
||
results_r['success'].append(hostname)
|
||
print "%s >>> Success" % hostname
|
||
|
||
return results_r
|
||
|
||
|
||
def perm_user_api(perm_info):
|
||
"""
|
||
用户授权api,通过调用ansible API完成用户新建等,传入参数必须如下,列表中可以是对象,也可以是用户名和ip
|
||
perm_info = {'del': {'users': [],
|
||
'assets': [],
|
||
},
|
||
'new': {'users': [],
|
||
'assets': []}}
|
||
"""
|
||
try:
|
||
new_users = perm_info['new']['users']
|
||
new_assets = perm_info['new']['assets']
|
||
del_users = perm_info['del']['users']
|
||
del_assets = perm_info['del']['assets']
|
||
except IndexError:
|
||
raise ServerError("Error: function perm_user_api传入参数错误")
|
||
|
||
# 检查传入的是字符串还是对象
|
||
check_users = new_users + del_users
|
||
try:
|
||
if isinstance(check_users[0], str):
|
||
var_type = 'str'
|
||
else:
|
||
var_type = 'obj'
|
||
|
||
except IndexError:
|
||
raise ServerError("Error: function perm_user_api传入参数错误")
|
||
|
||
print new_assets, del_assets
|
||
print new_users, del_users
|
||
try:
|
||
if var_type == 'str':
|
||
new_ip = new_assets
|
||
del_ip = del_assets
|
||
new_username = new_users
|
||
del_username = del_users
|
||
else:
|
||
new_ip = [asset.ip for asset in new_assets if isinstance(asset, Asset)]
|
||
del_ip = [asset.ip for asset in del_assets if isinstance(asset, Asset)]
|
||
new_username = [user.username for user in new_users if isinstance(user, User)]
|
||
del_username = [user.username for user in del_users if isinstance(user, User)]
|
||
except IndexError:
|
||
raise ServerError("Error: function perm_user_api传入参数类型错误")
|
||
|
||
print new_ip, del_ip
|
||
print new_username, del_username
|
||
|
||
host_group = {'new': new_ip, 'del': del_ip}
|
||
inventory = get_inventory(host_group)
|
||
|
||
the_new_users = ','.join(new_username)
|
||
the_del_users = ','.join(del_username)
|
||
|
||
playbook = get_playbook(os.path.join(BASE_DIR, 'playbook', 'user_perm.yaml'),
|
||
{'the_new_group': 'new', 'the_del_group': 'del',
|
||
'the_new_users': the_new_users, 'the_del_users': the_del_users,
|
||
'the_pub_key': '/tmp/id_rsa.pub'})
|
||
|
||
settings = get_object(Setting, name='default')
|
||
results_r = playbook_run(inventory, playbook, settings)
|
||
return results_r
|
||
|
||
|
||
def refresh_group_api(user_group=None, asset_group=None):
|
||
"""用户组添加删除用户,主机组添加删除主机触发"""
|
||
pass
|
||
|