How to run a command/task on another host and use output on current target hosts

Hello,

I’m working through implementing the following scenario:

  • A central software repo host stores various software packages

  • Use Ansible to install the latest version of a particular package on
    various target hosts by downloading the latest package version from
    the repo host to the target hosts and installing it.

In order to do this the playbook needs to do the following:

  1. Get the latest package name/version from the software repo host
    using a command like:

find . -name "{{ pkgname }}-[0-9]" -print | sort | tail -1 | sed 's,[1]/,’

  1. Using the results of the above command (for ex. apache-2.4.1-x86_64-1.txz),
    do a wget on the target hosts and then install this package.

I have not been able to figure out how to get this result data from another host to
use in the playbooks being applied to the target hosts. I looked at the “delegate_to”
option - if that is indeed the correct approach, I was not able to get it to work due
to an error I’m getting when using “delegate_to: myhost:portnum” (note - portnum for
the delegate host is different from the portnum for the current target host).

fatal: [myhost] => SSH Error: data could not be sent to the remote host.
Make sure this host can be reached over ssh FATAL: all hosts have already failed – aborting

Thanks,
–Ed


  1. ^/ ↩︎

Can you please share the output of an ansible-playbook run with “-vvvv” when you hit this scenario.

Output from the last task will be sufficient.

Please also include the version of ansible you are using.

Hello Michael,

This is using 1.7 git.

The output is as follows:

PLAY [work] *******************************************************************

GATHERING FACTS ***************************************************************
ESTABLISH CONNECTION FOR USER: root
REMOTE_MODULE setup
EXEC [‘ssh’, ‘-C’, ‘-vvv’, ‘-o’, ‘ControlMaster=auto’, ‘-o’, ‘ControlPersist=60s’, ‘-o’, ‘ControlPath=/Users/eduardr/.ansible/cp/ansible-ssh-%h-%p-%r’, ‘-o’, ‘KbdInteractiveAuthentication=no’, ‘-o’, ‘PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey’, ‘-o’, ‘PasswordAuthentication=no’, ‘-o’, ‘User=root’, ‘-o’, ‘ConnectTimeout=10’, ‘work1’, u"/bin/sh -c ‘LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 /usr/bin/python’"]
ok: [work1]

TASK: [basic | software directory create] *************************************
ESTABLISH CONNECTION FOR USER: root
REMOTE_MODULE file path=/srv/software owner=‘root’ group=‘root’ mode=0755 state=‘directory’
EXEC [‘ssh’, ‘-C’, ‘-vvv’, ‘-o’, ‘ControlMaster=auto’, ‘-o’, ‘ControlPersist=60s’, ‘-o’, ‘ControlPath=/Users/eduardr/.ansible/cp/ansible-ssh-%h-%p-%r’, ‘-o’, ‘KbdInteractiveAuthentication=no’, ‘-o’, ‘PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey’, ‘-o’, ‘PasswordAuthentication=no’, ‘-o’, ‘User=root’, ‘-o’, ‘ConnectTimeout=10’, ‘work1’, u"/bin/sh -c ‘LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 /usr/bin/python’"]
ok: [work1] => {“changed”: false, “gid”: 0, “group”: “root”, “item”: “”, “mode”: “0755”, “owner”: “root”, “path”: “/srv/software”, “size”: 4096, “state”: “directory”, “uid”: 0}

TASK: [basic | package find name of latest version] ***************************
repo1:12022 ESTABLISH CONNECTION FOR USER: root
repo1:12022 REMOTE_MODULE command find . -name “ansible-[0-9]" -print | sort | tail -1 | sed 's,[1]/,’ chdir=/srv/software/slackware/14.1 #USE_SHELL
repo1:12022 EXEC [‘ssh’, ‘-C’, ‘-vvv’, ‘-o’, ‘ControlMaster=auto’, ‘-o’, ‘ControlPersist=60s’, ‘-o’, ‘ControlPath=/Users/eduardr/.ansible/cp/ansible-ssh-%h-%p-%r’, ‘-o’, ‘KbdInteractiveAuthentication=no’, ‘-o’, ‘PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey’, ‘-o’, ‘PasswordAuthentication=no’, ‘-o’, ‘User=root’, ‘-o’, ‘ConnectTimeout=10’, ‘-6’, ‘repo1:12022’, u”/bin/sh -c ‘LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 /usr/bin/python’"]
fatal: [work1] => SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh

FATAL: all hosts have already failed – aborting

PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/eduardr/site.yaml.retry

work1 : ok=2 changed=0 unreachable=1 failed=0

Thanks,
–Ed


  1. ^/ ↩︎

Ah.

““delegate_to: myhost:portnum””

Delegate_to takes a hostname but is not meant to take “hostname:port” syntax. Rather, define the ansible host record in inventory and configure the portnumber.

–Michael

Hello Michael,

Thanks! That worked great. Thought I’d tried that previously but I might have had hostname.domain in the inventory and only hostname in delegate_to so it didn’t match perfectly.

Glad to have found the delegate_to functionality - absolutely necessary in certain cases. One of those things you know you need when you need it :). Had I read about it previously in the manual it would have been hard to imagine what it could be used for.

Regards,
–Ed