Я просмотрел шаблон облачной информации 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.