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()