Last active
December 31, 2015 02:49
-
-
Save aodag/7923756 to your computer and use it in GitHub Desktop.
ainsible module to install setuptools and pip.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
install setuptools, pip, virtualenv | |
- ez_setup.py | |
- get-pip.py | |
""" | |
import re | |
import os | |
import shutil | |
import tempfile | |
import urllib2 | |
EZ_SETUP_URL = 'https://bitbucket.org/pypa/setuptools/raw/{version}/ez_setup.py' | |
GET_PIP_URL = 'https://raw.github.com/pypa/pip/{version}/contrib/get-pip.py' | |
PIP_VERSION_RE = re.compile(r'^pip\s+(?P<version>[0-9.]+)') | |
SETUPTOOLS_VERSION_RE = re.compile(r'^setuptools\s+(?P<version>[0-9.]+)') | |
def _installed_setuptools_version(module): | |
rc, out, err = module.run_command('easy_install --version') | |
m = SETUPTOOLS_VERSION_RE.search(out) | |
if m is None: | |
return None | |
return m.groupdict()['version'] | |
def _installed_pip_version(module): | |
rc, out_pip, err_pip = module.run_command('pip --version') | |
m = PIP_VERSION_RE.search(out_pip) | |
if m is None: | |
return None | |
return m.groupdict()['version'] | |
def install_setuptools(module, version): | |
url = EZ_SETUP_URL.format(version=version) | |
d = tempfile.mkdtemp() | |
try: | |
# get ez_setup.py | |
ez_setup = urllib2.urlopen(url) | |
ez_setup_script = os.path.join(d, 'ez_setup.py') | |
with open(ez_setup_script, "w") as f: | |
f.write(ez_setup.read()) | |
# run ez_setup | |
return module.run_command('python {script}'.format(script=ez_setup_script)) | |
finally: | |
shutil.rmtree(d) | |
def install_pip(module, version): | |
url = GET_PIP_URL.format(version=version) | |
d = tempfile.mkdtemp() | |
try: | |
# get get-pip | |
get_pip = urllib2.urlopen(url) | |
get_pip_script = os.path.join(d, 'get-pip.py') | |
with open(get_pip_script, "w") as f: | |
f.write(get_pip.read()) | |
# run get-pip | |
return module.run_command('python {script}'.format(script=get_pip_script)) | |
finally: | |
shutil.rmtree(d) | |
def main(): | |
module = AnsibleModule( | |
argument_spec = dict( | |
state = dict(default='present', choices=['present']), | |
setuptools_version = dict(default='latest'), | |
pip_version = dict(default='latest'), | |
) | |
) | |
changed = False | |
setuptools_version = module.params['setuptools_version'] | |
pip_version = module.params['pip_version'] | |
if setuptools_version == 'latest': | |
setuptools_version = 'tip' # by hg | |
if pip_version == 'latest': | |
pip_version = 'develop' | |
current_setuptools_version = _installed_setuptools_version(module) | |
if current_setuptools_version != setuptools_version: | |
rc, out, err = install_setuptools(module, setuptools_version) | |
if rc > 0: | |
module.fail_json(msg=err) | |
current_setuptools_version = _installed_setuptools_version(module) | |
changed = True | |
current_pip_version = _installed_pip_version(module) | |
if current_pip_version != pip_version: | |
rc, out, err = install_pip(module, pip_version) | |
if rc > 0: | |
module.fail_json(msg=err) | |
current_pip_version = _installed_pip_version(module) | |
changed = True | |
module.exit_json(changed=changed, | |
pip_version=current_pip_version, | |
setuptools_version=current_setuptools_version) | |
# import module snippets | |
from ansible.module_utils.basic import * | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment