Ubuntu 12.04 cloud-init不支持“write_files”,该怎么办?

我正在使用cloud-init在EC2上设置Ubuntu虚拟机。 我最近需要使用Ubuntu 12.04(旧LTS)映像来支持部署,但是Ubuntu 12.04中旧的cloud-init 0.6.3不支持我需要的write_files模块。

我目前正在使用runcmd和bash黑客攻击它,但这不是处理向系统添加文件的正确方法。

任何想法更好的解决方法?

我还没有一个优雅的解决scheme,但我使用runcmd和Ruby(可能会或可能不会安装在您的基本图像,所以你可能需要列在packages )看起来像这样:

 runcmd: - - ruby - -ryaml - -rfileutils - -rzlib - -rstringio - -e - | ud=%x{curl -s http://169.254.169.254/2009-04-04/user-data} ud = Zlib::GzipReader.new(StringIO.new(ud)).read unless ud[0] = "#" YAML.load(ud)["write_files"].each { |f| FileUtils.mkdir_p(File.dirname(f["path"])) File.open(f["path"], "w") { |io| io.write(f["content"]) } File.chmod(f["permissions"].to_i(8), f["path"]) } 

这种攻击也适用于最近的具有最新的cloud-init的Amazon Linux实例,但由于某些原因, write_files模块被禁用。

该代码假定用户数据是纯文本#cloud-config或gzip压缩。 如果使用更复杂的东西,比如多部分或者包含,那么你可能需要从/var/lib/cloud/instance/user-data.txt.i读取parsing的数据,但是这需要MIMEparsing -我将作为练习留给读者:-)。