Ich habe vor kurzem ec2metadata, die eine einfache CLI-und Python-Schnittstelle bietet, um die Metadaten eines Amazon EC2-Instanz veröffentlicht. In diesem Beitrag habe ich erwähnt, dass “eines der nützlichsten Teile der Daten User-Daten, die verwendet werden, um Konfigurations-Informationen oder sogar Initialisierung Skripte, um die Instanz übergeben beim Start werden kann“.
Ich bekam ein paar Antworten per E-Mail Bitte um weitere Informationen, so ist es hier.
Aber zuerst, lassen Sie mich nur bedanken Eric Hammond (und RightScale) für die Idee. Unten ist eine Python-Implementierung, die ec2metadata nutzt als Kommunikationsprotokoll Schicht.
Unterstützung für benutzerdefinierte Daten-Skripte (ec2metadata, 25ec2-userdata) ist in den neuesten TurnKey AMI enthalten. Wenn Sie den Mechanismus Setup wie oben beschrieben sollte es auf eigene Faust AMIs zu arbeiten.
Es ist ganz einfach. Wenn der Benutzer-Daten beginnt der Inhalt mit den beiden Zeichen #! (Shebang), wird sie ausgeführt werden. Wenn kein Benutzer-Daten angegeben ist, oder nicht mit #! Starten, passiert nichts.
Beim Starten einer Instanz, geben Sie die Benutzer-Daten-Datei zu der Instanz übergeben.
Zum Beispiel:
ec2-run-instances --key KEYPAIR --user-data-file USERDATA_FILE ami-cbc12fa2
Das obige Beispiel verwendet die Amazon EC2 CLI-Tools, aber es ist möglich, benutzerdefinierte Daten über die AWS-Konsole als auch weitergeben. Die AMI angegeben wird, dass von schlüsselfertigen Kern in der US-EAST-1 Region, die komplette Liste der verfügbaren AMI ist hier.
#!/bin/bash -ex
install()
{
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y \
-o DPkg::Options::=--force-confdef \
-o DPkg::Options::=--force-confold \
install $@
}
# installs hello - a highly useful package
install hello
# tell the world what we've done!
echo 'Hello world - I just executed user-data!' > /root/helloworld
Das folgende Skript hängt ec2metadata und basiert auf firstboot von inithooks auf TurnKey AMI ausgeführt.
/usr/lib/inithooks/firstboot.d/25ec2-userdata
#!/usr/bin/python
# Copyright (c) 2010 Alon Swartz <alon@turnkeylinux.org> - all rights reserved
import os
import shutil
import tempfile
import executil
import ec2metadata
class TempFile(file):
def __init__(self, prefix='tmp', suffix=''):
fd, path = tempfile.mkstemp(suffix, prefix)
os.close(fd)
self.path = path
self.pid = os.getpid()
file.__init__(self, path, "w")
def __del__(self):
if self.pid == os.getpid():
os.remove(self.path)
def main():
userdata = ec2metadata.get('user-data')
if userdata and userdata.startswith("#!"):
fh = TempFile(prefix="ec2userdata")
fh.writelines(userdata)
fh.close()
os.chmod(fh.path, 0750)
executil.system(fh.path)
print "# executed ec2 user-data script"
if __name__ == "__main__":
main()