3

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
    roles:
      - startprogram
      - runcommand
      - startsecprgoram
    .
    .
    .

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

1 Answer 1

7

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
  tasks:
    - include_role:
        name: startprogram

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

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

- hosts: HostD,HostE
  tasks:
    - 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 that you have read and understand our privacy policy and code of conduct.

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