Я использую cloud-init для настройки виртуальных машин Ubuntu на EC2. Недавно мне потребовалась поддержка развертывания с использованием образов Ubuntu 12.04 (старый LTS), но старый cloud-init 0.6.3, который есть в Ubuntu 12.04, не поддерживает write_files
модуль, который мне нужен.
Я сейчас взламываю его, используя runcmd
и bash, но это вряд ли правильный способ обработки добавления файлов в систему.
Есть идеи для лучшего обходного пути?
У меня все еще нет элегантного решения, но мой хак с использованием 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"])
}
Этот хакер также работает с относительно недавними инстансами Amazon Linux, которые имеют недавнюю облачную инициализацию, но по какой-то причине write_files
модуль отключен.
Код предполагает, что пользовательские данные представляют собой простой текст. #cloud-config
или его сжатие gzip. Если вы используете что-то более сложное, например, состоящее из нескольких частей или включающее, тогда вы можете прочитать проанализированные данные из /var/lib/cloud/instance/user-data.txt.i
, но для этого требуется анализ MIME, который я оставлю читателю в качестве упражнения :-).