2013-05-13 1 views
1

Je n'ai plus d'idées, j'apprécierais de l'aide.Python Boto a créé le script #include cloud-init qui ne s'exécute pas sur EC2

Je commence et EC2 Ubuntu 12.04 exemple et en ajoutant le script suivant pour les données utilisateur:

#!/usr/bin/env python 

import sys 

from boto.s3.connection import S3Connection 

AWS_BOOTSTRAP_BUCKET = 'myBucket' 
AWS_ACCESS_KEY_ID = 'MyAccessId' 
AWS_SECRET_ACCESS_KEY = 'MySecretKey' 

s3 = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
install = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='bash1.txt',  force_http=True) 
config = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='cloud-config.txt', force_http=True) 
start = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='bash2.txt', force_http=True) 

sys.stdout.write("#include\n") 
sys.stdout.write(install+"\n") 
sys.stdout.write(config+"\n") 
sys.stdout.write(start+"\n") 

Après l'instance a commencé, je peux faire un clic droit sur l'instance et Voir Log Sys.

je peux voir ce qui suit près du fond:

Generating locales... 
en_US.UTF-8... done 
Generation complete. 
    #include 
http://nerdcloudinit.s3.amazon... 
http://nerdcloudinit.s3.amazon... 
http://nerdcloudinit.s3.amazon... 

je peux courir wget de l'instance sur de l'URL fournie et voir le contenu des fichiers txt. Pourquoi les scripts ajoutés via #include ne fonctionnent-ils pas? Toute aide serait appréciée.

Meilleures salutations, C

Répondre

1

J'ai fait quelques progrès à ce sujet. Lorsque vous combinez des formats d'entrée de données utilisateur CloudInit, vous devez les transmettre en tant qu'entrée multipart.

De l'docs

Un seul format de données utilisateur pourrait ne pas être suffisant pour accomplir ce que vous voulez. Par exemple, vous souhaiterez peut-être insérer un travail de démarrage et également exécuter un script de données utilisateur.

Il existe un outil dans le répertoire tools/cloud de cloud-init appelé 'write-mime-multipart' qui peut aider à créer du contenu multi-parties mime.

La version multipart du script ci-dessus, généré à l'aide écriture-mime-multipart ressemble à ceci:

Content-Type: multipart/mixed; boundary="===============7017068435702325667==" 
MIME-Version: 1.0 

--===============7017068435702325667== 
Content-Type: text/x-shellscript; charset="us-ascii" 
MIME-Version: 1.0 
Content-Transfer-Encoding: 7bit 
Content-Disposition: attachment; filename="myPythonUserDataScript.txt" 

#!/usr/bin/env python 

import sys 

from boto.s3.connection import S3Connection 

AWS_BOOTSTRAP_BUCKET = 'myBucket' 
AWS_ACCESS_KEY_ID = 'MyAccessId' 
AWS_SECRET_ACCESS_KEY = 'MySecretKey' 

s3 = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
install = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='bash1.txt',  force_http=True) 
config = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='cloud-config.txt', force_http=True) 
start = s3.generate_url(300, 'GET', bucket=AWS_BOOTSTRAP_BUCKET, key='bash2.txt', force_http=True) 

print '--===============7017068435702325667==' 
print 'Content-Type: text/x-include-url; charset="us-ascii"' 
print 'MIME-Version: 1.0' 
print 'Content-Transfer-Encoding: 7bit' 
print 'Content-Disposition: attachment; filename="myIncludeFile.txt"' 

print "#include" 
print install 
print config 
print start 
print '--===============7017068435702325667==--' 

N'a pas eu à travailler encore, mais il est un pas dans la bonne direction.

Au cours de ma recherche, je suis aussi venu à travers deux outils utiles pour le démarrage sbires configurés sur EC2, à savoir

  1. Salt Cloud
  2. Shaker
2

Vous avez la bonne idée, vous Avec un seul calque trop profond :)

Avec Ubuntu et cloud-init, vos données utilisateur peuvent être un script exécutable OU il peut s'agir d'un CloudConf fichier ig.

Dans votre question, vous transmettez un exécutable python en tant que données d'utilisateur. Sur la machine Ubuntu, il voit un programme exécutable (car il commence par #!) et il l'exécute. Et c'est tout ce que ça va faire. Il ne traitera pas la sortie de votre programme.

Ce que vous voulez, c'est d'exécuter le script python sur votre ordinateur, et d'utiliser le OUTPUT du programme comme données d'utilisateur.

Donc, dans votre exemple, le userdata passé à Amazon devrait être:

#include 
http://nerdcloudinit.s3.amazon... 
http://nerdcloudinit.s3.amazon... 
http://nerdcloudinit.s3.amazon... 

nuage-init sur Ubuntu verra la première ligne #include et de savoir qu'il a besoin de télécharger les fichiers. Ensuite, il va regarder chaque fichier qu'il télécharge pour traiter chacun d'eux. Le mime-multipart n'est utile que si vous voulez regrouper plusieurs fichiers en un seul. Par exemple, au lieu de télécharger trois fichiers à partir de S3, vous pouvez les regrouper en un seul fichier et #include en une seule URL. Vous n'avez pas besoin de cela ici cependant.

Le lien que vous avez inclus pour les documents init-cloud http://help.ubuntu.com/community/CloudInit contient plus d'exemples de ce que peuvent contenir vos données utilisateur.

Profitez-en!

Questions connexes