Skip to content
Snippets Groups Projects
merge_configs.py 3.18 KiB
Newer Older
  • Learn to ignore specific revisions
  • SamYaple's avatar
    SamYaple committed
    #!/usr/bin/python
    
    # Copyright 2015 Sam Yaple
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    import ConfigParser
    
    import inspect
    
    SamYaple's avatar
    SamYaple committed
    import os
    
    Lu lei's avatar
    Lu lei committed
    from six import StringIO
    
    SamYaple's avatar
    SamYaple committed
    
    
    from ansible.plugins import action
    
    class ActionModule(action.ActionBase):
    
    SamYaple's avatar
    SamYaple committed
    
        TRANSFERS_FILES = True
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
        def read_config(self, source, config):
    
    SamYaple's avatar
    SamYaple committed
            # Only use config if present
            if os.access(source, os.R_OK):
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
                with open(source, 'r') as f:
                    template_data = f.read()
                result = self._templar.template(template_data)
                fakefile = StringIO(result)
    
    SamYaple's avatar
    SamYaple committed
                config.readfp(fakefile)
                fakefile.close()
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
        def run(self, tmp=None, task_vars=None):
    
            if task_vars is None:
                task_vars = dict()
            result = super(ActionModule, self).run(tmp, task_vars)
    
    
            # NOTE(jeffrey4l): Ansible 2.1 add a remote_user param to the
            # _make_tmp_path function.  inspect the number of the args here. In
            # this way, ansible 2.0 and ansible 2.1 are both supported
            make_tmp_path_args = inspect.getargspec(self._make_tmp_path)[0]
            if not tmp and len(make_tmp_path_args) == 1:
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
                tmp = self._make_tmp_path()
    
            if not tmp and len(make_tmp_path_args) == 2:
    
                remote_user = (task_vars.get('ansible_user')
    
                               or self._play_context.remote_user)
                tmp = self._make_tmp_path(remote_user)
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
    
            sources = self._task.args.get('sources', None)
            extra_vars = self._task.args.get('vars', list())
    
    
    SamYaple's avatar
    SamYaple committed
            if not isinstance(sources, list):
                sources = [sources]
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
            temp_vars = task_vars.copy()
            temp_vars.update(extra_vars)
    
    
            config = ConfigParser.ConfigParser()
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
            old_vars = self._templar._available_variables
            self._templar.set_available_variables(temp_vars)
    
    SamYaple's avatar
    SamYaple committed
    
            for source in sources:
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
                self.read_config(source, config)
    
    SamYaple's avatar
    SamYaple committed
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
            self._templar.set_available_variables(old_vars)
    
    SamYaple's avatar
    SamYaple committed
            # Dump configparser to string via an emulated file
    
    SamYaple's avatar
    SamYaple committed
            fakefile = StringIO()
            config.write(fakefile)
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
    
            remote_path = self._connection._shell.join_path(tmp, 'src')
            xfered = self._transfer_data(remote_path, fakefile.getvalue())
    
    SamYaple's avatar
    SamYaple committed
            fakefile.close()
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
            new_module_args = self._task.args.copy()
    
            new_module_args.pop('vars', None)
            new_module_args.pop('sources', None)
    
    SamYaple's avatar
    SamYaple committed
    
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
            new_module_args.update(
                dict(
                    src=xfered
                )
    
    SamYaple's avatar
    SamYaple committed
            )
    
    Jeffrey Zhang's avatar
    Jeffrey Zhang committed
    
            result.update(self._execute_module(module_name='copy',
                                               module_args=new_module_args,
                                               task_vars=task_vars,
                                               tmp=tmp))
            return result