diff --git a/manifests/ec2-ebs-debian-official-amd64-hvm.manifest.json b/manifests/ec2-ebs-debian-official-amd64-hvm.manifest.json index 2afe8bd..45c726c 100644 --- a/manifests/ec2-ebs-debian-official-amd64-hvm.manifest.json +++ b/manifests/ec2-ebs-debian-official-amd64-hvm.manifest.json @@ -10,8 +10,8 @@ "workspace": "/target" }, "image": { - "name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", - "description": "Debian {release} {architecture} AMI ({virtualization})" + "name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", + "description": "Debian {release} {architecture}" }, "system": { "release": "wheezy", @@ -44,7 +44,9 @@ ] }, "cloud_init": { - "username": "admin" + "username": "admin", + //"metadata_sources": "Ec2", + "disable_modules": [ "landscape", "byobu", "ssh-import-id" ] } } } diff --git a/manifests/ec2-ebs-debian-official-amd64-pvm.manifest.json b/manifests/ec2-ebs-debian-official-amd64-pvm.manifest.json index 14cd563..9631562 100644 --- a/manifests/ec2-ebs-debian-official-amd64-pvm.manifest.json +++ b/manifests/ec2-ebs-debian-official-amd64-pvm.manifest.json @@ -10,8 +10,8 @@ "workspace": "/target" }, "image": { - "name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", - "description": "Debian {release} {architecture} AMI ({virtualization})" + "name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", + "description": "Debian {release} {architecture}" }, "system": { "release": "wheezy", @@ -44,7 +44,9 @@ ] }, "cloud_init": { - "username": "admin" + "username": "admin", + //"metadata_sources": "Ec2", + "disable_modules": [ "landscape", "byobu", "ssh-import-id" ] } } } diff --git a/manifests/ec2-ebs-debian-official-i386-pvm.manifest.json b/manifests/ec2-ebs-debian-official-i386-pvm.manifest.json index a3836ea..e44cfe6 100644 --- a/manifests/ec2-ebs-debian-official-i386-pvm.manifest.json +++ b/manifests/ec2-ebs-debian-official-i386-pvm.manifest.json @@ -10,8 +10,8 @@ "workspace": "/target" }, "image": { - "name": "debian-{release}-{architecture}-{virtualization}-{%y}{%m}{%d}", - "description": "Debian {release} {architecture} AMI ({virtualization})" + "name": "debian-{release}-{architecture}-{virtualization}-{%Y}-{%m}-{%d}-ebs", + "description": "Debian {release} {architecture}" }, "system": { "release": "wheezy", @@ -44,7 +44,9 @@ ] }, "cloud_init": { - "username": "admin" + "username": "admin", + //"metadata_sources": "Ec2", + "disable_modules": [ "landscape", "byobu", "ssh-import-id" ] } } } diff --git a/plugins/cloud_init/__init__.py b/plugins/cloud_init/__init__.py index ad9d973..df3a11c 100644 --- a/plugins/cloud_init/__init__.py +++ b/plugins/cloud_init/__init__.py @@ -22,9 +22,21 @@ def validate_manifest(data, schema_validate): def resolve_tasks(tasklist, manifest): from tasks import SetUsername + from tasks import SetMetadataSource + from tasks import AutoSetMetadataSource + from tasks import DisableModules from providers.ec2.tasks.initd import AddEC2InitScripts from common.tasks import initd - tasklist.add(SetUsername) + + options = manifest.plugins['cloud_init'] + tasklist.add(AutoSetMetadataSource) + if 'username' in options: + tasklist.add(SetUsername) + if 'disable_modules' in options: + tasklist.add(DisableModules) + if 'metadata_sources' in options: + tasklist.add(SetMetadataSource) + tasklist.remove(AddEC2InitScripts, initd.AddExpandRoot, initd.AdjustExpandRootScript, diff --git a/plugins/cloud_init/manifest-schema.json b/plugins/cloud_init/manifest-schema.json index 599855c..719716a 100644 --- a/plugins/cloud_init/manifest-schema.json +++ b/plugins/cloud_init/manifest-schema.json @@ -11,6 +11,16 @@ "properties": { "username": { "type": "string" + }, + "disable_modules": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "metadata_sources": { + "type": "string" } }, "required": ["username"] diff --git a/plugins/cloud_init/tasks.py b/plugins/cloud_init/tasks.py index 37883f2..5613a56 100644 --- a/plugins/cloud_init/tasks.py +++ b/plugins/cloud_init/tasks.py @@ -1,6 +1,9 @@ from base import Task from common import phases from plugins.packages.tasks import InstallRemotePackages +from common.tasks import apt +from common.tools import log_check_call +import re class SetUsername(Task): @@ -18,3 +21,63 @@ class SetUsername(Task): ' sudo: ALL=(ALL) NOPASSWD:ALL\n' ' shell: /bin/bash').format(username=username) sed_i(cloud_cfg, search, replace) + + +class SetMetadataSource(Task): + description = 'Setting metadata source' + phase = phases.system_modification + predecessors = [apt.AptSources] + successors = [apt.AptUpdate] + + def run(self, info): + if "metadata_sources" in info.manifest.plugins['cloud_init']: + sources = "cloud-init cloud-init/datasources multiselect " + info.manifest.plugins['cloud_init']['metadata_sources'] + log_check_call(['/usr/sbin/chroot', info.root, '/usr/bin/debconf-set-selections'], sources) + + +class AutoSetMetadataSource(Task): + description = 'Auto-setting metadata source' + phase = phases.system_modification + predecessors = [apt.AptSources] + successors = [SetMetadataSource] + + def run(self, info): + sources = "" + if info.manifest.provider == "ec2": + sources = "Ec2" + + if sources: + print ("Setting metadata source to " + sources) + sources = "cloud-init cloud-init/datasources multiselect " + sources + log_check_call(['/usr/sbin/chroot', info.root, '/usr/bin/debconf-set-selections'], sources) + + +class DisableModules(Task): + description = 'Setting cloud.cfg modules' + phase = phases.system_modification + predecessors = [apt.AptUpgrade] + + def run(self, info): + if 'disable_modules' in info.manifest.plugins['cloud_init']: + patterns = "" + for pattern in info.manifest.plugins['cloud_init']['disable_modules']: + if patterns != "": + patterns = patterns + "|" + pattern + else: + patterns = "^\s+-\s+(" + pattern + patterns = patterns + ")$" + regex = re.compile(patterns) + + try: + f = open(info.root + "/etc/cloud/cloud.cfg") + lines = f.readlines() + f.close() + except: + print "Cannot read cloud.cfg" + return -1 + + f = open(info.root + "/etc/cloud/cloud.cfg", "w") + for line in lines: + if not regex.match(line): + f.write(line) + f.close