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

загрузка облачной информации с марионеткой и сервером ubuntu

Я просмотрел шаблон облачной информации Puppet Master и понял, что он использует CloudInit, встроенный в AMI Amazon Linux. Однако я хотел бы использовать существующий образ сервера Ubuntu 11.10 и по-прежнему загружать сервер как Puppet Master. Читая документацию по CloudFormation и BootStrapping, может показаться, что это возможно, но на сервере или при создании стека не создаются соответствующие журналы. Есть ли способ сделать это с существующим AMI, если не считать создания пользовательского AMI?

Я решил пойти по собственному сценарию, так как мне не удалось получить ресурс MetaData для установки и настройки пакетов с помощью apt (см .: https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf).

Пользовательский сценарий bash выполняет установку для начальной загрузки основного экземпляра марионетки. Мне нужно было, чтобы он был в формате JSON, поэтому я использовал этот удобный скрипт Ruby из http://allanfeid.com/content/using-amazons-cloudformation-cloud-init-chef-and-fog-automate-infrastructure:

#!/usr/bin/ruby
require 'rubygems'
require 'json'

if ARGV.size != 1
  puts "Usage: #{$0} <file>"
  exit 1
end

def escape(string)
  parse = JSON.parse({ 'json' => string }.to_json)
  parse['json']
end

data = ''
File.open(ARGV[0]) {|f| data << f.read}
p escape(data)

# ./json_encode.rb combined-userdata.txt

На данный момент это должно работать, но было бы неплохо в конечном итоге управлять процессами начальной загрузки, как задумано, с помощью cfn-init MetaData и apt. Например, у меня это все еще не работает с apt:

"Resources": {
  "MyInstance": {
    "Type": "AWS::EC2::Instance",
"Metadata" : {
      "AWS::CloudFormation::Init" : {
        "config" : {
          "sources" : {
            :
          },
"packages" : {
            :
          }
"files" : {
            :
          }
"services" : {
            :
          }
        }
      }
    },
"Properties": {
      :
    }
  }
}

ОБНОВИТЬ

Более простым решением является также использование Ubuntu CloudInit (https://help.ubuntu.com/community/CloudInit) и пусть он установит для вас пакеты. Мой шаблон для экземпляров EC2 Puppet Client теперь выглядит так:

"webserver" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "KeyName" : { "Ref" : "KeyName" },
      "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
      "InstanceType": { "Ref" : "InstanceType" },               
      "SecurityGroups" : [ { "Ref" : "PuppetGroup" }, { "Ref" : "WebServerGroup" } ],
      "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#cloud-config","\n",
      "packages:","\n",
        "- ruby","\n",
        "- ruby-dev","\n",
        "- rubygems","\n",
        "- puppet","\n",
        "- vim-puppet","\n",
        "- puppet-el","\n",
        "puppet:","\n",
        "conf:","\n",
        "agent:","\n",
        "server: ",,"\n",
        "runcmd:","\n"
      ]]}}
   }
}

Это в основном процесс загрузки CloudConfig за вычетом магии runcmd, которая заставляет его работать. Я все еще пытаюсь понять, как передать свои манифесты марионеток мастеру марионеток и назначить их узлам, но это должно помочь всем, кто использует Ubuntu UEC AMI.