HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Ansible execute task on different hosts in order

Submitted by: @import:stackexchange-devops··
0
Viewed 0 times
orderhostsdifferentansibletaskexecute

Problem

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

  • run a program on HostA



  • run a command on HostB which requires HostA program to run



  • run a program on HostC if 2. step succeed



  • run a command on HostD which requires HostC program to run



  • 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

Solution

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"
}

Context

StackExchange DevOps Q#10679, answer score: 8

Revisions (0)

No revisions yet.