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
9cd492be
Commit
9cd492be
authored
Apr 18, 2012
by
Michael DeHaan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
make all templating happen locally, so no jinja2 deps are ever required
parent
30d06dbc
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
26 additions
and
151 deletions
+26
-151
lib/ansible/runner.py
+22
-35
library/template
+4
-116
No files found.
lib/ansible/runner.py
View file @
9cd492be
...
@@ -28,6 +28,7 @@ import traceback
...
@@ -28,6 +28,7 @@ import traceback
import
tempfile
import
tempfile
import
subprocess
import
subprocess
import
getpass
import
getpass
import
base64
import
ansible.constants
as
C
import
ansible.constants
as
C
import
ansible.connection
import
ansible.connection
...
@@ -456,13 +457,7 @@ class Runner(object):
...
@@ -456,13 +457,7 @@ class Runner(object):
if
source
is
None
or
dest
is
None
:
if
source
is
None
or
dest
is
None
:
return
(
host
,
True
,
dict
(
failed
=
True
,
msg
=
"src and dest are required"
),
''
)
return
(
host
,
True
,
dict
(
failed
=
True
,
msg
=
"src and dest are required"
),
''
)
if
metadata
is
None
:
# apply templating to source argument so vars can be used in the path
if
self
.
remote_user
==
'root'
:
metadata
=
'/etc/ansible/setup'
else
:
metadata
=
'~/.ansible/setup'
# apply templating to source argument
inject
=
self
.
setup_cache
.
get
(
conn
.
host
,{})
inject
=
self
.
setup_cache
.
get
(
conn
.
host
,{})
source
=
utils
.
template
(
source
,
inject
)
source
=
utils
.
template
(
source
,
inject
)
...
@@ -470,40 +465,32 @@ class Runner(object):
...
@@ -470,40 +465,32 @@ class Runner(object):
if
not
self
.
is_playbook
:
if
not
self
.
is_playbook
:
# templating remotely, since we don't have the benefit of SETUP_CACHE
# not running from a playbook so we have to fetch the remote
# TODO: maybe just fetch the setup file to a tempfile
# setup file contents before proceeding...
if
metadata
is
None
:
# first copy the source template over
if
self
.
remote_user
==
'root'
:
temppath
=
tmp
+
os
.
path
.
split
(
source
)[
-
1
]
metadata
=
'/etc/ansible/setup'
conn
.
put_file
(
utils
.
path_dwim
(
self
.
basedir
,
source
),
temppath
)
# install the template module
template_module
=
self
.
_transfer_module
(
conn
,
tmp
,
'template'
)
# transfer module vars
if
self
.
module_vars
:
vars
=
utils
.
bigjson
(
self
.
module_vars
)
vars_path
=
self
.
_transfer_str
(
conn
,
tmp
,
'module_vars'
,
vars
)
vars_arg
=
" vars=
%
s"
%
(
vars_path
)
else
:
else
:
vars_arg
=
""
metadata
=
'~/.ansible/setup'
# run the template module
args
=
"src=
%
s dest=
%
s metadata=
%
s
%
s"
%
(
temppath
,
dest
,
metadata
,
vars_arg
)
(
result1
,
err
,
executed
)
=
self
.
_execute_module
(
conn
,
tmp
,
template_module
,
args
)
(
host
,
ok
,
data
,
err
)
=
self
.
_return_from_module
(
conn
,
host
,
result1
,
err
,
executed
)
else
:
# install the template module
# templating LOCALLY to avoid Jinja2 dependency on nodes inside playbook runs
slurp_module
=
self
.
_transfer_module
(
conn
,
tmp
,
'slurp'
)
# non-playbook path can be moved to use this IF it is willing to fetch
# the metadata file first
# run the slurp module to get the metadata file
args
=
"src=
%
s"
%
metadata
(
result1
,
err
,
executed
)
=
self
.
_execute_module
(
conn
,
tmp
,
slurp_module
,
args
)
result1
=
utils
.
json_loads
(
result1
)
if
not
'content'
in
result1
or
result1
.
get
(
'encoding'
,
'base64'
)
!=
'base64'
:
result1
[
'failed'
]
=
True
return
self
.
_return_from_module
(
conn
,
host
,
result1
,
err
,
executed
)
content
=
base64
.
b64decode
(
result1
[
'content'
])
inject
=
utils
.
json_loads
(
content
)
# install the template module
# install the template module
copy_module
=
self
.
_transfer_module
(
conn
,
tmp
,
'copy'
)
copy_module
=
self
.
_transfer_module
(
conn
,
tmp
,
'copy'
)
# playbooks can template locally to avoid the jinja2 dependenc
y
# template the source data locall
y
source_data
=
file
(
utils
.
path_dwim
(
self
.
basedir
,
source
))
.
read
()
source_data
=
file
(
utils
.
path_dwim
(
self
.
basedir
,
source
))
.
read
()
resultant
=
''
resultant
=
''
try
:
try
:
resultant
=
utils
.
template
(
source_data
,
inject
)
resultant
=
utils
.
template
(
source_data
,
inject
)
...
@@ -516,7 +503,7 @@ class Runner(object):
...
@@ -516,7 +503,7 @@ class Runner(object):
(
result1
,
err
,
executed
)
=
self
.
_execute_module
(
conn
,
tmp
,
copy_module
,
args
)
(
result1
,
err
,
executed
)
=
self
.
_execute_module
(
conn
,
tmp
,
copy_module
,
args
)
(
host
,
ok
,
data
,
err
)
=
self
.
_return_from_module
(
conn
,
host
,
result1
,
err
,
executed
)
(
host
,
ok
,
data
,
err
)
=
self
.
_return_from_module
(
conn
,
host
,
result1
,
err
,
executed
)
# modify file attribs if needed
if
ok
:
if
ok
:
return
self
.
_chain_file_module
(
conn
,
tmp
,
data
,
err
,
options
,
executed
)
return
self
.
_chain_file_module
(
conn
,
tmp
,
data
,
err
,
options
,
executed
)
else
:
else
:
...
...
library/template
View file @
9cd492be
...
@@ -17,120 +17,8 @@
...
@@ -17,120 +17,8 @@
# You should have received a copy of the GNU General Public License
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import
sys
# hey the Ansible template module isn't really a remote transferred
import
os
# module. All the magic happens in Runner.py making use of the
import
jinja2
# copy module, and if not running from a playbook, also the 'slurp'
import
shlex
# module.
try
:
import
json
except
ImportError
:
import
simplejson
as
json
environment
=
jinja2
.
Environment
()
# ===========================================
# convert arguments of form a=b c=d
# to a dictionary
# FIXME: make more idiomatic
if
len
(
sys
.
argv
)
==
1
:
sys
.
exit
(
1
)
argfile
=
sys
.
argv
[
1
]
if
not
os
.
path
.
exists
(
argfile
):
sys
.
exit
(
1
)
items
=
shlex
.
split
(
open
(
argfile
,
'r'
)
.
read
())
params
=
{}
for
x
in
items
:
(
k
,
v
)
=
x
.
split
(
"="
)
params
[
k
]
=
v
source
=
params
[
'src'
]
dest
=
params
[
'dest'
]
metadata
=
params
.
get
(
'metadata'
,
'/etc/ansible/setup'
)
metadata
=
os
.
path
.
expanduser
(
metadata
)
module_vars
=
params
.
get
(
'vars'
)
# 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
#data = {}
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
module_vars
:
try
:
f
=
open
(
module_vars
)
vars
=
json
.
loads
(
f
.
read
())
data
.
update
(
vars
)
f
.
close
()
except
:
print
json
.
dumps
({
"failed"
:
1
,
"msg"
:
"Failed to parse/load
%
s."
%
module_vars
})
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
()
if
os
.
path
.
isdir
(
dest
):
print
json
.
dumps
({
"failed"
:
1
,
"msg"
:
"Destination is a directory"
})
sys
.
exit
(
1
)
# 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
()
.
split
()[
0
]
try
:
# call Jinja2 here and save the new template file
template
=
environment
.
from_string
(
source
)
data_out
=
template
.
render
(
data
)
except
jinja2
.
TemplateError
,
e
:
print
json
.
dumps
({
"failed"
:
True
,
"msg"
:
e
.
message
})
sys
.
exit
(
1
)
f
=
open
(
dest
,
"w+"
)
f
.
write
(
data_out
)
f
.
close
()
# record m5sum and return success and whether things have changed
md5sum2
=
os
.
popen
(
"md5sum
%
s"
%
dest
)
.
read
()
.
split
()[
0
]
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