Skip to content

Instantly share code, notes, and snippets.

@aodag
Last active December 31, 2015 02:49
Show Gist options
  • Save aodag/7923756 to your computer and use it in GitHub Desktop.
Save aodag/7923756 to your computer and use it in GitHub Desktop.
ainsible module to install setuptools and pip.
# -*- 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