When more than one play in a playbook, how to define an order for running one before others

70 views
Skip to first unread message

fanvalt

unread,
Oct 19, 2016, 7:21:55 AM10/19/16
to Ansible Project
Hello,

in my inventory file, I will use aliases to deploy differents applications for the same user:

[reference]
refweb1 PARAM="['tomweb','7.30.05005.1334','1']"
refqry1 PARAM="['query','7.30.05005.1334','1']"
refweb2 PARAM="['restart','1']"

I need to deploy the query applicatio before yje tomweb application, so in my playbook I wrote 2 plays:
the one I want to play first will run the role this way:
   roles:
    - { role: tomweb, when:  module == 'tomweb' }
   vars:
    module: "{{ PARAM[0] }}"

the play I want to run after the 1st one is then defined later with this rôle:
   roles:
    - { role: query, when:  module == 'query' }
   vars:
    module: "{{ PARAM[0] }}"

The last play will be like:
   roles:
    - { role: restart, when:  module == 'restart' }
   vars:
    module: "{{ PARAM[0] }}"

This way to proceed do work but I have to duplicate all pre_tasks and variables, is there a way to say I want to run for sure the tomweb role first if the line with this module is present in the inventory file ?
And so have only one play in my playbook ?

regards

fanvalt

unread,
Oct 24, 2016, 6:26:33 AM10/24/16
to Ansible Project
Would the new directive strategy help if set in the first play?
  hosts: all
   strategy: free
   roles:
    - { role: tomweb, when:  module == 'tomweb' }
   vars:
    module: "{{ PARAM[0] }}"

would run this play and when done then run other plays, am I correct ?

J Hawkesworth

unread,
Oct 24, 2016, 9:06:35 AM10/24/16
to Ansible Project
You can use a when: conditional against your role (if you don't mind seeing lots of 'skipped' steps for each task in the role.


Jon

fanvalt

unread,
Oct 24, 2016, 9:15:43 AM10/24/16
to Ansible Project
Thank you but I already use a when condition on the role.
But it won't make the 1st play with the 1st role being run first

J Hawkesworth

unread,
Oct 24, 2016, 9:38:12 AM10/24/16
to Ansible Project

Not sure I really understand but you can maybe use pre_task before to set_fact.  And you can use multiple when: conditions if you need to.


Another way to solve this might be to use role dependencies:


That way you could make tomweb role 'depend' on 'query' role, so the query role would run first before tomweb (if that's what you want.

You might also want to consider using a handler to restart.

Also maybe think about using groups in your inventory

[ref-query]
host1

[ref-tomweb]
host1


then your playbook could have

hosts: ref-query
roles:
  query

hosts: ref-tomweb
roles:
  tomweb

hosts: all
roles:
   restart

(restart could be a handler as well, so perhaps not necessary to be a separate role).  Handlers are nice as they can be made to only do things (like restarts) if changes have occurred.


Or something like that.

I think it might be worth experimenting with how you organise your variables so that your playbooks run have to run roles against hosts - that way the playbooks don't become complicated with lots of conditionals etc.

Hope this helps,

Jon
Reply all
Reply to author
Forward
0 new messages