我的想法已经用完了,不胜感激。
我正在启动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 Log。
我可以在底部附近看到以下内容:
Generating locales...
en_US.UTF-8... done
Generation complete.
#include
http://nerdcloudinit.s3.amazon...
http://nerdcloudinit.s3.amazon...
http://nerdcloudinit.s3.amazon...
我可以从提供的url上的实例运行wget,并查看txt文件的内容。
为什么不通过#include添加脚本?任何帮助将不胜感激。
亲切的问候, ç
答案 0 :(得分:2)
你有正确的想法,你只是一层太深了:)
使用Ubuntu和cloud-init,您的用户数据可以是可执行脚本,也可以是CloudConfig文件。
在你的问题中,你传递一个python可执行文件作为你的用户数据。在Ubuntu机器上,它看到一个可执行程序(因为它以#!
开头)并运行它。这就是它所能做的一切。它不会处理程序的输出。
你想要的是在你的电脑上运行python脚本,并使用程序的OUTPUT作为你的用户数据。
因此,在您的示例中,传递给Amazon的用户数据应为:
#include
http://nerdcloudinit.s3.amazon...
http://nerdcloudinit.s3.amazon...
http://nerdcloudinit.s3.amazon...
Ubuntu上的cloud-init将看到第一行#include
并知道它需要下载文件。然后,它将查看它下载的每个文件以处理每个文件。
mime-multipart仅在您希望将多个文件合并为一个文件时才有用。例如,不是从S3下载三个文件,而是将它们全部放在一个文件中,#include
一个URL。你不需要这个。
您为cloud-init docs http://help.ubuntu.com/community/CloudInit添加的链接提供了更多关于您的用户数据可以包含的内容的示例。
享受!
答案 1 :(得分:1)
我在这方面取得了一些进展。组合CloudInit用户数据输入格式时,必须将其作为多部分输入传递。
来自docs
单一格式的用户数据可能不足以完成您想要的任务。例如,您可能希望插入一个upstart作业并运行用户数据脚本。
cloud-init的工具/目录中有一个名为'write-mime-multipart'的工具,可以帮助创建mime多部分内容。
使用 write-mime-multipart 生成的上述脚本的多部分版本如下所示:
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上启动配置的小兵,即