mirror of https://github.com/jumpserver/jumpserver
[Update] 修改Inverntoy,增加更多属性
parent
c5af4d47eb
commit
d32f070b5c
|
@ -96,7 +96,7 @@ class Asset(models.Model):
|
||||||
return False, warning
|
return False, warning
|
||||||
|
|
||||||
def is_unixlike(self):
|
def is_unixlike(self):
|
||||||
if self.platform not in ("Windows", "Other"):
|
if self.platform not in ("Windows",):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
@ -132,6 +132,15 @@ class Asset(models.Model):
|
||||||
info["gateways"] = [d.id for d in self.domain.gateway_set.all()]
|
info["gateways"] = [d.id for d in self.domain.gateway_set.all()]
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
def get_auth_info(self):
|
||||||
|
if self.admin_user:
|
||||||
|
return {
|
||||||
|
'username': self.admin_user.username,
|
||||||
|
'password': self.admin_user.password,
|
||||||
|
'private_key': self.admin_user.private_key_file,
|
||||||
|
'become': self.admin_user.become_info,
|
||||||
|
}
|
||||||
|
|
||||||
def _to_secret_json(self):
|
def _to_secret_json(self):
|
||||||
"""
|
"""
|
||||||
Ansible use it create inventory, First using asset user,
|
Ansible use it create inventory, First using asset user,
|
||||||
|
@ -175,4 +184,3 @@ class Asset(models.Model):
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
print('Error continue')
|
print('Error continue')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ class BaseHost(Host):
|
||||||
}
|
}
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"vars": {},
|
"vars": {},
|
||||||
"other_ansbile_vars":
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
self.host_data = host_data
|
self.host_data = host_data
|
||||||
|
@ -79,7 +78,7 @@ class BaseInventory(InventoryManager):
|
||||||
variable_manager_class = VariableManager
|
variable_manager_class = VariableManager
|
||||||
host_manager_class = BaseHost
|
host_manager_class = BaseHost
|
||||||
|
|
||||||
def __init__(self, host_list=None):
|
def __init__(self, host_list=None, group_list=None):
|
||||||
"""
|
"""
|
||||||
用于生成动态构建Ansible Inventory. super().__init__ 会自动调用
|
用于生成动态构建Ansible Inventory. super().__init__ 会自动调用
|
||||||
host_list: [{
|
host_list: [{
|
||||||
|
@ -98,11 +97,14 @@ class BaseInventory(InventoryManager):
|
||||||
"vars": {},
|
"vars": {},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
group_list: [
|
||||||
|
{"name: "", children: [""]},
|
||||||
|
]
|
||||||
:param host_list:
|
:param host_list:
|
||||||
|
:param group_list
|
||||||
"""
|
"""
|
||||||
if host_list is None:
|
self.host_list = host_list or []
|
||||||
host_list = []
|
self.group_list = group_list or []
|
||||||
self.host_list = host_list
|
|
||||||
assert isinstance(host_list, list)
|
assert isinstance(host_list, list)
|
||||||
self.loader = self.loader_class()
|
self.loader = self.loader_class()
|
||||||
self.variable_manager = self.variable_manager_class()
|
self.variable_manager = self.variable_manager_class()
|
||||||
|
@ -114,24 +116,34 @@ class BaseInventory(InventoryManager):
|
||||||
def get_group(self, name):
|
def get_group(self, name):
|
||||||
return self._inventory.groups.get(name, None)
|
return self._inventory.groups.get(name, None)
|
||||||
|
|
||||||
def parse_sources(self, cache=False):
|
def get_or_create_group(self, name):
|
||||||
group_all = self.get_group('all')
|
group = self.get_group(name)
|
||||||
ungrouped = self.get_group('ungrouped')
|
if not group:
|
||||||
|
self.add_group(name)
|
||||||
|
return self.get_or_create_group(name)
|
||||||
|
else:
|
||||||
|
return group
|
||||||
|
|
||||||
|
def parse_groups(self):
|
||||||
|
for g in self.group_list:
|
||||||
|
parent = self.get_or_create_group(g.get("name"))
|
||||||
|
children = [self.get_or_create_group(n) for n in g.get('children', [])]
|
||||||
|
for child in children:
|
||||||
|
parent.add_child_group(child)
|
||||||
|
|
||||||
|
def parse_hosts(self):
|
||||||
for host_data in self.host_list:
|
for host_data in self.host_list:
|
||||||
host = self.host_manager_class(host_data=host_data)
|
host = self.host_manager_class(host_data=host_data)
|
||||||
self.hosts[host_data['hostname']] = host
|
self.hosts[host_data['hostname']] = host
|
||||||
groups_data = host_data.get('groups')
|
groups_data = host_data.get('groups')
|
||||||
if groups_data:
|
if groups_data:
|
||||||
for group_name in groups_data:
|
for group_name in groups_data:
|
||||||
group = self.get_group(group_name)
|
group = self.get_or_create_group(group_name)
|
||||||
if group is None:
|
|
||||||
self.add_group(group_name)
|
|
||||||
group = self.get_group(group_name)
|
|
||||||
group.add_host(host)
|
group.add_host(host)
|
||||||
else:
|
|
||||||
ungrouped.add_host(host)
|
def parse_sources(self, cache=False):
|
||||||
group_all.add_host(host)
|
self.parse_groups()
|
||||||
|
self.parse_hosts()
|
||||||
|
|
||||||
def get_matched_hosts(self, pattern):
|
def get_matched_hosts(self, pattern):
|
||||||
return self.get_hosts(pattern)
|
return self.get_hosts(pattern)
|
||||||
|
|
|
@ -9,29 +9,18 @@ __all__ = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def make_proxy_command(asset):
|
|
||||||
gateway = asset.domain.random_gateway()
|
|
||||||
|
|
||||||
proxy_command = [
|
|
||||||
"ssh", "-p", str(gateway.port),
|
|
||||||
"{}@{}".format(gateway.username, gateway.ip),
|
|
||||||
"-W", "%h:%p", "-q",
|
|
||||||
]
|
|
||||||
|
|
||||||
if gateway.password:
|
|
||||||
proxy_command.insert(0, "sshpass -p {}".format(gateway.password))
|
|
||||||
if gateway.private_key:
|
|
||||||
proxy_command.append("-i {}".format(gateway.private_key_file))
|
|
||||||
|
|
||||||
return {"ansible_ssh_common_args": "'-o ProxyCommand={}'".format(" ".join(proxy_command))}
|
|
||||||
|
|
||||||
|
|
||||||
class JMSInventory(BaseInventory):
|
class JMSInventory(BaseInventory):
|
||||||
"""
|
"""
|
||||||
JMS Inventory is the manager with jumpserver assets, so you can
|
JMS Inventory is the manager with jumpserver assets, so you can
|
||||||
write you own manager, construct you inventory
|
write you own manager, construct you inventory
|
||||||
"""
|
"""
|
||||||
def __init__(self, hostname_list, run_as_admin=False, run_as=None, become_info=None):
|
def __init__(self, hostname_list, run_as_admin=False, run_as=None, become_info=None):
|
||||||
|
"""
|
||||||
|
:param hostname_list: ["test1", ]
|
||||||
|
:param run_as_admin: True 是否使用管理用户去执行, 每台服务器的管理用户可能不同
|
||||||
|
:param run_as: 是否统一使用某个系统用户去执行
|
||||||
|
:param become_info: 是否become成某个用户去执行
|
||||||
|
"""
|
||||||
self.hostname_list = hostname_list
|
self.hostname_list = hostname_list
|
||||||
self.using_admin = run_as_admin
|
self.using_admin = run_as_admin
|
||||||
self.run_as = run_as
|
self.run_as = run_as
|
||||||
|
@ -41,23 +30,14 @@ class JMSInventory(BaseInventory):
|
||||||
host_list = []
|
host_list = []
|
||||||
|
|
||||||
for asset in assets:
|
for asset in assets:
|
||||||
vars = {}
|
info = self.convert_to_ansible(asset, run_as_admin=run_as_admin)
|
||||||
if run_as_admin:
|
|
||||||
info = asset._to_secret_json()
|
|
||||||
else:
|
|
||||||
info = asset.to_json()
|
|
||||||
|
|
||||||
info["vars"] = vars
|
|
||||||
if asset.domain and asset.domain.has_gateway():
|
|
||||||
vars.update(make_proxy_command(asset))
|
|
||||||
info.update(vars)
|
|
||||||
|
|
||||||
host_list.append(info)
|
host_list.append(info)
|
||||||
|
|
||||||
if run_as:
|
if run_as:
|
||||||
run_user_info = self.get_run_user_info()
|
run_user_info = self.get_run_user_info()
|
||||||
for host in host_list:
|
for host in host_list:
|
||||||
host.update(run_user_info)
|
host.update(run_user_info)
|
||||||
|
|
||||||
if become_info:
|
if become_info:
|
||||||
for host in host_list:
|
for host in host_list:
|
||||||
host.update(become_info)
|
host.update(become_info)
|
||||||
|
@ -67,9 +47,57 @@ class JMSInventory(BaseInventory):
|
||||||
assets = get_assets_by_hostname_list(self.hostname_list)
|
assets = get_assets_by_hostname_list(self.hostname_list)
|
||||||
return assets
|
return assets
|
||||||
|
|
||||||
|
def convert_to_ansible(self, asset, run_as_admin=False):
|
||||||
|
info = {
|
||||||
|
'id': asset.id,
|
||||||
|
'hostname': asset.hostname,
|
||||||
|
'ip': asset.ip,
|
||||||
|
'port': asset.port,
|
||||||
|
'vars': dict(),
|
||||||
|
'groups': [],
|
||||||
|
}
|
||||||
|
if asset.domain and asset.domain.has_gateway():
|
||||||
|
info["vars"].update(self.make_proxy_command(asset))
|
||||||
|
if run_as_admin:
|
||||||
|
info.update(asset.get_auth_info())
|
||||||
|
for node in asset.nodes.all():
|
||||||
|
info["groups"].append(node.value)
|
||||||
|
for label in asset.labels.all():
|
||||||
|
info["vars"].update({
|
||||||
|
label.name: label.value
|
||||||
|
})
|
||||||
|
info["groups"].append("{}:{}".format(label.name, label.value))
|
||||||
|
if asset.domain:
|
||||||
|
info["vars"].update({
|
||||||
|
"domain": asset.domain.name,
|
||||||
|
})
|
||||||
|
info["groups"].append("domain_"+asset.domain.name)
|
||||||
|
return info
|
||||||
|
|
||||||
def get_run_user_info(self):
|
def get_run_user_info(self):
|
||||||
system_user = get_system_user_by_name(self.run_as)
|
system_user = get_system_user_by_name(self.run_as)
|
||||||
if not system_user:
|
if not system_user:
|
||||||
return {}
|
return {}
|
||||||
else:
|
else:
|
||||||
return system_user._to_secret_json()
|
return system_user._to_secret_json()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def make_proxy_command(asset):
|
||||||
|
gateway = asset.domain.random_gateway()
|
||||||
|
proxy_command_list = [
|
||||||
|
"ssh", "-p", str(gateway.port),
|
||||||
|
"{}@{}".format(gateway.username, gateway.ip),
|
||||||
|
"-W", "%h:%p", "-q",
|
||||||
|
]
|
||||||
|
|
||||||
|
if gateway.password:
|
||||||
|
proxy_command_list.insert(
|
||||||
|
0, "sshpass -p {}".format(gateway.password)
|
||||||
|
)
|
||||||
|
if gateway.private_key:
|
||||||
|
proxy_command_list.append("-i {}".format(gateway.private_key_file))
|
||||||
|
|
||||||
|
proxy_command = "'-o ProxyCommand={}'".format(
|
||||||
|
" ".join(proxy_command_list)
|
||||||
|
)
|
||||||
|
return {"ansible_ssh_common_args": proxy_command}
|
||||||
|
|
Loading…
Reference in New Issue