Chef, Knife, AWS, and Windows: Part 2
Update: Part 3 removes the need for explicit password setting!
In Part 1 of this series of blog posts, I started working on getting
knife-ec2 to bootstrap Windows machines for me and connect them to a Hosted
Chef server. My steps mostly worked, but I realized after running them that I
had made one critical mistake: I assumed that associating a public IP after the
fact and running bootstrap would have the same effect as simply associating the
public IP from the beginning. This was wrong.
In my initial run, I didn’t pass --associate-public-ip to knife-ec2 – as it
turns out, you do need a public IP to do, well, most things (including things
like downloading the Chef client, which is pretty important ;-). I had simply
associated an IP afterwards and bootstrapped the machine, thinking it would work
the same. However, knife-ec2 seems to look in the wrong variables when it
tries to retrieve the address for the newly created VPC instance, causing
bootstrapping to fail when a public IP is associated.
You can resolve this in one of two ways:
- Install the pre-release 0.11.0.rc.0 version of
knife-ec2. https://github.com/chef/knife-ec2/commit/e050c9c732798253baaf1008497ab6eb539f83c1 commits a fix for thessh_connect_hostfunction, and the corresponding PR was merged after 0.10.0 released. You can do this by runninggem install knife-ec2 --pre. - Apply the patch from
https://gist.github.com/bojanrajkovic/fa4810162c3233cdeef6 in the
knife-ec2gem’slib/chef/knifedirectory. It does some additional patching to haveknifeprint the public IP that was assigned after the provisioning is done.
After you do that, the following knife ec2 invocation should work:
knife ec2 server create \
--node-name <YOUR NODE NAME> \ # e.g. Foo
--ebs-size <EBS VOLUME SIZE IN GB> \ # e.g. 40
--flavor <INSTANCE TYPE> \ # e.g. t2.medium
--region <REGION> \ # e.g. us-east-1
--subnet <VPC SUBNET> \ # e.g subnet-deadbeef
--image <AMI ID> \ # e.g. ami-5b9e6b30, corresponding to the latest Server 2012 R2 RTM image in us-east-1
--security-group-ids <SG LIST> \ # e.g. sg-deadbeef,sg-beefbeef -- the list must be comma-separated
-A <AWS_ACCESS_KEY> \
-K <AWS_SECRET_KEY> \
--ssh-key <KEY NAME> \ # must correspond to a .pem file in ~/.ssh/
--user-data <PATH TO USERDATA FILE FROM STEP 3> \
--winrm-user Administrator \
--winrm-password <PASSWORD FROM USERDATA FILE> \
--winrm-transport plaintext \
--associate-public-ip \ # Without a public IP, bootstrap can't download the Chef client
Leave a comment