I've tried defining base_acl in a host_vars file (should have higher precedence according to link above?) for the host in question, however the play still prints "playbook" for the variable value when run.
From the link you have referenced in your question:
...
8 - inventory file or script host vars
9 - inventory host_vars/*
10 - playbook host_vars/*
11 - host facts / cached set_facts
12 - play vars
...
22 - extra vars (for example, -e "user=my_user")(always win precedence)
So, since the highest number wins and that all host related entries (8 through 11) have a lower number than 12, your statement is actually wrong. The only correct assesment is that an extra var would always override everything.
There are actually many ways to achieve what you are looking for. But in your situation this is what I would do.
- remove the play var entry in your playbook
- put the default value in
group_vars/all.yml
(either at inventory or playbook level):
base_acl: "playbook"
- override the default value for every relevant host in
host_vars/<your_host>.yml
(either at inventory or playbook level):
base_acl: "override value"
Note that the above will work as well to override the default value for a specific group in group_vars/<your_group>.yml
(either at inventory or playbook level).