By default, most tasks are run on your managed nodes (the target systems) and some are run on the control node (that's your Ansible server).Refer to these articles for a better understanding of how tasks are run against the control node or managed nodes.
delegate_to can be used to run a module on a specific host. In this example, delegate_to is used with the file module to remove a file on locahost.
---
- hosts: all
tasks:
- name: remove foo.txt on control node
module: file
path: /tmp/foo.txt
state: absent
delegate_to: localhost
...
In this example, delegate_to is used to run the task on server1.example.com.
---
- hosts: all
tasks:
- name: remove foo.txt on control node
module: file
path: /tmp/foo.txt
state: absent
delegate_to: server1.example.com
...
Often, the run_once parameter is used so that the task is only ran one time on the control node.
---
- hosts: all
tasks:
- name: remove foo.txt on control node
module: file
path: /tmp/foo.txt
state: absent
delegate_to: localhost
run_once: true
...
Running this task should produce the following.
TASK [remove foo.txt on control node]
changed: [server1.example.com -> localhost]
Let's say you have two hosts in your default hosts file or your own inventory file.
all:
hosts:
server1.example.com:
server2.example.com:
And you want to pass a variable from server1 to server2. For example, let's say /tmp/example.txt on server1 contains "Hello World".
In this example, the shell module is used to read /tmp/example.txt on server1 and the register parameter is store Hello World in the out variable. The set_fact module is then used to create a variable named greeting and delegate_to and delegate_facts are used set the greeting variable as a fact on server2. The debug module is then used to see that the greeting variable has been set on server2.
---
- hosts: all
tasks:
- shell: cat /tmp/example.txt
register: out
when: inventory_hostname == 'server1.example.com'
- set_fact:
greeting: "{{ out.stdout }}"
delegate_to: server2.example.com
delegate_facts: true
- debug:
var: greeting
when: inventory_hostname == 'server2.example.com'
...
Running this playbook should produce the following.
TASK [shell]
changed: [server1.example.com]
skipping: [server2.example.com]
TASK [docker : set_fact]
ok: [server1.example.com -> server2.example.com]
skipping: [server2.example.com]
TASK [docker : debug]
skipping: [server1.example.com]
ok: [server2.example.com] => {
"greeting": "Hello World"
}
Did you find this article helpful?
If so, consider buying me a coffee over at