# Rolling Updates, Speed and Controllers — Ansible: Automate Servers with Playbooks

Source: https://www.geekswithgeeks.com/en/ansible/prod-rolling-scale

> Update hosts in batches, tune performance and run Ansible from a controller.

## Do not update everything at once

For production, update in small batches so a bad change affects only a few hosts. **`serial: 2`** (or a percentage) runs the play on two hosts at a time, and **`max_fail_percentage`** stops the rollout if too many fail. Combine with health checks between batches (`ansible.builtin.uri` to hit a status URL) and, for load-balanced services, take hosts out of rotation before updating them. For speed, raise `forks`, enable SSH **pipelining** and ControlPersist, and skip fact gathering when unneeded. For teams, **AWX** (open source) or **Red Hat Ansible Automation Platform** provide a web UI, scheduling, credentials, RBAC and audit logs.

## A rolling update play

Illustrative. If more than 25% of a batch fails, the rollout stops before reaching the remaining hosts.

```yaml
- name: Rolling update of web tier
  hosts: web
  serial: 2
  max_fail_percentage: 25
  become: true
  tasks:
    - name: Deploy new release
      ansible.builtin.include_role:
        name: app_deploy
    - name: Wait for health check
      ansible.builtin.uri:
        url: "http://{{ inventory_hostname }}:{{ http_port }}/health"
        status_code: 200
      register: health
      until: health.status == 200
      retries: 10
      delay: 3
```

## Start with one canary host

Run the change on one host (`--limit web1`) first, check it, then widen. A canary catches problems while the blast radius is a single machine.

**Quiz:** What does `serial: 2` do?

- [ ] Limits the play to two seconds
- [ ] Runs only two tasks
- [x] Runs the play on two hosts at a time
- [ ] Creates two inventories

*Answer:* Runs the play on two hosts at a time. serial controls batch size for rolling updates across hosts.
