• How do we have multiple machines in a reasonably consistent state? • How do we manage configuration and migration of machines in bulk? • How do we document our system topology? (sort of)
Alert: Began moving to Ansible in 2013. • Only implemented production cookbooks; no concept of using devops code for development (Vagrant didn't exist yet). • Production servers hosted on Rackspace.
certain aspects of servers ("small", "medium", etc.) ✓ Easy sysadmin provisioning - Support for development - Reusability - Easy client services provisioning
product in September 2013. • Migrated existing Chef recipes to Ansible roles (with some structure changes) in under a week. • Ansible playbooks and roles also supported local development (with Vagrant).
certain aspects of servers ("small", "medium", etc.) ✓ Easy sysadmin provisioning ✓ Support for development ✓ Reusability - Easy client services provisioning
• In Chef, a client asks a server what to do, then does it. Actions are tied to the single client machine. • In Ansible, the machine running the playbook connects to the clients and does stuff.
Ansible modules can be written in any language. • Executable file; must return valid JSON. • Caveat: All code accepted into Ansible itself must be in Python.
show no changes. • Not always possible, but usually is; key difficult modules like shell have tools to determine whether to perform actions. • When in doubt, custom modules can handle more complex idempotency situations.
uploading cookbooks to a Chef server (knife cookbook upload). • The client-initiated model of Chef requires this (the client must have a way to know where to get the right marching orders from). • Easy to get into confusing situations, and adds hurdles for testing cookbooks.
restriction. At all. • Any machine with Ansible installed and appropriate transport (SSH) credentials can do things. • No need for a second store for code, version control that isn't really version control, etc.