Using Chef Solo to provision a Windows EC2 instance and bootstrap it
I'm trying to automate our CI process for a couple of .NET apps, and in a perfect world I'd like to spin up a Windows EC2 instance for each, bootstrap the instance to install Chef Solo and then execute a Chef recipe to install some dependencies and the packaged software itself.
However - I'm a novice and have no idea even if that is feasible let alone where to start :)
I'm fairly well versed with the command line tools for AWS so can spin up an AMI ok, but beyond that point I'm pretty stuck. I would like to avoid building a custom AMI with chef pre-installed as that takes a lot of the advantages away.
I think this is essentially what I need to do - but is (unsurprisingly) focused on Linux:
http://www.opinionatedprogrammer.com/2011/06/chef-solo-tutorial-managing-a-single-server-with-chef/
Does anyone have a link to someone who has done this or similar before? Or a better way of achieving what I'd like to do?
Any help appreciated.
Most Windows bootstrap resources are focused on Hosted Chef and using the knife-windows
plugin.
However this should be possible with Chef solo.
If you're not building an AMI with chef-client
on it then your first step is to get the Full Chef Windows installer on there.
Fortunately, as I recall, winrm
is enabled by default on the Windows Amazon AMIs.
Take a look here for a potential bootstrap solution : https://stackoverflow.com/a/13284313/2205881
You could bootstrap other stuff at the same time; like Ruby Windows Installer etc. In the same process grab your cookbooks, roles etc and kick off your Chef provisioning.
UPDATE
I've started doing this in a slightly different way, using a --user-data-file
when creating the instance. This can be used with the AWS API, command-line-tools or simply pasted into the web interface when Launching the Instance.
I'm using Chocolatey, a package manager, to install chef-client.
<script>
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
cinst chef-client
</script>
Basically:
<script>
tells AWS's user data scripts we've got a batch file to process.@powershell...
(etc) is a command to install Chocolatey from it's docs.cinst chef-client
installs the chef-client
package.
None of this requires any user input. User data is executed as a local administrator.
All Amazon AMIs run their user data on first boot (by default) and not on subsequent boots. So this is a very simple way to get chef-client
in place without needing to connect to RDP or even obtain your Administrator password.
An alternative is to simply pass in a "user data script" written in Powershell. You just create a text file similar to the following (hello.ps1):
< powershell >
#Code to download and install aplications goes here
< /powershell >
Then when you launch the instance, you simply pass in the userdata file:
ec2run --region "us-east-1" "$ami" `
--group "$mygroup" ` --subnet "$mySubnet" --instance-type "m1.medium" ` --key "$myKey" ` --user-data-file "hello.ps1"
You can download your binaries from S3 and do your installations completely via the single PowerShell script. Here is some documentation from Amazon for your reference