logical-construct 0.0.5 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. data/bin/flight-deck +3 -0
  2. data/doc/DESIGN +48 -0
  3. data/doc/EC2-baking-notes +70 -0
  4. data/doc/ExampleStartupRakefile +152 -0
  5. data/doc/ExampleTargetRakefile +4 -0
  6. data/doc/TODO +148 -0
  7. data/doc/Vb-EC2-translation-notes +96 -0
  8. data/doc/hating-chef +32 -0
  9. data/lib/logical-construct/archive-tasks.rb +307 -0
  10. data/lib/logical-construct/ground-control.rb +4 -1
  11. data/lib/logical-construct/ground-control/build-plan.rb +95 -0
  12. data/lib/logical-construct/ground-control/core.rb +1 -1
  13. data/lib/logical-construct/ground-control/generate-manifest.rb +67 -0
  14. data/lib/logical-construct/ground-control/provision.rb +73 -168
  15. data/lib/logical-construct/ground-control/run-on-target.rb +1 -1
  16. data/lib/logical-construct/ground-control/setup.rb +1 -4
  17. data/lib/logical-construct/ground-control/setup/copy-files.rb +2 -2
  18. data/lib/logical-construct/ground-control/tools.rb +66 -0
  19. data/lib/logical-construct/node-client.rb +112 -0
  20. data/lib/logical-construct/plan.rb +2 -0
  21. data/lib/logical-construct/plan/core.rb +45 -0
  22. data/lib/logical-construct/plan/standalone-bundle.rb +80 -0
  23. data/lib/logical-construct/port-open-check.rb +41 -0
  24. data/lib/logical-construct/protocol.rb +2 -0
  25. data/lib/logical-construct/protocol/plan-validation.rb +46 -0
  26. data/lib/logical-construct/protocol/ssh-tunnel.rb +127 -0
  27. data/lib/logical-construct/protocol/vocabulary.rb +8 -0
  28. data/lib/logical-construct/target/Implement.rake +8 -0
  29. data/lib/logical-construct/target/command-line.rb +90 -0
  30. data/lib/logical-construct/target/flight-deck.rb +341 -0
  31. data/lib/logical-construct/target/implementation.rb +33 -0
  32. data/lib/logical-construct/target/plan-records.rb +317 -0
  33. data/lib/logical-construct/target/resolution-server.rb +153 -0
  34. data/lib/logical-construct/target/{unpack-cookbook.rb → unpack-plan.rb} +8 -4
  35. data/lib/logical-construct/template-file.rb +41 -0
  36. data/lib/templates/Rakefile.erb +8 -0
  37. data/spec/ground-control/smoke-test.rb +8 -7
  38. data/spec/node_resolution.rb +62 -0
  39. data/spec/target/plan-records.rb +142 -0
  40. data/spec/target/provisioning.rb +21 -0
  41. data/spec_help/file-sandbox.rb +12 -6
  42. data/spec_help/fixtures/Manifest +1 -0
  43. data/spec_help/fixtures/source/one.tbz +1 -0
  44. data/spec_help/fixtures/source/three.tbz +1 -0
  45. data/spec_help/fixtures/source/two.tbz +1 -0
  46. data/spec_help/spec_helper.rb +5 -7
  47. metadata +165 -72
  48. data/lib/logical-construct/ground-control/setup/build-files.rb +0 -93
  49. data/lib/logical-construct/ground-control/setup/create-construct-directory.rb +0 -22
  50. data/lib/logical-construct/ground-control/setup/install-init.rb +0 -32
  51. data/lib/logical-construct/resolving-task.rb +0 -141
  52. data/lib/logical-construct/satisfiable-task.rb +0 -87
  53. data/lib/logical-construct/target.rb +0 -4
  54. data/lib/logical-construct/target/chef-solo.rb +0 -37
  55. data/lib/logical-construct/target/platforms.rb +0 -51
  56. data/lib/logical-construct/target/platforms/aws.rb +0 -8
  57. data/lib/logical-construct/target/platforms/default/chef-config.rb +0 -134
  58. data/lib/logical-construct/target/platforms/default/resolve-configuration.rb +0 -44
  59. data/lib/logical-construct/target/platforms/default/volume.rb +0 -11
  60. data/lib/logical-construct/target/platforms/virtualbox.rb +0 -8
  61. data/lib/logical-construct/target/platforms/virtualbox/volume.rb +0 -15
  62. data/lib/logical-construct/target/provision.rb +0 -36
  63. data/lib/logical-construct/target/sinatra-resolver.rb +0 -99
  64. data/lib/logical-construct/testing/resolve-configuration.rb +0 -32
  65. data/lib/logical-construct/testing/resolving-task.rb +0 -15
  66. data/lib/templates/chef.rb.erb +0 -9
  67. data/lib/templates/construct.init.d.erb +0 -18
  68. data/lib/templates/resolver/finished.html.erb +0 -1
  69. data/lib/templates/resolver/index.html.erb +0 -17
  70. data/lib/templates/resolver/task-file-form.html.erb +0 -6
  71. data/lib/templates/resolver/task-form.html.erb +0 -6
  72. data/spec/resolution.rb +0 -147
  73. data/spec/target/chef-config.rb +0 -67
  74. data/spec/target/chef-solo.rb +0 -55
  75. data/spec/target/platforms.rb +0 -36
  76. data/spec/target/smoke-test.rb +0 -45
  77. data/spec_help/ungemmer.rb +0 -36
@@ -0,0 +1,3 @@
1
+ require 'logical-construct/target/command-line'
2
+
3
+ LogicalConstruct::Target::CommandLine.new(ARGV).go
@@ -0,0 +1,48 @@
1
+ After consideration:
2
+
3
+ This is not a cloud server manager. Those exist already.
4
+
5
+ This is a cloud deployment manager. Write one description of how your cloud is built, deploy it whereever.
6
+
7
+ Puppet/chef handle like 90% of that, but before either can run, network has to
8
+ be configured, and persistent/extra volumes need to be mounted.
9
+
10
+ "Blessing" deploys is another thing - snapshot/repackage a currently running
11
+ instance so that we can shortcut deploy next time.
12
+
13
+ Things Ground control should be able to do:
14
+
15
+ * Survey Target hosts and make sure they have the configs they need.
16
+
17
+ * Given a target server with Ruby and SSH, set it up as a particular role.
18
+ * (I.e: SSH and deliver files, install gems, locked to GC version)
19
+
20
+ Three basic tools:
21
+
22
+ Construct: delivers and executes provisioning plans (which themselves may be "use Chef to...")
23
+ (coupling point: construct manifest)
24
+
25
+ AWS toolkit: scripts for handling a bunch of instances, including:
26
+ * starting with user data
27
+ * expanding credentials (i.e. from u/p to full set of keypairs and
28
+ certs and things)
29
+ * baking and migrating images
30
+ * putting instances into and out of LB.
31
+
32
+ (coupling point: server database - consider (initialially) SQLite)
33
+
34
+ Remote management: run (command) with (set of servers) as targets. Including
35
+ curl/rsync or ssh -c "(command)" - cap or vlad may be Good Enough for this
36
+ already?
37
+ * servers: an address + metadata
38
+ * metadata:
39
+ - hosting environment (AWS/vbox)
40
+ - deployment type (prod/staging/etc)
41
+ - deployment role (app/db/etc)
42
+ - ...
43
+ * metadata used to:
44
+ - select servers to run commands against
45
+ - restrict command that can be run against a server
46
+ - included into command template
47
+ (coupling point (to construct): construct <role>:provision[<server from
48
+ set>])
@@ -0,0 +1,70 @@
1
+ ALWAYS check the ec2-api and ec2-ami tools versions
2
+
3
+ Outstanding issues:
4
+ Where is the ephemeral storage mounted? Probably needs to start as a config, maybe detect later
5
+
6
+ Data required:
7
+ Three categories: arbitrary (merely shared), task parameters, configuations
8
+
9
+ Task params:
10
+ Target machine
11
+ AMI name
12
+
13
+ Configurations:
14
+ Ephemeral storage mount
15
+ Private Key File
16
+ Certificate File
17
+ User ID
18
+ (bundle options, like includes)
19
+ Upload bucket
20
+ S3 access key
21
+ S3 secret key
22
+
23
+ Arbitrary:
24
+ Manifest path
25
+ Credential file paths
26
+
27
+ From the EC2 user guide:
28
+
29
+ [Provisioned]
30
+ Upload EC2 credentials to ephemeral storage (i.e. pk.pem + cert.pem, AWS creds)
31
+ [end provisioned]
32
+
33
+ [Local to baked machine - should be in target rakefile]
34
+ Write access needed on instance store (/mnt or /media/ephemeral0)
35
+ ec2-bundle-vol -k <private_keyfile> -c <certificate_file> -u <user_id> --destination <somewhere ephemeral> --prefix <something unique - not 'image'> --arch x86_64 -i /etc/ec2/amitools/cert-ec2.pem -i $(ls /etc/ssl/certs/*.pem | tr \\n ,) --ec2cert /etc/ec2/amitools/cert-ec2.pem
36
+ ec2-upload-bundle -b <bucket> -m <manifest_path> -a <access_key> -s <secret_key> --retry
37
+ ec2-register <your-s3-bucket>/<prefix>.manifest.xml -n image_name --aws-access-key <access_key> --aws-secret-key <secret_key>
38
+ [end local]
39
+
40
+ (Commands that have worked:)
41
+ ec2-bundle-vol -k /mnt/pk.pem -c /mnt/cert.pem -u 180593873119 -d /mnt/bundling/ -r x86_64 -p nascent-042513 -i /etc/ec2/amitools/cert-ec2.pem -i $(ls /etc/ssl/certs/*.pem | tr \\n ,) --ec2cert /etc/ec2/amitools/cert-ec2.pem
42
+
43
+ ec2-upload-bundle -b sbmp-instances -m /mnt/bundling/nascent-042513.manifest.xml -a <access key> -s <secret key>
44
+
45
+ (For some reason this didn't:)
46
+ ec2-register sbmp-instances/nascent-042513.manifest.xml -n Nascent042513 #but web console worked fine
47
+
48
+
49
+ So, if provision, needs to be something like:
50
+
51
+ GC:
52
+ rake bake[target,ami_name]
53
+ -> ssh target rake bake (can return 13:"Target incapable", but if 0:...)
54
+ Important here - on success, there needs to be a long-running process on target
55
+ So: background self? Fork new process and return "We're good to go?"
56
+ -> build json configs
57
+ -> ssh tunnel'd provision (target wants creds, configs)
58
+ "Baking initialized"
59
+
60
+ (Pattern to be repeated in remote re-provisioning, too)
61
+
62
+ How to tell when done, where it's at?
63
+
64
+ Target rake task needs to log process, so reviewing/tailing logs lets us answer
65
+ the question "is it done yet." SNS/SES/other email when done? Maybe something
66
+ simple like "mail" command - if set up, bully, otherwise, you're on your own
67
+
68
+
69
+ Of note: there is a ec2-migrate-manifest command that has the basis of regenerating a manifest for a bundle (it's Ruby)
70
+ The right solution to multiple-client AMIs is LRD hosting the bundles on our S3, give permissions on them, and let clients register the AMIs that way. -- I think. Sorted this out with Locaverse, but the details are fuzzy atm.
@@ -0,0 +1,152 @@
1
+ # vim: set ft=ruby:
2
+ =begin
3
+
4
+ Of note:
5
+
6
+ /etc/chef/solo.rb:
7
+ file_cache_path "/var/chef-solo"
8
+ cookbook_path "/var/chef-solo/cookbooks"
9
+ json_attribs "http://www.example.com/node.json"
10
+ recipe_url "http://www.example.com/chef-solo.tar.gz
11
+
12
+ Means that "chef-solo" will work ootb
13
+
14
+ So: packaging cookbooks, and putting them places (VM dir + unpack, S3) is a
15
+ thing
16
+
17
+ Leaning towards: not using S3 as a webserver, since it makes cookbooks public
18
+ (ish)
19
+ Also, adds variation to VM/AMI cases - S3get with perms needs to pull/unpack
20
+ tgz. Then the solo runs on unpacked cookbooks in both cases
21
+
22
+ First feature after "it works": rollback. It was just working - make it work again.
23
+
24
+ Running specs on VM. Auto-mount of code directory a la Vagrant...
25
+
26
+ Checkpointing stuff - snapshot VM, bundling EC2 - after setup, after provision
27
+
28
+
29
+ Fundamental goal:
30
+
31
+ Two orthagonal configurations:
32
+
33
+ 1) What my hosting environment looks like
34
+ 2) Where my hosting environment lives.
35
+
36
+ I should be able to describe 1 and make it happen on different 2s.
37
+
38
+ Scenarios:
39
+
40
+ Dev in VM, deploy to EC2 (or ideally, any Fog target)
41
+
42
+ Deploy a monolith ->
43
+ deploy simple cluster ->
44
+ deploy autoscaling worldbeater
45
+
46
+ Clear already that there are cases where a particular action needs to
47
+ happen in different places - Maybe special cases ignore configs they don't
48
+ handle?
49
+
50
+ Only trouble is the possiblity of ball-dropping: "I don't do that, and neither
51
+ do I"
52
+
53
+
54
+ Version 1:
55
+ Everything possible is "chef'll do it"
56
+ "Target Configuration" is: write your Rakefile that way.
57
+ "Env Configuration" is: write your cookbook/attrs
58
+ Ideally: that's enough.
59
+
60
+ =end
61
+
62
+ #Parent/host system
63
+ module Construction
64
+
65
+ #setup => rake bootstrap[address]
66
+ setup = Setup.new
67
+
68
+ setup.in_namespace do
69
+ #create chef config dir on server
70
+ dir = CreateDirectory.new(setup) #needs server, dir
71
+
72
+ #template Rakefile
73
+ rakefile = BuildRakefile.new(setup)
74
+
75
+ #scp Gemfile to server
76
+ #scp Rakefile to server
77
+ copyfiles = CopyFiles.new(setup, rakefile, dir)
78
+
79
+ #bundle setup config dir
80
+ bundler = BundleSetup.new(setup, dir)
81
+ end
82
+
83
+ #Construct bootstrap:
84
+ #
85
+ #VM mode:
86
+ #
87
+ #
88
+ #EC2
89
+
90
+ configs = ChefConfigs.new #data for precursor
91
+
92
+ vbox = Launch::VirtualBox.new(configs) #vbox instance?
93
+
94
+ #launch VM
95
+ vbox.in_namespace do
96
+ #scp json precursor to VM
97
+ #scp chef cookbook to config dir
98
+ scp_files = CopyFiles.new(vbox) #cookbook, attributes
99
+ #ssh rake constuct:provision
100
+ run_provision = RemoteProvision.new(vbox)
101
+ end
102
+
103
+ #launch AMI w/ user metadata - json precusor
104
+ ec2 = Launch::EC2.new(server_configs)
105
+ end
106
+
107
+ =begin
108
+ rake launch =>
109
+
110
+ AMI mode:
111
+
112
+ run on start
113
+ /etc/rc.d/local => rake startup
114
+
115
+ get chef.json precursor from instance metadata
116
+ s3 get chef cookbook into config dir
117
+
118
+ rake construct:provision
119
+
120
+ Launch tasks (rake construct:provision)
121
+
122
+ build chef json config
123
+ build chef rb config
124
+ run chef solo
125
+
126
+ =end
127
+ #Target/child
128
+ module Construction
129
+ provision = Provision.new do |prov|
130
+ prov.attr_source = ""
131
+ prov.cookbook_path = ""
132
+ prov.config_path = ""
133
+ end
134
+
135
+ ec2_start = EC2Boot.new(provision)
136
+ ec2_start.in_namespace do
137
+ metadata = RetrieveMetadata.new(ec2_start) #url path => filesystem path
138
+ cookbook = GetCookbook.new(ec2_start) do
139
+ source_url = "s3://..."
140
+ end
141
+ end
142
+
143
+ provision.in_namespace do
144
+ attrs = BuildAttributes.new(provision) do |attrs|
145
+ attrs.destination_path = ""
146
+ end
147
+ unpack = UnpackCookbook.new(provision)
148
+ #location of precursor
149
+ chef = RunChef.new(attrs, provision) #loc of json, rc, cookbook
150
+ end
151
+ task :launch => [ec2_start[:run], provision[:run]]
152
+ end
@@ -0,0 +1,4 @@
1
+ # vim: set ft=ruby :
2
+ require 'logical-construct/target'
3
+
4
+ include LogicalConstruct
@@ -0,0 +1,148 @@
1
+ --- Current showstoppers (pre-share with Evan/LRD)
2
+
3
+ Current provisioning can't handle symlink for cookbooks dir
4
+
5
+ [written] SSH tunnelling for provision - ideally including a local HTTP proxy of all servers in need
6
+
7
+ Chef: multiple cookbooks (e.g. LRD base + Client deploy)
8
+ Manifest patching (the Stanford NLP problem)
9
+
10
+ [written] Bless(/bake) instances
11
+
12
+ [written] Logging provisioning stuff - especially the chef output. rake provision outputs nothing until done. Logging or output would be handy.
13
+
14
+ --- 1= known showstoppers fixed. Other bugs:
15
+
16
+ Check fixed: Bug: /etc/init.d/logical-construct is generated once and never rebuilt, so the LC_DP variable isn't set per rake setup.
17
+
18
+ [written] Unpack needs (at least the option) to clobber target directory - otherwise
19
+ "bad" files that are just deleted poison the directory.
20
+
21
+ [written] Pack needs (something) to handle deleted files in the source directory - so
22
+ file-style + archive index - we need to recreate an archive if a file has been
23
+ deleted
24
+
25
+ The ephemeral mounts task mounts and remounts (... and remounts) directories in
26
+ the /mnt directory. Should be able to re-run chef without duplicating mounts
27
+
28
+ --- Features
29
+
30
+ Quick target management tasks:
31
+ Collect server IPs into file(s)
32
+ template shell scripts in related files/dirs
33
+ rake target_management:restart_sidekiq <- auto from script name
34
+
35
+ Also: Some tasks might amount to "run same task name on target"
36
+ (Most should migrate there.) So: see if it's there, and run it if it is.
37
+ (Instead of local?) Hm. Would be exposed as form on the LC web service
38
+
39
+ VBox provisioning test mode - normally vbox should be === normal deploy. Also
40
+ good would be a mode where cookbooks dirs from host machine are mounted at
41
+ client so that they can be edited locally vagrant style
42
+ Once you start down that path, might as well look into mounting code
43
+ directory as well...
44
+
45
+ Like to do smaller provisioning chunks. SB has 100+MB files in their cookbooks,
46
+ and transmitting the whole thing is torturous.
47
+ One solution would be multiple cookbook-things that get fused somehow A tool
48
+ to produce those things (basically an install pack) would be helpful.
49
+ I think git could be used to produce them without having to be the distribution
50
+ channel - basically diff the last one etc.
51
+
52
+ Separate provision volumes makes sense from the perspective of bridging
53
+ projects (i.e. the LRD base volume, the LRD NLP volume, the SB special
54
+ volume) and then patches for each.
55
+
56
+ Distinct packages (filelists intersections are empty sets)
57
+ Ensure a "rakelib" dir exists.
58
+ Target: `rake provision` pulls in package rake tasks - standard hooks
59
+ Means: a "chef" package to make sure gems are installed, and set up chef hooks
60
+ Then "cookbook" packages hook into the chef stuff to configure chef in memory before the chef tasks write configs and run
61
+
62
+
63
+ Non-file platform provisioning requirements of the server-
64
+ notably volumes: perhaps "I need X GB with on (device/label)"
65
+ The userdata solution ... change the instance device mapping config
66
+ At which point, a chef recipe could mount them on the right place
67
+ maybe extra NICs? GPU?
68
+ "this OS installed. portage version=..."
69
+ listed on the provisioning web service, and PUT means "check again"
70
+
71
+ Arrange deployment vs. application code... related at all?
72
+ related to:
73
+ "Compile" (rails) app into deployable - assets:precompile on deployment servers is silly.
74
+
75
+ AWS resolutions:
76
+ from user_data (or other instance metadata)
77
+ from S3?
78
+
79
+ Resolution chains - "look at instance metadata, then S3, then start Sinatra"
80
+ Needs to also be "loops" - "Sinatra got a resolution, but that changed the needs list - recheck"
81
+
82
+ Resolution manifests - all Satisfiables "needed" unless they match the manifest (if the manifest task is present...)
83
+
84
+ "Promote" VBox instances to AWS (generally: convert instances between platforms)
85
+ (Therefore likewise: translate AWS to VBox)
86
+
87
+ Something to handle private keys - an -i option to the SSH commands, basically,
88
+ but it needs to be per-project, and not in the Rakefile. There's the
89
+ user-configuration, which'll make sense for a lot of things
90
+ (Time being: Judson is using Host *.compute-1.amazonaws.com in .ssh/config)
91
+
92
+ Switchable identities - there's some baking needs to happen for LRD, and then some for SB
93
+
94
+ GC provision WebConfigure: output re: uploads
95
+
96
+ Integrate with ... something for instance management
97
+ Should completely replace current workflow of: start Instance, record IP, later:
98
+ for s in $(cat <some ip files>); do <management>; done
99
+
100
+ Update LC on provisioned box (aot go back to nascent and re-setup)
101
+
102
+ Cascading rakelib dirs - especially for the case of adding commands that loop on/pick a server.
103
+
104
+ git management for plan dirs: commit to a local branch-name (e.g.
105
+ "jdl-deployed") with a tag of the Manifest ID, push to repo, so that others
106
+ able to reproduce the details of a deploy. Obviously would need a "don't git
107
+ publish" for "secret plans" e.g. github secret keys etc.
108
+
109
+ --- Nice to have (usually easy)
110
+
111
+ [written] Decompose into 2 tasklibs the ChefConfig tasklib - something like UnpackTarballs and ConfigureChef
112
+
113
+ Bug: why do we emit several "tar" commands for the cookbook directory?
114
+
115
+ Descriptions: need for setup, provision tasks - not sub tasks of setup
116
+
117
+ [written] Move /var/logical-construct to /var/run/lc or /opt/bin/lc or ...
118
+
119
+ provision namespace needs a "list roles" task
120
+
121
+ LC should echo local IP (at least) on failure
122
+
123
+ LC init task should start a "status/report" server on complete - maybe just single page of "success/fail" and chef log
124
+
125
+ --- Gentoo related
126
+
127
+ After initial deploy, /usr/src/linux not needed
128
+
129
+ sqlite version of md5cache
130
+
131
+ /usr/portage should be an external mount (not just distfiles/packages) because the md5cache is huge.
132
+
133
+ Consider S3 as a PORTAGE_BINHOST - should be possible to do installs on a machine, then mirror /usr/portage/packages to S3, especially if the metadata in S3 is such that we don't re-upload packages we pulled down to do the build.
134
+
135
+ Binhost needs to be related to arch, CHOST, CFLAGS, processor USE flags (MXX, SSE, ???)
136
+
137
+ How to deal with portage? Open questions:
138
+ eix-sync
139
+ & syncing /usr/portage
140
+ & updating portage
141
+ I think the real answer here is that "version of portage" is a non-file provisioning requirement. U2D system is really a not a touchless problem, IMO. Does imply a smaller/staged deployment, if only to get mounts.
142
+ Maybe: "how long since last sync? and if more than (days) sync, update portage"
143
+ man emerge: "emerge-webrsync pulls one tbz which is faster for first-time"
144
+ How long to last: emerge --info includes "Timestamp of tree"
145
+
146
+ --- Bluesky wishlist
147
+
148
+ Hypermedia client in Ruby for provisioning
@@ -0,0 +1,96 @@
1
+ VERY IMPORTANT:
2
+ Version of the ec2-ami-tools MUST BE UP TO DATE.
3
+ Otherwise bundling will be buggy and waste lots of time.
4
+
5
+
6
+ Determine size of Vbox instance
7
+ exclude some dirs?
8
+ df/du
9
+ Create disk image of appropriate size (+wiggle room - 10-20%)
10
+ `dd if=/dev/zero of=aws-nascent.img bs=1M count=5000`
11
+ Format image
12
+ gotcha: tunefs to never fsck
13
+ gotcha: keep sparse
14
+ `/sbin/mke2fs -j aws-nascent.img`
15
+ `/sbin/tune2fs -c 0 -e continue -i 0 aws-nascent.img`
16
+ Mount image
17
+ sudo mkdir /mnt/nascent_vm
18
+ sudo mount aws-nascent.img /mnt/nascent_vm/
19
+ Copy data from vm
20
+ cd /mnt/nascent_vm
21
+ (ensure /boot is mounted on vbox)
22
+ ssh root@lrd-aws-nascent 'find / -regextype posix-egrep -depth \! -regex "/(proc|sys|dev).*" -print0 | cpio -o -0a' | sudo cpio -i -dumv --no-absolute-filenames
23
+
24
+ FYI
25
+ ec2-bundle-vol excludes:
26
+ /proc
27
+ /proc/xen
28
+ /sys
29
+ /sys/kernel/debug
30
+ /sys/fs/cgroup/cpuset
31
+ /sys/fs/cgroup/cpu
32
+ /sys/fs/cgroup/cpuacct
33
+ /sys/fs/cgroup/freezer
34
+ /dev/pts
35
+ /proc/sys/fs/binfmt_misc
36
+ /dev
37
+ /media
38
+ /mnt
39
+ /proc
40
+ /sys
41
+ /mnt/ami/lc-setup
42
+ /mnt/img-mnt
43
+
44
+
45
+ Additions to EC2 pre-bundle
46
+ Update /etc/ssh/sshd_config - RootLogin without-password
47
+ Add lrd_rsa.pub to root authorized_keys
48
+ Add ec2-init script to /etc/init.d
49
+ add ec2-init to boot runlevel with softlinks
50
+ check /etc/fstab
51
+ Change fstab and /boot/grub/menu.lst to refer to /dev/xvda
52
+ ensure /proc /sys /dev exist
53
+ ---
54
+
55
+ Unmount bundle image
56
+ umount /mnt/nascent_vm
57
+
58
+ Bundle for EC2
59
+ #This does happen at volume bundle time
60
+ block mapping: /dev/sda2=swap /dev/sda3=ephemeral0 #if fails, /etc/fstab
61
+ Minimal options on bundle
62
+ Must include arch - don't include kernel
63
+
64
+ Upload to EC2
65
+ Remember --retry
66
+ Register AMI
67
+ Register with instance options (kernel, etc)
68
+
69
+ *********
70
+
71
+ Set up AWS credentials:
72
+
73
+ openssl genrsa 1024 > aws-creds/pk.pem
74
+ openssl req -new -x509 -nodes -sha1 -days 3650 -key aws-creds/pk.pem -outform PEM > aws-creds/cert.pem
75
+
76
+ vim aws-creds/AwsCredentialFile
77
+ """
78
+ AWSAccessKeyId=<Write your AWS access key ID>
79
+ AWSSecretKey=<Write your AWS secret key>
80
+ """
81
+ vim aws-creds/establish-certs
82
+ """
83
+ export AWS_CREDENTIAL_FILE=aws-creds/AwsCredentialFile
84
+ export EC2_CERT=aws-certs/cert.pem
85
+ export EC2_PRIVATE_KEY=aws-certs/pk.pem
86
+ """
87
+
88
+ source aws-creds/establish-certs
89
+ iam-useraddcert -f aws-creds/cert.pem
90
+
91
+
92
+ **** related to baking EC2 images:
93
+ default ec2-bundle-vol excludes all .pem files by default. Including files required to re-bundle. Explicit include required.
94
+ includes required on:
95
+ /opt/ec2-ami-tools/etc/ec2/amitools/cert-ec2.pem
96
+ /etc/ssl/