Running ansible playbook in serial over hostgroups

Im trying to run a playbook for n host groups serially (but 100% parallel within the host group). How do I achieve this?

I've tried things like:

  - name: Test
    hosts: group1:group2
    serial: 100%

and even

  - name: Test
    hosts: group1:group2
    serial: 1

Thinking it would do group by group, however these do not work.

How do I get it to run over all of group1, then after, all of group2 (but fail if anything in group1 fails)?
Also, how do I get it to run over n groups? (There are many hostgroups, which might be tough to define in the hosts key)


You can't control a playbook from another playbook. You'll have to control the playbook from outside, for example by a script. Given the inventory

shell> cat hosts-497
[group1]
srv1

[group2]
srv2
srv3

[group3]
srv4
srv5
srv6

and the playbook

shell> cat test-497.yml
- name: Test
  hosts: all
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ '%H:%M:%S'|strftime }}: {{ inventory_hostname }}"

the debug task is executed in parallel by all hosts

shell> ansible-playbook -i hosts-497 test-497.yml 

PLAY [Test] ***************************************************************

TASK [debug] **************************************************************
ok: [srv3] => 
  msg: '20:51:30: srv3'
ok: [srv1] => 
  msg: '20:51:30: srv1'
ok: [srv4] => 
  msg: '20:51:30: srv4'
ok: [srv2] => 
  msg: '20:51:30: srv2'
ok: [srv5] => 
  msg: '20:51:30: srv5'
ok: [srv6] => 
  msg: '20:51:30: srv6'

If you want to control the hosts create a script and iterate the groups, e.g.

shell> cat test-497.sh
#!/usr/bin/sh

for i in group1 group2 group3; do
    ansible-playbook -i hosts-497 --limit $i test-497.yml
done

gives (abridged)

shell> ./test-497.sh 

PLAY [Test] *************************************************************

TASK [debug] ************************************************************
ok: [srv1] => 
  msg: '20:56:41: srv1'

PLAY [Test] *************************************************************

TASK [debug] ************************************************************
ok: [srv3] => 
  msg: '20:56:45: srv3'
ok: [srv2] => 
  msg: '20:56:45: srv2'

PLAY [Test] *************************************************************

TASK [debug] ************************************************************
ok: [srv5] => 
  msg: '20:56:52: srv5'
ok: [srv6] => 
  msg: '20:56:52: srv6'
ok: [srv4] => 
  msg: '20:56:53: srv4'