Python Boto创建了不在EC2上运行的cloud-init #include脚本

时间:2013-05-13 21:22:50

标签: python amazon-ec2 boto user-data cloud-init

我的想法已经用完了,不胜感激。

我正在启动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添加脚本?任何帮助将不胜感激。

亲切的问候, ç

2 个答案:

答案 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上启动配置的小兵,即

  1. Salt Cloud
  2. Shaker