Is it possible to use ansible to manage order of programs? Im trying to find an automated solution which will do the following steps:

  1. run a program on HostA
  2. run a command on HostB which requires HostA program to run
  3. run a program on HostC if 2. step succeed
  4. run a command on HostD which requires HostC program to run
  5. run a command on HostE which requires HostC program to run

For example:

  - hosts: neededhosts
      - startprogram
      - runcommand
      - startsecprgoram

- name: start hostA program
    - name: start program
      hosts: HostA
      shell: /etc/init.d/HostAprogram.sh start
- name: run command on HostB
    - name: run command
      hosts: HostB
      shell: command which using host A

1 Answer 1


Q: "Is it possible to use Ansible to manage the order of programs?"

A: Yes. It's possible. For example, the playbook below does the job

- hosts: HostA
    - include_role:
        name: startprogram

- hosts: HostB
    - include_role:
        name: runcommand
      when: hostvars.HostA.HostAprogram_started|default(false)

- hosts: HostC
    - include_role:
        name: startsecprogram
      when: hostvars.HostB.HostBcommand_passed|default(false)

- hosts: HostD,HostE
    - debug:
        msg: command on {{ inventory_hostname }} which requires HostC program to run
      when: hostvars.HostC.HostCprogram_started|default(false)

Example of the roles for the purpose of testing

shell> cat roles/startprogram/tasks/main.yml
- debug:
    msg: /etc/init.d/HostAprogram.sh start
- set_fact:
    HostAprogram_started: true

shell> cat roles/runcommand/tasks/main.yml
- debug:
    msg: command which using host A
- set_fact:
    HostBcommand_passed: true

shell> cat roles/startsecprogram/tasks/main.yml
- debug:
    msg: /etc/init.d/HostCprogram.sh start
- set_fact:
    HostCprogram_started: true

Example of the output

ok: [HostA] => {
    "msg": "/etc/init.d/HostAprogram.sh start"
ok: [HostB] => {
    "msg": "command which using host A"
ok: [HostC] => {
    "msg": "/etc/init.d/HostCprogram.sh start"
ok: [HostD] => {
    "msg": "command on HostD which requires HostC program to run"
ok: [HostE] => {
    "msg": "command on HostE which requires HostC program to run"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.