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

686 views
Skip to first unread message

edroz...@gmail.com

unread,
May 14, 2014, 8:34:37 PM5/14/14
to ansible...@googlegroups.com
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,^[^/]*/,,'

2) 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

Michael DeHaan

unread,
May 14, 2014, 9:30:23 PM5/14/14
to ansible...@googlegroups.com
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.


--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/16a321a8-2984-4a75-8429-118e4232292a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

edroz...@gmail.com

unread,
May 14, 2014, 9:44:10 PM5/14/14
to ansible...@googlegroups.com
Hello Michael,

This is using 1.7 git.

The output is as follows:

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

GATHERING FACTS *************************************************************** 
<work1> ESTABLISH CONNECTION FOR USER: root
<work1> REMOTE_MODULE setup
<work1> 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] ************************************* 
<work1> ESTABLISH CONNECTION FOR USER: root
<work1> REMOTE_MODULE file path=/srv/software owner='root' group='root' mode=0755 state='directory'
<work1> 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,^[^/]*/,,' 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

Michael DeHaan

unread,
May 15, 2014, 7:27:14 AM5/15/14
to ansible...@googlegroups.com
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


edroz...@gmail.com

unread,
May 15, 2014, 7:24:21 PM5/15/14
to ansible...@googlegroups.com
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
Reply all
Reply to author
Forward
0 new messages