Назад | Перейти на главную страницу

Ubuntu 12.04 cloud-init не поддерживает «write_files», что делать?

Я использую 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, который я оставлю читателю в качестве упражнения :-).