Commit 1c8339abbf9ed02041baa81fdda64d058e30240a

Authored by Sergio Oliveira
2 parents 733d4cda 7c6bb027

Merge branch 'update_puppet' of github.com:colab-community/colab into update_puppet

Showing 2 changed files with 136 additions and 98 deletions   Show diff stats
@@ -9,23 +9,24 @@ from fabric.api import env, run, sudo, local @@ -9,23 +9,24 @@ from fabric.api import env, run, sudo, local
9 from fabric.contrib.files import exists 9 from fabric.contrib.files import exists
10 from fabric.context_managers import prefix, cd, settings, shell_env 10 from fabric.context_managers import prefix, cd, settings, shell_env
11 11
12 -LINUX_DISTRO = ''  
13 DEBIAN_FAMILY = ['debian', 'ubuntu'] 12 DEBIAN_FAMILY = ['debian', 'ubuntu']
14 REDHAT_FAMILY = ['centos', 'fedora'] 13 REDHAT_FAMILY = ['centos', 'fedora']
15 14
16 -DISTRO_CMD = {'debian': ('apt-get', {  
17 - 'install': '-y',  
18 - 'update': '-y',  
19 - }),  
20 - 'redhat': ('yum', {  
21 - 'install': '-y',  
22 - 'update': '-y',  
23 - })  
24 - } 15 +DISTRO_CMD = {
  16 + 'debian': ('apt-get', {
  17 + 'install': '-y',
  18 + 'update': '-y',
  19 + }),
  20 + 'redhat': ('yum', {
  21 + 'install': '-y',
  22 + 'update': '-y',
  23 + })
  24 +}
25 25
26 APP_USER = APP_NAME = VENV_NAME = 'colab' 26 APP_USER = APP_NAME = VENV_NAME = 'colab'
27 REPO_URL = 'git@github.com:colab-community/colab.git' 27 REPO_URL = 'git@github.com:colab-community/colab.git'
28 28
  29 +
29 environments = { 30 environments = {
30 'dev': { 31 'dev': {
31 'hosts': ['127.0.0.1'], 32 'hosts': ['127.0.0.1'],
@@ -47,19 +48,23 @@ WORKON_ENV = '{} && workon {}'.format(SOURCE_VENV, VENV_NAME) @@ -47,19 +48,23 @@ WORKON_ENV = '{} && workon {}'.format(SOURCE_VENV, VENV_NAME)
47 MANAGE_PATH = os.path.join(REPO_PATH, 'src') 48 MANAGE_PATH = os.path.join(REPO_PATH, 'src')
48 SETTINGS_PATH = os.path.join(MANAGE_PATH, APP_NAME) 49 SETTINGS_PATH = os.path.join(MANAGE_PATH, APP_NAME)
49 50
  51 +
50 def get_distro_family(): 52 def get_distro_family():
51 - linux_name = run('python -c "import platform; print platform.dist()[0]"').lower() 53 + cmd = 'python -c "import platform; print platform.dist()[0]"'
  54 + linux_name = run(cmd).lower()
52 if linux_name in DEBIAN_FAMILY: 55 if linux_name in DEBIAN_FAMILY:
53 - return 'debian' 56 + return 'debian'
54 elif linux_name in REDHAT_FAMILY: 57 elif linux_name in REDHAT_FAMILY:
55 - return 'redhat'  
56 - else :  
57 - error(colors.red('Distribuiton `{}` not supported.'.format(linux_name)))  
58 - exit(1) 58 + return 'redhat'
  59 + else:
  60 + error(colors.red('Distribuiton `{}` not supported'.format(linux_name)))
  61 + exit(1)
  62 +
59 63
60 -def cmd(family, command, args = ''): 64 +def cmd(family, command, args=''):
61 pkgmanager, commands = DISTRO_CMD[family] 65 pkgmanager, commands = DISTRO_CMD[family]
62 - return '{} {} {} {}'.format(pkgmanager, command, commands[command], args) 66 + return ' '.join([pkgmanager, command, commands[command], args])
  67 +
63 68
64 @task 69 @task
65 def environment(name=DEFAULT_ENVIRONMENT): 70 def environment(name=DEFAULT_ENVIRONMENT):
@@ -80,9 +85,11 @@ def environment(name=DEFAULT_ENVIRONMENT): @@ -80,9 +85,11 @@ def environment(name=DEFAULT_ENVIRONMENT):
80 env.update(environments[name]) 85 env.update(environments[name])
81 env.environment = name 86 env.environment = name
82 87
83 -def package_install(pkg): 88 +
  89 +def package_install(pkg):
84 family = get_distro_family() 90 family = get_distro_family()
85 - sudo(cmd(family, 'install', pkg )) 91 + sudo(cmd(family, 'install', pkg))
  92 +
86 93
87 def install_requirements(): 94 def install_requirements():
88 with cd(REPO_PATH), prefix(WORKON_ENV): 95 with cd(REPO_PATH), prefix(WORKON_ENV):
@@ -96,12 +103,14 @@ def install_requirements(): @@ -96,12 +103,14 @@ def install_requirements():
96 else: 103 else:
97 run('pip install -r requirements.txt') 104 run('pip install -r requirements.txt')
98 105
  106 +
99 def mkvirtualenv(): 107 def mkvirtualenv():
100 if not exists('~/.virtualenvs/' + VENV_NAME): 108 if not exists('~/.virtualenvs/' + VENV_NAME):
101 with prefix(SOURCE_VENV): 109 with prefix(SOURCE_VENV):
102 run('mkvirtualenv ' + VENV_NAME) 110 run('mkvirtualenv ' + VENV_NAME)
103 return True 111 return True
104 112
  113 +
105 def manage(command): 114 def manage(command):
106 django_settings = env.get('django_settings') 115 django_settings = env.get('django_settings')
107 env_vars = {} 116 env_vars = {}
@@ -112,17 +121,21 @@ def manage(command): @@ -112,17 +121,21 @@ def manage(command):
112 with cd(MANAGE_PATH), prefix(WORKON_ENV): 121 with cd(MANAGE_PATH), prefix(WORKON_ENV):
113 run('python manage.py {}'.format(command)) 122 run('python manage.py {}'.format(command))
114 123
  124 +
115 def syncdb(): 125 def syncdb():
116 manage('syncdb') 126 manage('syncdb')
117 127
  128 +
118 def migrate(): 129 def migrate():
119 manage('migrate') 130 manage('migrate')
120 131
  132 +
121 def collectstatic(): 133 def collectstatic():
122 sudo('mkdir -p /usr/share/nginx/{}'.format(APP_NAME)) 134 sudo('mkdir -p /usr/share/nginx/{}'.format(APP_NAME))
123 sudo('chown {} /usr/share/nginx/{}'.format(env.user, APP_NAME)) 135 sudo('chown {} /usr/share/nginx/{}'.format(env.user, APP_NAME))
124 manage('collectstatic --noinput') 136 manage('collectstatic --noinput')
125 137
  138 +
126 def create_local_settings(): 139 def create_local_settings():
127 with cd(SETTINGS_PATH), settings(user=env.superuser): 140 with cd(SETTINGS_PATH), settings(user=env.superuser):
128 env_local_settings = 'local_settings-{}.py'.format(env.environment) 141 env_local_settings = 'local_settings-{}.py'.format(env.environment)
@@ -131,6 +144,7 @@ def create_local_settings(): @@ -131,6 +144,7 @@ def create_local_settings():
131 run('ln -s {} {}'.format(env_local_settings, 'local_settings.py')) 144 run('ln -s {} {}'.format(env_local_settings, 'local_settings.py'))
132 run('chown {} local_settings.py'.format(env.user)) 145 run('chown {} local_settings.py'.format(env.user))
133 146
  147 +
134 def update_code(): 148 def update_code():
135 if env.is_vagrant: 149 if env.is_vagrant:
136 if not exists(REPO_PATH): 150 if not exists(REPO_PATH):
@@ -143,26 +157,29 @@ def update_code(): @@ -143,26 +157,29 @@ def update_code():
143 with cd(REPO_PATH): 157 with cd(REPO_PATH):
144 run('git pull') 158 run('git pull')
145 159
  160 +
146 @task 161 @task
147 def bootstrap(): 162 def bootstrap():
148 """Bootstrap machine to run fabric tasks""" 163 """Bootstrap machine to run fabric tasks"""
  164 +
149 with settings(user=env.superuser): 165 with settings(user=env.superuser):
150 - family = get_distro_family()  
151 - sudo(cmd(family, 'update'))  
152 -  
153 - if not exists('/usr/bin/git'): 166 + family = get_distro_family()
  167 + sudo(cmd(family, 'update'))
  168 +
  169 + if not exists('/usr/bin/git'):
154 package_install('git-core') 170 package_install('git-core')
155 171
156 if env.is_vagrant: 172 if env.is_vagrant:
157 - groups = ['sudo' ,'vagrant'] 173 + groups = ['sudo', 'vagrant']
158 local('chmod -fR g+w {}'.format(PROJECT_PATH)) 174 local('chmod -fR g+w {}'.format(PROJECT_PATH))
159 else: 175 else:
160 groups = ['sudo'] 176 groups = ['sudo']
161 177
162 - for group in groups:  
163 - sudo('groupadd -f {}'.format(group)) 178 + for group in groups:
  179 + sudo('groupadd -f {}'.format(group))
164 180
165 - sudo('useradd {} -G {} -m -s /bin/bash'.format(APP_USER, ','.join(groups))) 181 + command = 'useradd {} -G {} -m -s /bin/bash'
  182 + sudo(command.format(APP_USER, ','.join(groups)))
166 183
167 ssh_dir = '/home/{0}/.ssh/'.format(APP_USER) 184 ssh_dir = '/home/{0}/.ssh/'.format(APP_USER)
168 if not exists(ssh_dir): 185 if not exists(ssh_dir):
@@ -182,11 +199,13 @@ def bootstrap(): @@ -182,11 +199,13 @@ def bootstrap():
182 sudo('chmod 440 {}'.format(tmp_file)) 199 sudo('chmod 440 {}'.format(tmp_file))
183 sudo('mv {} {}'.format(tmp_file, sudoers_file)) 200 sudo('mv {} {}'.format(tmp_file, sudoers_file))
184 201
  202 +
185 @task 203 @task
186 def provision(): 204 def provision():
187 """Run puppet""" 205 """Run puppet"""
188 206
189 update_code() 207 update_code()
  208 +
190 puppet_path = os.path.join(REPO_PATH, 'puppet/') 209 puppet_path = os.path.join(REPO_PATH, 'puppet/')
191 modules_path = os.path.join(puppet_path, 'modules') 210 modules_path = os.path.join(puppet_path, 'modules')
192 puppet_modules = '{}:/etc/puppet/modules'.format(modules_path) 211 puppet_modules = '{}:/etc/puppet/modules'.format(modules_path)
@@ -205,6 +224,7 @@ def provision(): @@ -205,6 +224,7 @@ def provision():
205 224
206 sudo('puppet apply --modulepath={} {}'.format(puppet_modules, cmd)) 225 sudo('puppet apply --modulepath={} {}'.format(puppet_modules, cmd))
207 226
  227 +
208 @task 228 @task
209 def ssh_keygen(): 229 def ssh_keygen():
210 """Create SSH credentials""" 230 """Create SSH credentials"""
@@ -218,6 +238,7 @@ def ssh_keygen(): @@ -218,6 +238,7 @@ def ssh_keygen():
218 print('') 238 print('')
219 print('Add the key above to your github repository deploy keys') 239 print('Add the key above to your github repository deploy keys')
220 240
  241 +
221 @task 242 @task
222 def deploy(noprovision=False): 243 def deploy(noprovision=False):
223 """Deploy and run the new code (master branch)""" 244 """Deploy and run the new code (master branch)"""
@@ -239,5 +260,6 @@ def deploy(noprovision=False): @@ -239,5 +260,6 @@ def deploy(noprovision=False):
239 260
240 sudo('supervisorctl start all') 261 sudo('supervisorctl start all')
241 262
  263 +
242 # Main 264 # Main
243 environment() 265 environment()
puppet/bootstrap.py
1 -#!/usr/bin/env python2.7 1 +#!/usr/bin/env python
2 2
3 import os 3 import os
4 -import apt  
5 -import apt_pkg 4 +import re
6 import locale 5 import locale
7 import platform 6 import platform
8 import subprocess 7 import subprocess
9 import urllib 8 import urllib
10 9
11 -from apt import debfile  
12 from distutils.version import StrictVersion 10 from distutils.version import StrictVersion
13 from pkg_resources import parse_requirements 11 from pkg_resources import parse_requirements
14 from shutil import copyfile 12 from shutil import copyfile
15 -from subprocess import check_output  
16 13
17 -  
18 -PUPPET_TARGET_VERSION="3.4.3-1" 14 +PUPPET_TARGET_VERSION = "3.6.2"
19 PUPPET_DIR = os.path.join(os.path.dirname(__file__)) 15 PUPPET_DIR = os.path.join(os.path.dirname(__file__))
20 MODULES_FILE_PATH = os.path.join(PUPPET_DIR, 'modules.txt') 16 MODULES_FILE_PATH = os.path.join(PUPPET_DIR, 'modules.txt')
21 17
22 18
23 -def get_package(name):  
24 - cache = apt.cache.Cache()  
25 - if name in cache:  
26 - return cache[name], cache  
27 -  
28 - return None, None  
29 -  
30 -  
31 -def pkg_available(name):  
32 - pkg = get_package(name)[0]  
33 - if pkg and pkg.versions.get(PUPPET_TARGET_VERSION):  
34 - return True  
35 -  
36 - return False  
37 -  
38 -  
39 -def config_puppetlabs_repo():  
40 - dist = platform.dist()[-1]  
41 -  
42 - url = 'http://apt.puppetlabs.com/puppetlabs-release-{}.deb'.format(dist)  
43 - filename = '/tmp/puppet_apt.deb'  
44 - try:  
45 - urllib.urlretrieve(url, filename)  
46 - except IOError:  
47 - print "Could not install puppet"  
48 - raise  
49 -  
50 - deb_pkg = debfile.DebPackage(filename)  
51 - if deb_pkg.check():  
52 - deb_pkg.install()  
53 - cache = apt.cache.Cache()  
54 - cache.update()  
55 - cache.open()  
56 -  
57 -  
58 -def install_puppet(upgrade=False):  
59 - pkg, cache = get_package('puppet')  
60 -  
61 - pkg.candidate = pkg.versions.get(PUPPET_TARGET_VERSION)  
62 - if upgrade:  
63 - pkg.mark_upgrade() 19 +def get_release_name():
  20 + distro = platform.dist()[0].lower()
  21 + if distro == 'centos':
  22 + with open('/etc/centos-release') as release_file:
  23 + regex = r'CentOS release (\d)'
  24 + release = re.search(regex, release_file.read()).group(1)
  25 + return 'centos', release
  26 + elif distro == 'ubuntu':
  27 + with open('/etc/lsb-release') as release_file:
  28 + regex = r'DISTRIB_CODENAME=([a-z]+)'
  29 + release = re.search(regex, release_file.read()).group(1)
  30 + return 'ubuntu', release
64 else: 31 else:
65 - pkg.mark_install()  
66 -  
67 - cache.commit() 32 + return '', ''
68 33
69 34
70 def get_modules_installed(): 35 def get_modules_installed():
71 - modules_list = check_output(['puppet', 'module', 'list']).split('\n') 36 + modules_list = os.popen('puppet module list').read().split('\n')
72 modules_list = [line for line in modules_list if 'no modules' not in line] 37 modules_list = [line for line in modules_list if 'no modules' not in line]
73 modules_list = [item.split()[1:] for item in modules_list] 38 modules_list = [item.split()[1:] for item in modules_list]
74 modules_list = [item for item in modules_list if item] 39 modules_list = [item for item in modules_list if item]
@@ -83,9 +48,9 @@ def get_modules_installed(): @@ -83,9 +48,9 @@ def get_modules_installed():
83 48
84 def run(cmd, module, version=''): 49 def run(cmd, module, version=''):
85 if version: 50 if version:
86 - version = ' --version {}'.format(version) 51 + version = ' --version %s' % (version)
87 52
88 - cmd = 'puppet module {} {}{}'.format(cmd, module, version) 53 + cmd = 'puppet module %s %s%s' % (cmd, module, version)
89 process = subprocess.Popen(cmd, shell=True, executable='/bin/bash') 54 process = subprocess.Popen(cmd, shell=True, executable='/bin/bash')
90 process.wait() 55 process.wait()
91 56
@@ -97,16 +62,19 @@ def install_puppet_modules(): @@ -97,16 +62,19 @@ def install_puppet_modules():
97 modules_requirements = modules_file.read().replace('/', '-') 62 modules_requirements = modules_file.read().replace('/', '-')
98 63
99 for module in parse_requirements(modules_requirements): 64 for module in parse_requirements(modules_requirements):
100 -  
101 current_cmd, compare, version, version_comparison = '', '', '', None 65 current_cmd, compare, version, version_comparison = '', '', '', None
102 if module.project_name in modules_installed: 66 if module.project_name in modules_installed:
103 -  
104 if module.specs: 67 if module.specs:
105 compare, version = module.specs[0] 68 compare, version = module.specs[0]
106 - version_comparison = apt_pkg.version_compare(  
107 - modules_installed[module.project_name],  
108 - version  
109 - ) 69 +
  70 + tmp_version = modules_installed[module.project_name]
  71 + installed_version = StrictVersion(tmp_version)
  72 + required_version = StrictVersion(version)
  73 +
  74 + if installed_version >= required_version:
  75 + version_comparison = 0
  76 + else:
  77 + version_comparison = -1
110 else: 78 else:
111 continue 79 continue
112 80
@@ -125,17 +93,65 @@ def install_puppet_modules(): @@ -125,17 +93,65 @@ def install_puppet_modules():
125 if not version_comparison or version_comparison < 0: 93 if not version_comparison or version_comparison < 0:
126 run(current_cmd, module.project_name) 94 run(current_cmd, module.project_name)
127 95
  96 +
  97 +def iscentos(distro):
  98 + return distro == 'centos'
  99 +
  100 +
  101 +def isubuntu(distro):
  102 + return distro == 'ubuntu'
  103 +
  104 +
  105 +def download(url, filename):
  106 + try:
  107 + urllib.urlretrieve(url, filename)
  108 + except IOError:
  109 + print "Could not install puppet"
  110 + raise
  111 +
  112 +
128 def main(): 113 def main():
129 - # If the package not found or if the version is outdated, install puppet  
130 - if not pkg_available('puppet'):  
131 - config_puppetlabs_repo()  
132 -  
133 - pkg = get_package('puppet')[0]  
134 - if not pkg.is_installed:  
135 - install_puppet()  
136 - elif apt_pkg.version_compare(pkg.installed.version,  
137 - PUPPET_TARGET_VERSION) < 0:  
138 - install_puppet(upgrade=True) 114 + distro, release = get_release_name()
  115 + print('Distro %s, release %s' % (distro, release))
  116 +
  117 + if iscentos(distro):
  118 + cmd = 'rpm'
  119 + flags = '-ivh'
  120 + url = 'http://yum.puppetlabs.com/'
  121 + pkg = 'puppetlabs-release-el-%s.noarch.rpm' % (release)
  122 + update = ['yum', 'update', '-y']
  123 + install = ['yum', 'install', 'puppet', '-y']
  124 + elif isubuntu(distro):
  125 + cmd = 'dpkg'
  126 + flags = '-i'
  127 + url = 'https://apt.puppetlabs.com/'
  128 + pkg = 'puppetlabs-release-%s.deb' % (release)
  129 + update = ['apt-get', 'update', '-y']
  130 + install = ['apt-get', 'install', 'puppet', '-y']
  131 +
  132 + # Needed dependency for import pkg_resources
  133 + pkg_res = ['apt-get', 'install', 'python-pkg-resources', '-y']
  134 + subprocess.call(pkg_res)
  135 + else:
  136 + print('This distribuition is currently not supported!')
  137 + print('exiting...')
  138 + exit(1)
  139 +
  140 + tmp_file = '/tmp/%s' % (pkg)
  141 + download(url + pkg, tmp_file)
  142 + args = [cmd, flags, tmp_file]
  143 +
  144 + # Add repository
  145 + result = subprocess.call(args)
  146 + if result != 0:
  147 + print('Repository %s already set' % pkg)
  148 +
  149 + # Install Puppet
  150 + subprocess.call(update)
  151 + result = subprocess.call(install)
  152 + if result != 0:
  153 + print('Failed installing puppet')
  154 + exit(result)
139 155
140 if os.path.isfile('/vagrant/puppet/hiera.yaml'): 156 if os.path.isfile('/vagrant/puppet/hiera.yaml'):
141 copyfile('/vagrant/puppet/hiera.yaml', '/etc/puppet/hiera.yaml') 157 copyfile('/vagrant/puppet/hiera.yaml', '/etc/puppet/hiera.yaml')