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

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

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

我目前正在使用runcmdbash 对其进行破解,但这并不是向系统添加文件的正确方法。

有什么更好的解决方法吗?

答案1

我仍然没有一个优雅的解决方案,但是我使用runcmdRuby(可能安装在你的基础镜像上,也可能没有安装,因此你可能需要将其列出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"]) 
        }

这种黑客攻击也可以在相对较新的 Amazon Linux 实例上进行,这些实例具有最新的 cloud-init,但由于某种原因该write_files模块已被禁用。

代码假设用户数据是纯文本#cloud-config或经过 gzip 压缩的纯文本。如果使用更复杂的格式,例如多部分或包含,那么您可能需要从中读取解析后的数据/var/lib/cloud/instance/user-data.txt.i,但这需要 MIME 解析 - 我将把它留给读者作为练习 :-)。

相关内容