Does Chef execute cookbooks and recipes on each client run - windows

We have a Windows environment, which is provisioned with Chef. There is a scheduled task which executes the chef client every 15 minutes.
One of the recipes restarts the machine, what is of concern is that the machine will be restarted every time the chef client is executed. Based on observation, this doesn't seem to be the case.
Is there a mechanism which makes chef aware that a given cookbook/recipe was already executed and doesn't need to be executed again?

Related

Ansible vs Puppet - Agent "check-in"

When it comes to Ansible vs Puppet, what's the difference when the nodes are receiving their configuration?
I know that the Puppet agent checks in every 30 min to get their configuration.
How is this for Ansible?
Puppet agent runs every 30 minutes by default making sure the state of
the checked in node (server) is in the desired (described) state.
Ansible doesn’t have that mechanism so if you want a scheduler you
need to look at Ansible Tower which has recently become Open Source.
Puppet vs Ansible
Ansible works on push model whereas puppet works on pull model i.e the nodes are pulling the configuration from the puppet master

Run batch file on windows ec2 instance then shutdown instance?

I have a .bat file on a windows ec2 instance I would like to run every day.
Is there any way to schedule the instance to run this file every day and then shut down the ec2 instance without manually going to the ec2 management console and launching the instance?
There are two requirements here:
Start the instance each day at a particular time (This is an assumption I made based on your desire to shutdown the instance each day, so something needs to turn it on)
Run the script and then shutdown
Option 1: Start & Stop
Amazon CloudWatch Events can perform a task on a given schedule, such as once-per-day. While it has many in-built capabilities, it cannot natively start an instance. Therefore, configure it to trigger an AWS Lambda function. The Lambda function can start the instance with a single API call.
When the instance starts up, use the normal Windows OS capabilities to run your desired program, eg: Automatically run program on Windows Server startup
When the program has finished running, it should issue a command to the Windows OS to shutdown Windows. The benefit of doing it this way (instead of trying to schedule a shutdown) is that the program will run to completion before any shutdown is activated. Just be sure to configure the EC2 instance to Stop on Shutdown (which is the default behaviour).
Option 2: Launch & Terminate
Instead of starting and stopping an instance, you could instead launch a new instance using an Amazon CloudWatch Events schedule.
Pass the desired PowerShell script to run in the instance's User Data. This script can install and run software.
When the script has finished, it should call the Windows OS command to shutdown Windows. However, this time configure Terminate on Shutdown so that the instance is terminated (deleted). This is fine because the above schedule will launch a new instance next time.
The benefit of this method is that the software configuration, and what should be run each time, can be fully configured via the User Data script, rather than having to start the instance, login, change the scripts, then shutdown. There is no need to keep an instance around just to be Stopped for most of the day.
Option 3: Rethink your plan and Go Serverless!
Instead of using an Amazon EC2 instance to run a script, investigate the ability to run an AWS Lambda function instead. The Lambda function might be able to do all the processing you desire, without having to launch/start/stop/terminate instances. It is also cheaper!
Some limitations might preclude this option (eg maximum 5 minutes run-time, limit of 500MB disk space) but it should be the first option you explore rather than starting/stopping an Amazon EC2 instance.

How to ensure Chef nodes and EC2 instances are in sync?

So, using knife we can create an EC2 instance and get its corresponding Chef node to show up on the Chef server, all with a single command. So far so good!
But do you have a tool or workflow for validating the link between instance and node? I had manually deleted an EC2 instance and so ended up with an orphaned Chef node.. it seems to me if I had a complicated network of instances I could've missed that. Or do you entirely bypass this by having a hard rule that no-one ever messes with EC2 instances directly, or something similar?
I'm new to Chef if it's not obvious, curious to understand how using Chef scales.
Chef records when a node last checked in under node['ohai_time'] so you can use that to filter down results when using Chef for service discovery. A better option is to not use Chef for service discovery in favor of a tool built for it like ZooKeeper or Consul. Other than that, having orphaned data isn't really a huge deal so I generally ignore it. In the past I've also hooked up ASG scaling events to remove the associated node and client. I've also seen people put a script on the machine to be run on shutdown that removes its own node and client, though this can still leave orphans every now and then.

Yum command on new EC2 Instances

What's the recommended method to automatically run 'yum update' after a new EC2 Instance launch (Instance based on Amazon Linux AMI)
You could use a CloudInit User-Data Script.
I would personally configure a shell script to pass as user data, which would run all needed server set up tasks.
Configure an init task on a fresh EC2 instance to run yum update on some sort of schedule (you generally want to ensure that all of your instances are always running identical versions of software), then create a new AMI from the running instance you just modified.
From then-on, simply launch your new AMI instead of a fresh AMI. Over time, you'll want to do this same thing again so that instance launches won't take so long as more and more updates become available.
Once every 3-4 months seems to be a good delta.

Running a script on an AWS server

I have a script that I need to run once a day that requires a lot of memory. I would like to run it on a dedicated amazon box.
Is there some automated way to build a box, download all required software (like ruby) and then run my script. After the script is ran, I would like to shutdown the box.
The two options I can think of are:
I am thinking about hacking EMR to do this. (My script is a mapper against an empty directory)
Chef - This seemed like too much for one simple script.
You can accomplish setting up a new EC2 instance on startup using the official Ubuntu AMIs, the official Amazon Linux AMIs, and any other AMI that supports the concept of a user-data script.
Create a script (bash, Perl, Python,
whatever) that starts with #!
Pass this script as the user-data when running the EC2 instance.
The script will automatically be run as root on the first boot.
Here's the article where I introduced the concept of a user-data script:
Automate EC2 Instance Setup with user-data Scripts
http://alestic.com/2009/06/ec2-user-data-scripts
Your user-data script can install the required software, configure it, install your work script, and set up a cron job that runs the work script once a day.
ENHANCEMENT:
If the installation script don't take a long time to run (e.g., under an hour or few) then you don't even have to run a single dedicated instance 24 hours a day. You can instead use an approach that lets AWS start an instance for you on a regular schedule.
Here's an article I wrote that provides details on this approach with sample commands:
Running EC2 Instances on a Recurring Schedule with Auto Scaling
http://alestic.com/2011/11/ec2-schedule-instance
The general approach is to use Auto Scaling to start an instance with your user-data script on a regular schedule. Your job will terminate the instance when it has completed. They key is to suspend Auto Scaling's normal desire to re-start instances that terminate so that you don't pay for a running instance until the next time your job starts.

Resources