"way to dynamically pass roles".
A good solution here might NOT be to not use ansible-pull. In most cases most people don't need it if you are doing regular push based configuration.
If you do need it for something like autoscaling - let me recommend an alternative - ansible-tower provisioning callbacks can run a whole playbook using "--limit" to run against just the hosts that check in. As such, a playbook could target multiple groups and just the correct role<->group mappings would apply.
Ansible-pull is definitely going to continue to be a supported thing since it exists - but it's not really NEEDED in most cases - and it's not always the easiest way to get things done, and you lose all that centralized reporting you get from push mode, or even Tower in callback mode where the node can phone home and request configuration.
Now, one thing you could do is pass --extra-vars "role=foo"
and do
- hosts: all
roles:
- group_by: key=role_{{rolename}}
- hosts: role_foo
roles:
- foo
- hosts: role_bar
roles:
- bar
And that would do it, with putting the right "--extra-vars" flag on the crontab entry.