x-yuri
x-yuri

Reputation: 18973

Shared connection to server closed

When I run this:

$ ansible -i s1, s1 -m raw -a 'echo test' -u root -k

I get:

s1 | SUCCESS | rc=0 >>
test
Shared connection to s1 closed.

But this way:

$ ansible -i s1, s1 -m command -a 'echo test' -u root -k

I don't get "Shared connection to s1 closed." part:

s1 | SUCCESS | rc=0 >>
test

Why is that?

P.S. Above is a simplified way to reproduce the issue. What I'm facing is that when running playbook I get this extra line which is in the way.

UPD The line clearly coming from ssh. And if I run raw command with -vvvv, I get:

Using /etc/ansible/ansible.cfg as config file
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.7/site-packages/ansible/plugins/callback/__init__.pyc
<s1> ESTABLISH SSH CONNECTION FOR USER: root
<s1> SSH: EXEC sshpass -d13 ssh -vvv -C -o ControlMaster=auto
  -o ControlPersist=60s -o User=root -o ConnectTimeout=10
  -o ControlPath=/home/yuri/.ansible/cp/ansible-ssh-%h-%p-%r -tt s1
  'echo test'
s1 | SUCCESS | rc=0 >>
test
OpenSSH_7.4p1, OpenSSL 1.0.2k  26 Jan 2017
debug1: Reading configuration data /home/yuri/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: auto-mux: Trying existing master
debug1: Control socket "/home/yuri/.ansible/cp/ansible-ssh-s1-22-root" does not exist
<...a lot of output from ssh...>

But with command, it's just:

Using /etc/ansible/ansible.cfg as config file
Loading callback plugin minimal of type stdout, v2.0 from
  /usr/lib/python2.7/site-packages/ansible/plugins/callback/__init__.pyc
Using module file
  /usr/lib/python2.7/site-packages/ansible/modules/core/commands/command.py
<s1> ESTABLISH SSH CONNECTION FOR USER: root
<s1> SSH: EXEC sshpass -d13 ssh -vvv -C -o ControlMaster=auto
  -o ControlPersist=60s -o User=root -o ConnectTimeout=10
  -o ControlPath=/home/yuri/.ansible/cp/ansible-ssh-%h-%p-%r s1
  '/bin/sh -c '"'"'(
    umask 77
    && mkdir -p "` echo ~/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737 `"
    && echo ansible-tmp-1488989540.6-73006073289737="` echo ~/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737 `"
  ) && sleep 0'"'"''
<s1> PUT /tmp/tmpes82wL TO
  /root/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737/command.py
<s1> SSH: EXEC sshpass -d13 sftp -o BatchMode=no -b - -vvv -C
  -o ControlMaster=auto -o ControlPersist=60s -o User=root
  -o ConnectTimeout=10
  -o ControlPath=/home/yuri/.ansible/cp/ansible-ssh-%h-%p-%r '[s1]'
<s1> ESTABLISH SSH CONNECTION FOR USER: root
<s1> SSH: EXEC sshpass -d13 ssh -vvv -C -o ControlMaster=auto
  -o ControlPersist=60s -o User=root -o ConnectTimeout=10
  -o ControlPath=/home/yuri/.ansible/cp/ansible-ssh-%h-%p-%r s1
  '/bin/sh -c '"'"'
    chmod u+x /root/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737/ /root/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737/command.py
    && sleep 0'"'"''
<s1> ESTABLISH SSH CONNECTION FOR USER: root
<s1> SSH: EXEC sshpass -d13 ssh -vvv -C -o ControlMaster=auto
  -o ControlPersist=60s -o User=root -o ConnectTimeout=10
  -o ControlPath=/home/yuri/.ansible/cp/ansible-ssh-%h-%p-%r -tt s1
  '/bin/sh -c '"'"'
    /usr/bin/python /root/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737/command.py;
    rm -rf "/root/.ansible/tmp/ansible-tmp-1488989540.6-73006073289737/" > /dev/null 2>&1
    && sleep 0'"'"''
s1 | SUCCESS | rc=0 >>
test

Where is all ssh output gone?

Upvotes: 1

Views: 6019

Answers (1)

Konstantin Suvorov
Konstantin Suvorov

Reputation: 68329

Shared connection to s1 closed.

This message is an error message from ssh client.

With raw: echo test Ansible executes ssh <many parameters> s1 'echo test' and you get stdout/stderr from ssh command. This way message about shared connection pops up in your task result.

With command: echo test Ansible copy python-wrapper (command.py) and execute this wrapper, which in turn spawns echo test and capture stdout/stderr from echo commmand. Then command.py prints echo's result as JSON-object with stdout/stderr/rc keys. The ssh error message still occurs, but you don't see it (it is filtered by Ansible), because Ansible get task result from JSON-object key's and not from ssh plain stdout/stderr/rc.

Where is all ssh output gone?

This is related due to the same difference in handling raw/command. To see detailed ssh output set ANSIBLE_DEBUG=1 environment variable.

If you want to hide this error message, you can use ansible_ssh_extra_args='-o LogLevel=QUIET' inventory variable. But I'm not sure if this can give some other unexpected results.

Upvotes: 3

Related Questions