set custom ssh port when using delegate_to

Hi Community,

I need to delegate one task in my play to another remote linux ssh host with delegate_to. So far so good. But now the problem: my remote host has a custom ssh port. When running the play I always get “Failed to connect to the host via ssh: ssh: connect to host x.x.x.x port 22: Connection timed out”. How can I specify at task level a custom ssh port for delegate_to?

I already tried: “delegate_to: IP:PORT” and setting “ansible_port: PORT” at task level, but without success.

May someone has an idea how to handle this problem?

Regards,
Raphael

Hi Raphael,

Is the host you are trying to delegate the task to part of your inventory?

My next try would be to add this host in the inventory and specify the custom port for this particular host as a host variable. An example can be found here:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#assigning-a-variable-to-one-machine-host-variables

I hope that helps!

Regards, Juerg

Hi Juerg,

Yes, the host is part of my Inventory.
I tried it and set delegate_to to the inventory hostname, which woks fine.

But I’ve multiple inventories, and all hosts of each inventory needs this delegated_to task. How can I handle it for all other inventories, because I can’t add this host to all inventories?
Have you an idea?

Regards,
Raphael

Hi Raphael,

Oh I see. One solution might be to use the add_host module, which allows you to add hosts to your inventory on the fly (it won’t be persisted). Just add a task which adds your target host for the delegation along with the ansible_port variable before your delegate_to task.

The documentation can be found here:
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/add_host_module.html

Hope this helps!
– Juerg

Hi Juerg

thank you very much, it is working fine with add_host :slight_smile:

Is that worth a feature request, to use remote_port (similar naming to remote_user) together with delegate_to?

Best Regards,
Raphael

Hi Raphael,

Happy to hear you got it working! I just played around a bit more, and apparently, there is a way even without adding your host to the inventory. Here an example, which I ran on Ansible 2.9.17:

  • name: Remote Port Test
    hosts: localhost
    tasks:
  • name: delegate command
    command: whoami
    delegate_to: rhel8
    vars:
    ansible_ssh_port: 2222

That said, I still think it is in general a good idea to add all the hosts which the playbook interacts with to the inventory and configure all the connection parameters there. You may wanna use delegate_to in combination with connection plugins other than SSH (e.g. WinRM), which require different configuration parameters.

Happy weekend and best regards,
Juerg

Hi!

Hi Vladimir,

I’m not sure what you are getting at… The above example seems to work for me without setting delegate_facts to True. We are not changing any facts or variables related to the rhel8 host in this example, the variable matters in the context of the task.

– Juerg

It works for me too. I wasn't sure which variables of the two hosts,
involved in `delegate_to`, will be used. Thank you for the
clarification.

Hi Juerg,

I tried your example too. It also works in version 2.10.6.

I think for my use case it is the best way to add the remote host during the play with add_host.

Thank you!
Happy weekend and best regards,
Raphael