Merge pull request #125 from JamesBromberger/python

Permit cloud-init to be configured for its metadata sources using debcon...
This commit is contained in:
Anders Ingemann 2013-12-29 06:02:19 -08:00
commit bc8038729a
6 changed files with 101 additions and 10 deletions

View file

@ -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" ]
}
}
}

View file

@ -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" ]
}
}
}

View file

@ -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" ]
}
}
}

View file

@ -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,

View file

@ -11,6 +11,16 @@
"properties": {
"username": {
"type": "string"
},
"disable_modules": {
"type": "array",
"items": {
"type": "string"
},
"uniqueItems": true
},
"metadata_sources": {
"type": "string"
}
},
"required": ["username"]

View file

@ -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