Commit 1b70448e1217987ef48c17f1d905bf877f54ca20
1 parent
f4939c75
Exists in
master
and in
39 other branches
Added support for centos distribuiton
Showing
2 changed files
with
86 additions
and
70 deletions
Show diff stats
fabfile.py
@@ -9,7 +9,6 @@ from fabric.api import env, run, sudo, local | @@ -9,7 +9,6 @@ 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 |
puppet/bootstrap.py
1 | #!/usr/bin/env python2.7 | 1 | #!/usr/bin/env python2.7 |
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 | ||
128 | -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 | 96 | ||
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) | 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 | + | ||
113 | +def main(): | ||
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 | + return 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') |
@@ -143,6 +159,7 @@ def main(): | @@ -143,6 +159,7 @@ def main(): | ||
143 | locale.setlocale(locale.LC_ALL, '') | 159 | locale.setlocale(locale.LC_ALL, '') |
144 | 160 | ||
145 | install_puppet_modules() | 161 | install_puppet_modules() |
162 | + return 0 | ||
146 | 163 | ||
147 | 164 | ||
148 | if __name__ == '__main__': | 165 | if __name__ == '__main__': |