2013-05-13 64 views
1

我已经用完了想法,希望得到一些帮助。Python Boto创建的云端初始化#include脚本没有在EC2上运行

我开始和EC2的Ubuntu 12.04实例,并添加下面的脚本对用户数据:实例已经开始

#!/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") 

后,我可以用鼠标右键点击实例,并查看Sys系统日志。

我可以看到在底部附近以下:

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

我可以从wget的实例所提供的URL运行,看看txt文件的内容。

为什么不通过#include工作添加脚本?任何帮助,将不胜感激。

亲切的问候, Ç

回答

1

我做了这方面的一些进展。结合CloudInit用户数据输入格式时,必须将其作为多部分输入传递。

docs

用户数据的单一格式可能不足以完成你想要的。例如,您可能需要插入新创作业并运行用户数据脚本。

cloud-init的工具/目录中有一个名为'write-mime-multipart'的工具,可以帮助创建MIME多部分内容。

上述脚本的多版本,使用写的mime-多看起来是这样产生的:

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==--' 

还没有得到它的工作还没有,但它是在一个步正确的方向。

在我搜索我也遇到了两个有用的工具,开始在EC2上配置的爪牙,即

  1. Salt Cloud
  2. Shaker
2

你有正确的想法,你只有一层太深:)

使用Ubuntu和cloud-init,您的用户数据可以是可执行脚本,也可以是CloudConf ig文件。

在你的问题中,你传递一个Python可执行文件作为你的userdata。在Ubuntu机器上,它看到一个可执行程序(因为它以#!开头)并运行它。这就是它所要做的。它不会处理程序的输出。

你想要的是在你的计算机上运行python脚本,并使用该程序的OUTPUT作为你的userdata。

所以在你的榜样,传递给亚马逊的用户数据应该是:在Ubuntu

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

云init将看到第一行#include,并知道它需要下载的文件。然后,它会查看它下载的每个文件以处理每个文件。

mime-multipart只有在你想将多个文件合并为一个时才有用。例如,不要从S3下载三个文件,您可以将它们全部放在一个文件中,并且只将一个URL放在一个文件中。虽然你不需要这个。

您为云初始化文档http://help.ubuntu.com/community/CloudInit包含的链接有更多您的用户数据可以包含的示例。

享受!

相关问题