Learn
Ansible for robot fleets, and where it breaks.
Almost every robotics team ships firmware with Ansible and shell scripts, because it is what exists and it works at first. This is the honest account of which assumptions fail, and roughly when.
Why it is always Ansible
It is a reasonable choice. Ansible is agentless, it is already in the building, it needs nothing on the device beyond SSH and Python, and a playbook that copies a binary and restarts a service is fifteen lines. For the first twenty units it is genuinely the right tool, and reaching for something heavier before then would be overengineering.
None of what follows is a criticism of Ansible. It is an excellent tool being used a long way outside the environment it was designed for: reachable machines, on a network you control, that are up when you run the playbook.
The four assumptions that break
01Push requires reachability
Ansible connects out to the target. A robot behind a customer firewall, on a carrier NAT or simply parked with the modem asleep is not connectable, so the playbook reports unreachable and the unit silently does not get the update. Twenty of those in a run and nobody can say who is on what.
02Steps are not atomic
A playbook is a sequence. Lose the link between step four and step five, over LTE, on a machine that just moved behind a shed, and the unit is left in a state that is neither the old build nor the new one. Idempotence helps on the retry, if there is a retry.
03There is no rollback that works
The usual answer is a second playbook that reinstalls the previous version. It requires connecting to the unit, which is exactly what the failure you are recovering from prevents. A release that breaks networking cannot be fixed by a tool that needs the network.
04Inventory becomes fiction
The inventory says which machine runs which version. It is right until the first hand-applied hotfix, the first unit that was unreachable during a run, and the first customer held back on purpose. After a few months, every bug report starts with finding out what is actually installed.
What teams build to patch it
The pattern is consistent enough to be predictable. First a wrapper script that retries the unreachable hosts. Then a spreadsheet, because the inventory stopped being trustworthy. Then a cron job on the device that pulls instead of waiting to be pushed to, which is the point at which the team has started writing an agent. Then a health check after the update, then a way to undo it, then a way to know whether it worked across the fleet rather than on one unit.
Each step is individually sensible and takes a week. Collectively they are a deployment system, maintained by people whose actual job is the robot, and it never quite gets finished because there is always something more urgent.
This is not a hypothetical. It is what the founder built at Pooled Energy for thousands of connected controllers and single-board computers in customer backyards, on Ansible, because that is what existed. Every rollout became a manual, nervous, all-hands afternoon.
What to do instead
The structural fix is to invert two things.
Pull instead of push. An agent on the device that fetches when it has signal removes the reachability requirement entirely, and works fine on a customer network with no inbound path. It also means a unit that was offline during the rollout is not skipped, it is just later.
Let the device judge the update, not the operator. Stage to an inactive slot, switch atomically, boot on trial, and require a positive health result including connectivity before the change is made permanent. Failure becomes the default, so the dangerous releases undo themselves without anyone reaching the robot.
Above that, gate the fleet on confirmed units rather than elapsed time. You can build all of this on top of Ansible, and plenty of teams have. The question is whether you want to be the team maintaining it.
Early access
Running robots in the field?
We are taking on a handful of fleets this year, in agriculture, inspection, drones and logistics. Few enough that you get direct engineering time rather than a support queue.
Founding customers get direct engineering time and a permanent founding rate.