2

I'm attempting to use ansible synchronize to copy files between two remotes.

My playbook looks like:

- hosts: newserver
  tasks:
    - name: Copy images from old to new
      synchronize:
        src: /var/www/production/
        dest: /var/www/production/
      delegate_to: oldserver

Where newserver and oldserver are defined in my inventory file. If I replace oldserver with the full hostname the delegate_to works. Otherwise it complains about unreachable. oldserver works fine in other places in other playbooks.

Doesn't delegate_to use the inventory?

The error I get is:

TASK [Copy images from old to new] *************************************************
fatal: [thr.cs.unc.edu]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ", "unreachable": true}

newserver is reachable from oldserver. As I said above, if I change oldserver to gbserver3.cs.unc.edu in the delegate_to it works.

My hosts file looks like this:

[newserver]
thr.cs.unc.edu
[oldserver]
gbserver3.cs.unc.edu
GaryBishop
  • 123
  • 1
  • 5

2 Answers2

6

delegate_to expects an inventory host name.

From your inventory, oldserver is a group name that can potentially hold several host names.

A quick and dirty fix if you are sure that your group will always contain a single host is to use the first one in the list inside the group. So in this case you could delegate_to: "{{ groups['oldserver'][0] }}"

Zeitounator
  • 1,199
  • 5
  • 12
5

The problem is that newserver and oldserver aren't the names of the hosts but names of the groups. It's not possible delegate_to a group. See Inventory basics: formats, hosts, and groups

[newserver]
thr.cs.unc.edu
[oldserver]
gbserver3.cs.unc.edu

Fix the inventory. For example

newserver ansible_host=thr.cs.unc.edu
oldserver ansible_host=gbserver3.cs.unc.edu
Vladimir Botka
  • 5,138
  • 8
  • 20