now get_url defaults to module temp dir (#36218)
* now get_url and other modules default to module temp dir also fixed 'bare' exception * allow modules to work with older versions * updated docs per feedback
This commit is contained in:
parent
0bbea9a579
commit
c119d54e4a
7 changed files with 15 additions and 14 deletions
|
@ -86,6 +86,7 @@ See [Porting Guide](https://docs.ansible.com/ansible/devel/porting_guides/portin
|
||||||
* The ANSIBLE_REMOTE_TMP environment variable has been added to supplement (and
|
* The ANSIBLE_REMOTE_TMP environment variable has been added to supplement (and
|
||||||
override) ANSIBLE_REMOTE_TEMP. This matches with the spelling of the config
|
override) ANSIBLE_REMOTE_TEMP. This matches with the spelling of the config
|
||||||
value. ANSIBLE_REMOTE_TEMP will be deprecated in the future.
|
value. ANSIBLE_REMOTE_TEMP will be deprecated in the future.
|
||||||
|
* A few modules were updated to put temporary files in the existing temp dir already created for the module itself, including get_url, assemble, uri and yum.
|
||||||
|
|
||||||
#### Removed Modules (previously deprecated):
|
#### Removed Modules (previously deprecated):
|
||||||
* accelerate.
|
* accelerate.
|
||||||
|
|
|
@ -107,9 +107,9 @@ from ansible.module_utils.six import b
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
|
||||||
|
|
||||||
def assemble_from_fragments(src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False):
|
def assemble_from_fragments(src_path, delimiter=None, compiled_regexp=None, ignore_hidden=False, tmpdir=None):
|
||||||
''' assemble a file from a directory of fragments '''
|
''' assemble a file from a directory of fragments '''
|
||||||
tmpfd, temp_path = tempfile.mkstemp()
|
tmpfd, temp_path = tempfile.mkstemp(dir=tmpdir)
|
||||||
tmp = os.fdopen(tmpfd, 'wb')
|
tmp = os.fdopen(tmpfd, 'wb')
|
||||||
delimit_me = False
|
delimit_me = False
|
||||||
add_newline = False
|
add_newline = False
|
||||||
|
@ -204,7 +204,7 @@ def main():
|
||||||
if validate and "%s" not in validate:
|
if validate and "%s" not in validate:
|
||||||
module.fail_json(msg="validate must contain %%s: %s" % validate)
|
module.fail_json(msg="validate must contain %%s: %s" % validate)
|
||||||
|
|
||||||
path = assemble_from_fragments(src, delimiter, compiled_regexp, ignore_hidden)
|
path = assemble_from_fragments(src, delimiter, compiled_regexp, ignore_hidden, getattr(module, 'tmpdir', None))
|
||||||
path_hash = module.sha1(path)
|
path_hash = module.sha1(path)
|
||||||
result['checksum'] = path_hash
|
result['checksum'] = path_hash
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ from ansible.module_utils._text import to_bytes
|
||||||
|
|
||||||
def write_changes(module, contents, path):
|
def write_changes(module, contents, path):
|
||||||
|
|
||||||
tmpfd, tmpfile = tempfile.mkstemp()
|
tmpfd, tmpfile = tempfile.mkstemp(dir=getattr(module, 'tmpdir', None))
|
||||||
f = os.fdopen(tmpfd, 'wb')
|
f = os.fdopen(tmpfd, 'wb')
|
||||||
f.write(contents)
|
f.write(contents)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
|
@ -154,7 +154,7 @@ from ansible.module_utils.basic import AnsibleModule
|
||||||
|
|
||||||
def write_changes(module, contents, path):
|
def write_changes(module, contents, path):
|
||||||
|
|
||||||
tmpfd, tmpfile = tempfile.mkstemp()
|
tmpfd, tmpfile = tempfile.mkstemp(dir=getattr(module, 'tmpdir', None))
|
||||||
f = os.fdopen(tmpfd, 'wb')
|
f = os.fdopen(tmpfd, 'wb')
|
||||||
f.write(contents)
|
f.write(contents)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
|
@ -49,7 +49,8 @@ options:
|
||||||
tmp_dest:
|
tmp_dest:
|
||||||
description:
|
description:
|
||||||
- Absolute path of where temporary file is downloaded to.
|
- Absolute path of where temporary file is downloaded to.
|
||||||
- Defaults to C(TMPDIR), C(TEMP) or C(TMP) env variables or a platform specific value.
|
- When run on Ansible 2.5 or greater, path defaults to ansible's remote_tmp setting
|
||||||
|
- When run on Ansible prior to 2.5, it defaults to C(TMPDIR), C(TEMP) or C(TMP) env variables or a platform specific value.
|
||||||
- U(https://docs.python.org/2/library/tempfile.html#tempfile.tempdir)
|
- U(https://docs.python.org/2/library/tempfile.html#tempfile.tempdir)
|
||||||
version_added: '2.1'
|
version_added: '2.1'
|
||||||
force:
|
force:
|
||||||
|
@ -338,18 +339,17 @@ def url_get(module, url, dest, use_proxy, last_mod_time, force, timeout=10, head
|
||||||
module.fail_json(msg="%s is a file but should be a directory." % tmp_dest)
|
module.fail_json(msg="%s is a file but should be a directory." % tmp_dest)
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg="%s directory does not exist." % tmp_dest)
|
module.fail_json(msg="%s directory does not exist." % tmp_dest)
|
||||||
|
|
||||||
fd, tempname = tempfile.mkstemp(dir=tmp_dest)
|
|
||||||
else:
|
else:
|
||||||
fd, tempname = tempfile.mkstemp()
|
tmp_dest = getattr(module, 'tmpdir', None)
|
||||||
|
|
||||||
|
fd, tempname = tempfile.mkstemp(dir=tmp_dest)
|
||||||
|
|
||||||
f = os.fdopen(fd, 'wb')
|
f = os.fdopen(fd, 'wb')
|
||||||
try:
|
try:
|
||||||
shutil.copyfileobj(rsp, f)
|
shutil.copyfileobj(rsp, f)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
os.remove(tempname)
|
os.remove(tempname)
|
||||||
module.fail_json(msg="failed to create temporary content file: %s" % to_native(e),
|
module.fail_json(msg="failed to create temporary content file: %s" % to_native(e), exception=traceback.format_exc())
|
||||||
exception=traceback.format_exc())
|
|
||||||
f.close()
|
f.close()
|
||||||
rsp.close()
|
rsp.close()
|
||||||
return tempname, info
|
return tempname, info
|
||||||
|
@ -413,7 +413,7 @@ def main():
|
||||||
if module.params['headers']:
|
if module.params['headers']:
|
||||||
try:
|
try:
|
||||||
headers = dict(item.split(':', 1) for item in module.params['headers'].split(','))
|
headers = dict(item.split(':', 1) for item in module.params['headers'].split(','))
|
||||||
except:
|
except Exception:
|
||||||
module.fail_json(msg="The header parameter requires a key:value,key:value syntax to be properly parsed.")
|
module.fail_json(msg="The header parameter requires a key:value,key:value syntax to be properly parsed.")
|
||||||
else:
|
else:
|
||||||
headers = None
|
headers = None
|
||||||
|
|
|
@ -241,7 +241,7 @@ JSON_CANDIDATES = ('text', 'json', 'javascript')
|
||||||
|
|
||||||
def write_file(module, url, dest, content):
|
def write_file(module, url, dest, content):
|
||||||
# create a tempfile with some test content
|
# create a tempfile with some test content
|
||||||
fd, tmpsrc = tempfile.mkstemp()
|
fd, tmpsrc = tempfile.mkstemp(dir=getattr(module, 'tmpdir', None))
|
||||||
f = open(tmpsrc, 'wb')
|
f = open(tmpsrc, 'wb')
|
||||||
try:
|
try:
|
||||||
f.write(content)
|
f.write(content)
|
||||||
|
|
|
@ -316,7 +316,7 @@ def ensure_yum_utils(module):
|
||||||
def fetch_rpm_from_url(spec, module=None):
|
def fetch_rpm_from_url(spec, module=None):
|
||||||
# download package so that we can query it
|
# download package so that we can query it
|
||||||
package_name, _ = os.path.splitext(str(spec.rsplit('/', 1)[1]))
|
package_name, _ = os.path.splitext(str(spec.rsplit('/', 1)[1]))
|
||||||
package_file = tempfile.NamedTemporaryFile(prefix=package_name, suffix='.rpm', delete=False)
|
package_file = tempfile.NamedTemporaryFile(dir=getattr(module, 'tmpdir', None), prefix=package_name, suffix='.rpm', delete=False)
|
||||||
module.add_cleanup_file(package_file.name)
|
module.add_cleanup_file(package_file.name)
|
||||||
try:
|
try:
|
||||||
rsp, info = fetch_url(module, spec)
|
rsp, info = fetch_url(module, spec)
|
||||||
|
|
Loading…
Reference in a new issue