ShutIt – Automation framework for programmers
ianmiell.github.io
ianmiell.github.io
Another related tool I'm working on is:
https://github.com/ianmiell/shutitfile
Why this over Ansible? It's a long story :)
Mainly because not everyone is a great or even decent programmer, so I wanted an easy way in for them for the situation I was in. Hence automation for everyone. But I don't think this is a serious competitor for Ansible.
Happy to answer questions as they arise.
https://www.youtube.com/watch?v=zVUPmmUU3yY https://www.youtube.com/watch?v=UGp16yvSrFE
And I've blogged quite a bit about ShutIt use cases here:
http://zwischenzugs.wordpress.com/
and the genesis of ShutIt and Docker:
If you have an interest in usable automation, an expertise in terminal internals, or just want to get involved, please get in touch.
@ianmiell
As someone who just spent the last year of his life using Ansible, something tells me I already know this story. I feel for you.
- Its dependence on Python 2.X, unfortunately all the newer OS's have Python 3.X installed by default. While i have a role for installing this manually it isn't super nice.
- My main devops project consists of 11 different environments, and it manages nearly 2k servers. Trying to write environment agnostic roles is an absolute nightmare. Furthermore my group_vars, host_vars, and dynamic inventories have turned into spaghetti. Why? Because of how confusing variable precedence becomes, when you get into extremely complex hierarchy of group_vars which can randomly break.
- It is really hard to handle cases where playbooks/roles fail and deal with it cleanly. Blocks have helped a bit, but there is no way to grab the exception that caused the playbook to fail.
- The yaml syntax becomes messy fast, Jinja2 is powerful but there are times i wish you could just shove a single line of python into places to prevent the huge mess of with_items, register, set_fact, etc.
- AWS modules are a very mixed bag. A lot of them are missing features, and there is some very weird issues that apparently boto is the cause of (e.g. they should move to boto3). Even then i need to do a huge amount of boilerplate to launch ec2 instances.
- There is no way to share a common group_vars between inventories (all is specific to inventory). Which leads to a lot of duplication. (Yes the symlink trick does work, but causes a bunch of other issues).
I still love Ansible and i would pick it over Chef/Puppet. Salt is also another decent one that has made a lot of progress lately.
Regarding failure, ShutIt drops to a shell on error (if there's a tty), so you can correct manually before continuing (pause_point). These can also be triggered directly for debugging purposes.
I don't like YAML for anything complicated. The bash scripts I saw embedded in YAML felt wrong. Why not just use shell?
Env-agnosticism (eg 'install' packages rather than yum/apt) was built in because it was created in a bi-OS env (ubuntu and CentOS).
I stopped trying to write completely agnostic roles. This does result in some duplication but much less hair-pulling overall.
Yes ansible is what made me grow to dislike yaml.
Salt does look interesting but it was too young when we started. I don't know if we would be trading Ansible's shortcomings for Salt's.
For sharing common group_vars, what I do is my inventory passes an environment-aware variable which I include in the playbook by doing like:
`- include: "env_vars/{{ environment }}/main.yml"`
I feel I sidestepped some of the AWS modules issues simply by using Terraform. I still build all my images in Packer using the Ansible builder though.
Usually I describe Ansible as the tool for people who don't come from a programming background and won't be administrating a huge amount of servers. Otherwise, if you need scale then use Chef (as why would you want to have to deal with scaling AND Puppets terrible DSL).
The use case is a heroku/docker type cli without needing to mess with the Python args module and setting up a bash alias
For example, from the example on the home page:
# Ensure git is installed. This handles different distros gracefully.
shutit.install('git')
Awesome and very powerful abstraction! Vs the next lines... # If the directory does not exist, we create it
if not shutit.file_exists('/opt/shutit',directory=True):
shutit.send('mkdir /opt/shutit')
Why not just: shutit.send('mkdir -p /opt/shutit')
There are a few other examples where I was wondering how you decided to do some operations in ShutIt vs delegating to shell. In fact, some entire examples look simpler to me in shell that you could just send. Does using the ShutIt native commands make things more testable?Mostly it's where using the shell would be painful. Do you have other specific examples?
https://github.com/ianmiell/shutit-home-server/blob/master/S...
so I can port to Centos from Ubuntu pretty easily.
PS That's an example of a ShutItFile, which is still a WIP.
This is the same reason why I dislike, for example, seeing the documentation of a library showing how to perform actions X, Y, and Z, but a footnote says "by the way, there is no error checking in this example". Well then, why use this code as an example?
Anyway, sorry for the rant. ShutIt does seem interesting :)
Actually, I have similar problems when teaching - I'm writing a git course at the moment, and it's hard to illustrate concepts in a realistic way without hopelessly artificial repos.
Also, configuration management tool should be, apart from downloading configuration from somewhere, independent from any external server/service.
You need a) interactive shell, b) configuration management tool (which works in scheduled batch mode and in "pull" style, not "push" as in Ansible), and c) system for running ad-hoc commands synchronously (this one is "push" style). Yes, all three. Yes, separate, not a weird mix of them. Been there, done that.
You seem to have a serious down on the whole concept behind Ansible, and I'm curious why that is. Have you had a bad experience with it? If so, I'd like to hear about it, in order to better inform my own analysis of the tool.
No, not really. Not on the high-level idea(s). Heck, I've written myself (or at least deployed already-written) tools for what Ansible tries to do: configuration management, synchronous mass running an ad-hoc command on a set of machines, and running a specific, parametrized procedure on a single host. I recognize all these scenarios are important and I want to have tools for each of those, but let the tools do these jobs robustly.
What bothers me is design decisions and architecture of Ansible (and other tools sharing them). The decisions seem sound from far away, but they start leaking once you look closely. Good general tool would be robust for pretty much all the use cases; Ansible is brittle (breaks when you misconfigure sshd_config a little; breaks when you accidentally overwrite SSH keys; can't work if you don't have account with working shell and $HOME; breaks apart when some of the hosts are down; and so on).
Ansible apparently started as a script that automated somebody's workflow (which is a good thing) -- and stayed that way, but now is marketed as a general tool (which is not, but resembles it closely enough to trick many its users into thinking it is).
It all boils down to Ansible still being a quick hack for somebody's specific workflow and me hating buzz around half-assed tools.
> Have you had a bad experience with it? If so, I'd like to hear about it, in order to better inform my own analysis of the tool.
I have so many objections against Ansible (some I mentioned above) that it actually makes more sense to write a separate article about it, but this will take time.
I think that's a key critique of many of these things. They start off solving one problem, then eventually become 'enterprise', and the design trade-offs get exposed. This is what I was alluding to above with my trade-offs comment.
Puppet has similar history, I believe, as a tool that was written to replace cfengine (2.x) without its shortcomings.
I'm also building on ShutIt to create a really stupid-simple automation language based on Dockerfiles:
https://zwischenzugs.wordpress.com/2016/04/24/interactive-gi...
If people have a use for this for their org I'd be happy to help them write more.
I've used Fabric a lot and it's "cousin" invoke. I wish I'd seen fabric listed in the requirements.txt because I feel like it's got a nice API and has been around a while and is probably a bit more battle tested...