Delegating a playbook to run across multiple hosts

15 views
Skip to first unread message

tentacle_bonzoid

unread,
Feb 21, 2017, 11:13:41 AM2/21/17
to Ansible Project
I'm having a newbie issue related to orchestrating actions across hosts. I'm probably doing this completely the wrong way.

Essentially what I want to do is call a playbook from within a playbook, targeting specific hosts.

An example use case is I add an exported dir on an NFS server, then I want to log into the clients I've exported it to and mount the new share.
Or, I make some DB change and now need to connect to all the impacted application servers to tell them to reconnect to the DB.
Or, I'm patching servers in a load balanced server farm, so I want to first find the nodes and then iterate a patch/reboot cycle on each sequentially to avoid service downtime.

Basically, within my playbook I'm discovering the list of target hosts, and I figured I could just pass that list to an included playbook like so:

    - name: Call playbook to do something on a list of hosts in sequence
      include: something.yml
      delegate_to: "{{ item }}"
      with_items: "{{ my_target_hosts }}"

That seems to work, but something.yml will inherit all facts. For example "ansible_hostname" from within something.yml will reflect the original host, not the one where it's running.
Then I should call re-run setup, I suppose? But if I do that, it will, for reasons I don't understand, skip all tasks after setup re-ran.

Example something.yml when my_target_hosts are host1 and host2 - notice the last two tasks are skipped:
- debug:
    msg: "i am here"

- debug:
    msg: "my ansible_hostname is now {{ ansible_hostname }}"

- name: Call setup again
  setup:

- debug:
    msg: "ive run setup again and now my ansible_hostname is {{ ansible_hostname }}"

- debug:
    msg: "i am done"

Results in:

TASK [debug] *******************************************************************
ok: [host1 -> host1] => {
    "msg": "i am here"
}

TASK [debug] *******************************************************************
ok: [host1 -> host1] => {
    "msg": "my ansible_hostname is now host1"
}

TASK [Call setup again] ********************************************************
ok: [host1 -> host1]

TASK [debug] *******************************************************************
ok: [host1 -> host1] => {
    "msg": "ive run setup again and now my ansible_hostname is host1"
}

TASK [debug] *******************************************************************
ok: [host1 -> host1] => {
    "msg": "i am done"
}

TASK [debug] *******************************************************************
ok: [host1 -> host2] => {
    "msg": "i am here"
}

TASK [debug] *******************************************************************
ok: [host1 -> host2] => {
    "msg": "my ansible_hostname is now host1"
}

TASK [Call setup again] ********************************************************
ok: [host1 -> host2]

TASK [debug] *******************************************************************
skipping: [host1] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

TASK [debug] *******************************************************************
skipping: [host1] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}


Where's my brainfart?
Reply all
Reply to author
Forward
0 new messages