Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
d32f070b
Commit
d32f070b
authored
Mar 28, 2018
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Update] 修改Inverntoy,增加更多属性
parent
c5af4d47
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
93 additions
and
45 deletions
+93
-45
asset.py
apps/assets/models/asset.py
+10
-2
inventory.py
apps/ops/ansible/inventory.py
+27
-15
inventory.py
apps/ops/inventory.py
+56
-28
No files found.
apps/assets/models/asset.py
View file @
d32f070b
...
@@ -96,7 +96,7 @@ class Asset(models.Model):
...
@@ -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):
...
@@ -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):
...
@@ -175,4 +184,3 @@ class Asset(models.Model):
except
IntegrityError
:
except
IntegrityError
:
print
(
'Error continue'
)
print
(
'Error continue'
)
continue
continue
apps/ops/ansible/inventory.py
View file @
d32f070b
...
@@ -29,7 +29,6 @@ class BaseHost(Host):
...
@@ -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):
...
@@ -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):
...
@@ -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):
...
@@ -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
)
...
...
apps/ops/inventory.py
View file @
d32f070b
...
@@ -9,29 +9,18 @@ __all__ = [
...
@@ -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):
...
@@ -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):
...
@@ -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
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment