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
df9d879f
Commit
df9d879f
authored
Oct 31, 2015
by
Zi Chuanxiu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ansible api base complete...
parent
dd4ac4e6
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
118 additions
and
44 deletions
+118
-44
ansible_api.py
jperm/ansible_api.py
+118
-44
No files found.
jperm/ansible_api.py
View file @
df9d879f
...
...
@@ -7,6 +7,14 @@ from ansible.inventory import Inventory
from
ansible.runner
import
Runner
from
ansible.playbook
import
PlayBook
from
ansible
import
callbacks
from
ansible
import
utils
from
passlib.hash
import
sha512_crypt
import
os.path
JPERM_DIR
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
ANSIBLE_DIR
=
os
.
path
.
join
(
JPERM_DIR
,
'playbooks'
)
class
AnsibleError
(
StandardError
):
"""
...
...
@@ -38,21 +46,28 @@ class MyInventory(object):
def
__init__
(
self
,
resource
):
"""
resource :
必须是一个字典列表,比如
[{"hostname": "10.10.10.10", "port": "22",
"username": "test", "password": "mypass"}, ...]
resource的数据格式是一个列表字典,比如
{
"group1": [{"hostname": "10.10.10.10", "port": "22",
"username": "test", "password": "mypass"}, ...],
"group2": [{"hostname": "10.10.10.10", "port": "22",
"username": "test", "password": "mypass"}, ...]
}
如果你只传入1个列表,这默认该列表内的所有主机属于my_group组,比如
[{"hostname": "10.10.10.10", "port": "22",
"username": "test", "password": "mypass"}, ...]
"""
self
.
resource
=
resource
self
.
_gen_i
nventory
()
self
.
inventory
=
I
nventory
()
self
.
gen_inventory
()
def
_gen_inventory
(
self
):
def
add_group
(
self
,
hosts
,
groupname
):
"""
add hosts to
inventory.
add hosts to
a group
"""
my_group
=
Group
(
name
=
'my_group'
)
for
host
in
self
.
resource
:
my_group
=
Group
(
name
=
groupname
)
for
host
in
hosts
:
hostname
=
host
.
get
(
"hostname"
)
hostport
=
host
.
get
(
"hostport"
)
username
=
host
.
get
(
"username"
)
...
...
@@ -64,11 +79,17 @@ class MyInventory(object):
my_host
.
set_variable
(
'ansible_ssh_pass'
,
password
)
my_group
.
add_host
(
my_host
)
my_inventory
=
Inventory
()
my_inventory
.
add_group
(
my_group
)
my_inventory
.
subset
(
'my_group'
)
self
.
inventory
.
add_group
(
my_group
)
self
.
inventory
=
my_inventory
def
gen_inventory
(
self
):
"""
add hosts to inventory.
"""
if
isinstance
(
self
.
resource
,
list
):
self
.
add_group
(
self
.
resource
,
'my_group'
)
elif
isinstance
(
self
.
resource
,
dict
):
for
groupname
,
hosts
in
self
.
resource
.
iteritems
():
self
.
add_group
(
hosts
,
groupname
)
class
Command
(
MyInventory
):
...
...
@@ -77,7 +98,6 @@ class Command(MyInventory):
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
Command
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
run
(
self
,
command
,
module_name
=
"command"
,
timeout
=
5
,
forks
=
10
):
"""
...
...
@@ -99,7 +119,6 @@ class Command(MyInventory):
self
.
results
=
hoc
.
run
()
return
self
.
stdout
@property
def
raw_results
(
self
):
"""
...
...
@@ -107,7 +126,6 @@ class Command(MyInventory):
"""
return
self
.
results
@property
def
exec_time
(
self
):
"""
...
...
@@ -121,7 +139,6 @@ class Command(MyInventory):
"end"
:
value
.
get
(
"end"
),
"delta"
:
value
.
get
(
"delta"
),}
return
result
@property
def
stdout
(
self
):
...
...
@@ -133,7 +150,6 @@ class Command(MyInventory):
for
key
,
value
in
all
.
iteritems
():
result
[
key
]
=
value
.
get
(
"stdout"
)
return
result
@property
def
stderr
(
self
):
...
...
@@ -163,7 +179,6 @@ class Tasks(Command):
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
Tasks
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
__run
(
self
,
module_args
,
module_name
=
"command"
,
timeout
=
5
,
forks
=
10
):
"""
run command from andible ad-hoc.
...
...
@@ -180,41 +195,81 @@ class Tasks(Command):
self
.
results
=
hoc
.
run
()
def
push_key
(
self
,
user
,
key_path
):
@property
def
msg
(
self
):
"""
push the ssh authorized key to target.
get the contacted and dark msg
"""
module_args
=
'user="
%
s" key="{{ lookup("file", "
%
s") }}"'
%
(
user
,
key_path
)
self
.
__run
(
module_args
,
"authorized_key"
)
msg
=
{}
for
result
in
[
"contacted"
,
"dark"
]:
all
=
self
.
results
.
get
(
result
)
for
key
,
value
in
all
.
iteritems
():
if
value
.
get
(
"msg"
):
msg
[
key
]
=
value
.
get
(
"msg"
)
return
msg
return
{
"status"
:
"ok"
}
if
msg
else
{
"status"
:
"failed"
,
"msg"
:
msg
}
def
push_key
(
self
,
user
,
key_path
):
"""
push the ssh authorized key to target.
"""
module_args
=
'user="
%
s" key="{{ lookup("file", "
%
s") }}"'
%
(
user
,
key_path
)
self
.
__run
(
module_args
,
"authorized_key"
)
return
{
"status"
:
"failed"
,
"msg"
:
self
.
msg
}
if
self
.
msg
else
{
"status"
:
"ok"
}
def
add_user
(
self
,
user
):
def
add_user
(
self
,
user
name
,
password
):
"""
add a host user.
"""
pass
encrypt_pass
=
sha512_crypt
.
encrypt
(
password
)
module_args
=
'name=
%
s shell=/bin/bash password=
%
s'
%
(
username
,
encrypt_pass
)
self
.
__run
(
module_args
,
"user"
)
return
{
"status"
:
"failed"
,
"msg"
:
self
.
msg
}
if
self
.
msg
else
{
"status"
:
"ok"
}
def
del_user
(
self
,
user
):
def
del_user
(
self
,
user
name
):
"""
delete a host user.
"""
pass
module_args
=
'name=
%
s state=absent remove=yes move_home=yes force=yes'
%
(
username
)
self
.
__run
(
module_args
,
"user"
)
return
{
"status"
:
"failed"
,
"msg"
:
self
.
msg
}
if
self
.
msg
else
{
"status"
:
"ok"
}
class
CustomAggregateStats
(
callbacks
.
AggregateStats
):
"""
Holds stats about per-host activity during playbook runs.
"""
def
__init__
(
self
):
super
(
CustomAggregateStats
,
self
)
.
__init__
()
self
.
results
=
[]
def
compute
(
self
,
runner_results
,
setup
=
False
,
poll
=
False
,
ignore_errors
=
False
):
"""
Walk through all results and increment stats.
"""
super
(
CustomAggregateStats
,
self
)
.
compute
(
runner_results
,
setup
,
poll
,
ignore_errors
)
self
.
results
.
append
(
runner_results
)
def
summarize
(
self
,
host
):
"""
Return information about a particular host
"""
summarized_info
=
super
(
CustomAggregateStats
,
self
)
.
summarize
(
host
)
# Adding the info I need
summarized_info
[
'result'
]
=
self
.
results
return
summarized_info
class
MyPlaybook
(
MyInventory
):
"""
this is my playbook object for execute playbook.
...
...
@@ -223,11 +278,32 @@ class MyPlaybook(MyInventory):
super
(
MyPlaybook
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
deploy
(
self
):
def
run
(
self
,
playbook_relational_path
):
"""
run ansible playbook,
only surport relational path.
"""
stats
=
CustomAggregateStats
()
playbook_cb
=
callbacks
.
PlaybookCallbacks
(
verbose
=
utils
.
VERBOSITY
)
runner_cb
=
callbacks
.
PlaybookRunnerCallbacks
(
stats
,
verbose
=
utils
.
VERBOSITY
)
playbook_path
=
os
.
path
.
join
(
ANSIBLE_DIR
,
playbook_relational_path
)
pb
=
PlayBook
(
playbook
=
playbook_path
,
stats
=
stats
,
callbacks
=
playbook_cb
,
runner_callbacks
=
runner_cb
,
inventory
=
self
.
inventory
,
check
=
True
)
self
.
results
=
pb
.
run
()
@property
def
raw_results
(
self
):
"""
use ansible playbook to deploy a applicatio
n.
get the raw results after playbook ru
n.
"""
pas
s
return
self
.
result
s
class
App
(
MyPlaybook
):
...
...
@@ -240,15 +316,13 @@ class App(MyPlaybook):
if
__name__
==
"__main__"
:
resource
=
[
{
"hostname"
:
"192.168.10.128"
,
"port"
:
"22"
,
"username"
:
"root"
,
"password"
:
"xxx"
}]
task
=
Tasks
(
resource
)
print
task
.
push_key
(
'root'
,
'/root/.ssh/id_rsa.pub'
)
resource
=
{
"test"
:
[{
"hostname"
:
"192.168.10.128"
,
"port"
:
"22"
,
"username"
:
"root"
,
"password"
:
"xxx"
}]}
playbook
=
MyPlaybook
(
resource
)
playbook
.
run
(
'test.yml'
)
print
playbook
.
raw_results
# print task.add_user('test', 'mypass')
# print task.del_user('test')
# print task.push_key('root', '/root/.ssh/id_rsa.pub')
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