#!/usr/bin/python # -*- coding: utf-8 -*- # (c) 2012, Matt Wright # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . # def _ensure_virtualenv(env, virtualenv): if os.path.exists(os.path.join(env, 'bin', 'activate')): return 0, '', '' else: return _run('%s %s' % (virtualenv, env)) def _is_package_installed(name, easy_install): cmd = '%s --dry-run %s' % (easy_install, name) rc, status_stdout, status_stderr = _run(cmd) return not ('Reading' in status_stdout or 'Downloading' in status_stdout) def _run(cmd): # returns (rc, stdout, stderr) from shell command process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout, stderr = process.communicate() return (process.returncode, stdout, stderr) def main(): arg_spec = dict( name=dict(required=True), virtualenv=dict(default=None, required=False) ) module = AnsibleModule(argument_spec=arg_spec) name = module.params['name'] env = module.params['virtualenv'] easy_install = module.get_bin_path('easy_install', True, ['%s/bin' % env]) rc = 0 err = '' out = '' if env: virtualenv = module.get_bin_path('virtualenv', True) if virtualenv is None: module.fail_json(msg='virtualenv is not installed') rc_venv, out_venv, err_venv = _ensure_virtualenv(env, virtualenv) rc += rc_venv out += out_venv err += err_venv cmd = None changed = False installed = _is_package_installed(name, easy_install) if not installed: cmd = '%s %s' % (easy_install, name) rc_pip, out_pip, err_pip = _run(cmd) rc += rc_pip out += out_pip err += err_pip changed = True if rc != 0: module.fail_json(msg=err, cmd=cmd) module.exit_json(changed=changed, binary=easy_install, name=name, virtualenv=env) # this is magic, see lib/ansible/module_common.py #<> main()