1

我的想法已经用完了,希望得到一些帮助。

我正在启动 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")

实例启动后,我可以右键单击实例并查看系统日志。

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

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 添加的脚本不起作用?任何帮助,将不胜感激。

亲切的问候,C

4

2 回答 2

2

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

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

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

您想要的是在您的计算机上运行 python 脚本,并将程序的输出用作您的用户数据。

所以在你的例子中,传递给亚马逊的用户数据应该是:

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

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

mime-multipart 仅在您想将多个文件合并为一个时才有用。例如,您可以将它们全部放在一个文件和#include一个 URL 中,而不是从 S3 下载三个文件。不过,这里不需要。

您为 cloud-init 文档http://help.ubuntu.com/community/CloudInit包含的链接有更多关于您的用户数据可以包含的示例。

享受!

于 2013-07-11T00:43:19.497 回答
1

我在这方面取得了一些进展。组合 CloudInit 用户数据输入格式时,您必须将其作为 Multipart Input 传递。

文档

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

cloud-init 的 tools/ 目录中有一个名为“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 上启动配置的 minions,即

  1. 盐云
  2. 摇床
于 2013-05-15T11:12:20.383 回答