Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
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
OpenEdx
ansible
Commits
440bac4a
Commit
440bac4a
authored
Feb 24, 2012
by
Michael DeHaan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added remote templating engine using jinja2, see examples/playbook.yml for usage.
Cleanup is due in runner.py
parent
5d6b0280
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
121 additions
and
19 deletions
+121
-19
README.md
+5
-1
lib/ansible/runner.py
+34
-7
library/command
+12
-3
library/setup
+0
-7
library/template
+70
-1
No files found.
README.md
View file @
440bac4a
...
@@ -39,9 +39,13 @@ Requirements
...
@@ -39,9 +39,13 @@ Requirements
For the server the tool is running from,
*only*
:
For the server the tool is running from,
*only*
:
* python 2.6 -- or the 2.4/2.5 backport of the multiprocessing module
* python 2.6 -- or the 2.4/2.5 backport of the multiprocessing module
* PyYAML (if using playbooks)
* PyYAML (i
nstall on 'overlord' i
f using playbooks)
* paramiko
* paramiko
Optional -- If you want to push templates, the nodes need:
* python-jinja2
Inventory file
Inventory file
==============
==============
...
...
lib/ansible/runner.py
View file @
440bac4a
...
@@ -119,7 +119,12 @@ class Runner(object):
...
@@ -119,7 +119,12 @@ class Runner(object):
result
=
self
.
_exec_command
(
conn
,
cmd
)
result
=
self
.
_exec_command
(
conn
,
cmd
)
self
.
_exec_command
(
conn
,
"rm -f
%
s"
%
outpath
)
self
.
_exec_command
(
conn
,
"rm -f
%
s"
%
outpath
)
conn
.
close
()
conn
.
close
()
return
[
host
,
True
,
json
.
loads
(
result
)
]
try
:
return
[
host
,
True
,
json
.
loads
(
result
)
]
except
:
traceback
.
print_exc
()
return
[
host
,
False
,
result
]
elif
self
.
module_name
==
'copy'
:
elif
self
.
module_name
==
'copy'
:
# SFTP file copy module is not really a module
# SFTP file copy module is not really a module
self
.
remote_log
(
conn
,
'COPY remote:
%
s local:
%
s'
%
(
self
.
module_args
[
0
],
self
.
module_args
[
1
]))
self
.
remote_log
(
conn
,
'COPY remote:
%
s local:
%
s'
%
(
self
.
module_args
[
0
],
self
.
module_args
[
1
]))
...
@@ -128,25 +133,47 @@ class Runner(object):
...
@@ -128,25 +133,47 @@ class Runner(object):
ftp
.
close
()
ftp
.
close
()
conn
.
close
()
conn
.
close
()
return
[
host
,
True
,
1
]
return
[
host
,
True
,
1
]
elif
self
.
module_name
==
'template'
:
elif
self
.
module_name
==
'template'
:
# template runs COPY then the template module
# template runs COPY then the template module
# TODO: DRY/refactor these
# TODO: DRY/refactor these
# TODO: things like _copy_module should take the name as a param
# TODO: things like _copy_module should take the name as a param
tempname
=
os
.
path
.
split
(
self
.
module_args
[
0
])[
-
1
]
# TODO: make it possible to override the /etc/ansible/setup file
# location for templating files as non-root
source
=
self
.
module_args
[
0
]
dest
=
self
.
module_args
[
1
]
metadata
=
'/etc/ansible/setup'
# first copy the source template over
tempname
=
os
.
path
.
split
(
source
)[
-
1
]
temppath
=
self
.
_get_tmp_path
(
conn
,
tempname
)
temppath
=
self
.
_get_tmp_path
(
conn
,
tempname
)
self
.
remote_log
(
conn
,
'COPY remote:
%
s local:
%
s'
%
(
s
elf
.
module_args
[
0
]
,
temppath
))
self
.
remote_log
(
conn
,
'COPY remote:
%
s local:
%
s'
%
(
s
ource
,
temppath
))
ftp
=
conn
.
open_sftp
()
ftp
=
conn
.
open_sftp
()
ftp
.
put
(
s
elf
.
module_args
[
0
]
,
temppath
)
ftp
.
put
(
s
ource
,
temppath
)
ftp
.
close
()
ftp
.
close
()
# install the template module
self
.
module_name
=
'template'
self
.
module_name
=
'template'
self
.
module_args
=
[
s
elf
.
module_args
[
0
]
,
temppath
]
self
.
module_args
=
[
s
ource
,
temppath
]
outpath
=
self
.
_copy_module
(
conn
)
outpath
=
self
.
_copy_module
(
conn
)
# run the template module
self
.
module_args
=
[
temppath
,
dest
,
metadata
]
self
.
_exec_command
(
conn
,
"chmod +x
%
s"
%
outpath
)
self
.
_exec_command
(
conn
,
"chmod +x
%
s"
%
outpath
)
result
=
self
.
_exec_command
(
conn
,
self
.
_command
(
outpath
))
result
=
self
.
_exec_command
(
conn
,
self
.
_command
(
outpath
))
self
.
_exec_command
(
conn
,
"rm -f
%
s"
%
outpath
)
self
.
_exec_command
(
conn
,
"rm -f
%
s"
%
outpath
)
self
.
_exec_command
(
conn
,
"rm -f
%
s"
%
temppath
)
# TODO: remove tmppath
conn
.
close
()
conn
.
close
()
return
[
host
,
True
,
json
.
loads
(
result
)
]
try
:
return
[
host
,
True
,
json
.
loads
(
result
)
]
except
:
traceback
.
print_exc
()
return
[
host
,
False
,
result
]
return
[
host
,
False
,
1
]
def
_command
(
self
,
outpath
):
def
_command
(
self
,
outpath
):
''' form up a command string '''
''' form up a command string '''
...
...
library/command
View file @
440bac4a
...
@@ -4,17 +4,26 @@ try:
...
@@ -4,17 +4,26 @@ try:
import
json
import
json
except
ImportError
:
except
ImportError
:
import
simplejson
as
json
import
simplejson
as
json
import
subprocess
import
subprocess
import
sys
import
sys
import
datetime
import
datetime
import
traceback
args
=
sys
.
argv
[
1
:]
args
=
sys
.
argv
[
1
:]
startd
=
datetime
.
datetime
.
now
()
startd
=
datetime
.
datetime
.
now
()
cmd
=
subprocess
.
Popen
(
args
,
shell
=
False
,
try
:
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
cmd
=
subprocess
.
Popen
(
args
,
shell
=
False
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
out
,
err
=
cmd
.
communicate
()
except
:
print
json
.
dumps
({
"failed"
:
1
,
"traceback"
:
traceback
.
format_exc
()
})
sys
.
exit
(
1
)
out
,
err
=
cmd
.
communicate
()
endd
=
datetime
.
datetime
.
now
()
endd
=
datetime
.
datetime
.
now
()
delta
=
endd
-
startd
delta
=
endd
-
startd
...
...
library/setup
View file @
440bac4a
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
ANSIBLE_DIR
=
"/etc/ansible"
ANSIBLE_DIR
=
"/etc/ansible"
ANSIBLE_SETUP
=
"/etc/ansible/setup"
ANSIBLE_SETUP
=
"/etc/ansible/setup"
ANSIBLE_TEMPLATES
=
"/srv/ansible/templates"
import
sys
import
sys
import
os
import
os
...
@@ -18,12 +17,6 @@ except ImportError:
...
@@ -18,12 +17,6 @@ except ImportError:
input_data
=
sys
.
argv
[
1
:]
input_data
=
sys
.
argv
[
1
:]
new_options
=
dict
([
x
.
split
(
"="
)
for
x
in
input_data
])
new_options
=
dict
([
x
.
split
(
"="
)
for
x
in
input_data
])
# make a directory to store templates
# if it does not already exist
if
not
os
.
path
.
exists
(
ANSIBLE_TEMPLATES
):
os
.
makedirs
(
ANSIBLE_TEMPLATES
)
# create the config dir if it doesn't exist
# create the config dir if it doesn't exist
if
not
os
.
path
.
exists
(
ANSIBLE_DIR
):
if
not
os
.
path
.
exists
(
ANSIBLE_DIR
):
...
...
library/template
View file @
440bac4a
#!/usr/bin/python
#!/usr/bin/python
print
{}
import
sys
import
os
import
jinja2
try
:
import
json
except
ImportError
:
import
simplejson
as
json
source
=
sys
.
argv
[
1
]
dest
=
sys
.
argv
[
2
]
metadata
=
sys
.
argv
[
3
]
# raise an error if there is no template metadata
if
not
os
.
path
.
exists
(
metadata
):
print
json
.
dumps
({
"failed"
:
1
,
"msg"
:
"Missing
%
s, did you run the setup module yet?"
%
metadata
})
sys
.
exit
(
1
)
# raise an error if we can't parse the template metadata
try
:
f
=
open
(
metadata
)
data
=
json
.
loads
(
f
.
read
())
f
.
close
()
except
:
print
json
.
dumps
({
"failed"
:
1
,
"msg"
:
"Failed to parse/load
%
s, rerun the setup module?"
%
metadata
})
sys
.
exit
(
1
)
if
not
os
.
path
.
exists
(
source
):
print
json
.
dumps
({
"failed"
:
1
,
"msg"
:
"Source template could not be read:
%
s"
%
source
})
sys
.
exit
(
1
)
source
=
file
(
source
)
.
read
()
# record md5sum of original source file so we can report if it changed
changed
=
False
md5sum
=
None
if
os
.
path
.
exists
(
dest
):
md5sum
=
os
.
popen
(
"md5sum
%
s"
%
dest
)
.
read
()
# call Jinja2 here and save the new template file
template
=
jinja2
.
Template
(
source
)
data_out
=
template
.
render
(
data
)
f
=
open
(
dest
,
"w+"
)
f
.
write
(
data_out
)
f
.
close
()
# TODO: catch templating errors and do not clobber the file on the
# other end unless things were successful
# record m5sum and return success and whether things have changed
md5sum2
=
os
.
popen
(
"md5sum
%
s"
%
dest
)
.
read
()
if
md5sum
!=
md5sum2
:
changed
=
True
# mission accomplished
print
json
.
dumps
({
"md5sum"
:
md5sum2
,
"changed"
:
changed
})
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