From 03eca250d99e87ce963798ac18017a80ebd21c30 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Wed, 15 Nov 2017 13:12:54 -0500 Subject: [PATCH] Fix an openshift issue writing the inventory file Openshift was throwing an error here, though I'm not sure why it makes a whole lot of difference to call fdopen() vs open(). This was introduced when this method was unified under the new ansible-inventory system. This fixes it for all cases. mkstemp(), while not necessary, is a useful addition to keep from leaking inventory details unnecessarily. --- awx/main/tasks.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 4e62f52298..a32c9dca5d 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -678,11 +678,12 @@ class BaseTask(LogErrorsTask): return False def build_inventory(self, instance, **kwargs): - path = os.path.join(kwargs['private_data_dir'], 'inventory') - with open(path, 'w') as f: - json_data = json.dumps(instance.inventory.get_script_data(hostvars=True)) - f.write('#! /usr/bin/env python\n# -*- coding: utf-8 -*-\nprint %r\n' % json_data) - os.chmod(path, stat.S_IRUSR | stat.S_IXUSR) + json_data = json.dumps(instance.inventory.get_script_data(hostvars=True)) + handle, path = tempfile.mkstemp(dir=kwargs.get('private_data_dir', None)) + f = os.fdopen(handle, 'w') + f.write('#! /usr/bin/env python\n# -*- coding: utf-8 -*-\nprint %r\n' % json_data) + f.close() + os.chmod(path, stat.S_IRUSR | stat.S_IXUSR | stat.S_IWUSR) return path def build_args(self, instance, **kwargs):