2017-03-08 6 views
0

Als ich dies auszuführen:Geteilt Verbindung zum Server geschlossen

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

erhalte ich:

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

Aber auf diese Weise:

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

ich nicht bekommen „Gemeinsam genutzte Verbindung zu s1 geschlossen. " Teil:

s1 | SUCCESS | rc=0 >> 
test 

Warum ist das?

P.S. Oben ist eine vereinfachte Möglichkeit, das Problem zu reproduzieren. Was mir gegenübersteht, ist, dass ich beim Abspielen von Playbook diese zusätzliche Zeile bekomme, die im Weg ist.

UPD Die Linie klar aus ssh. Und wenn ich raw Befehl mit -vvvv laufen, erhalte ich:

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...> 

Aber mit command, es ist nur:

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 

Wo ist alles ssh Ausgang gegangen?

+0

Versuchen Sie [Serverfehler] (http: // serverfault.com /) –

Antwort

1

Gemeinsame Verbindung zu s1 geschlossen.

Diese Nachricht ist eine Fehlermeldung vom ssh-Client.

Mit raw: echo test ansible führt ssh <many parameters> s1 'echo test' und Sie stdout/stderr aus ssh Befehl bekommen. Auf diese Weise erscheint eine Nachricht über die gemeinsame Verbindung in Ihrem Aufgabenergebnis.

Mit command: echo test ansible Kopie Python-Wrapper (command.py) und führen diese Umhüllung, die wiederum laicht echo test und erfassen stdout/stderr aus echo commmand. Dann command.py druckt echo das Ergebnis als JSON-Objekt mit stdout/stderr/rc Schlüssel. Die ssh-Fehlermeldung tritt immer noch auf, aber Sie sehen sie nicht (sie wird von Ansible gefiltert), weil Ansible das Task-Ergebnis von JSON-Objektschlüsseln und nicht von ssh plain stdout/stderr/rc erhält.

Wohin ist der ssh-Ausgang gegangen?

Dies hängt mit dem gleichen Unterschied in der Handhabung von Raw/Command zusammen. Um detaillierte SSH-Ausgabe anzuzeigen, setzen Sie ANSIBLE_DEBUG=1 Umgebungsvariable. Wenn Sie diese Fehlermeldung ausblenden möchten, können Sie ansible_ssh_extra_args='-o LogLevel=QUIET' Lagerbestandsvariable verwenden. Aber ich bin mir nicht sicher, ob dies zu anderen unerwarteten Ergebnissen führen kann.

+0

Mit 'ansible_ssh_extra_args = '- o LogLevel = QUIET'' könnte ich einige wichtige Nachrichten von' ssh' vermissen, oder? In Bezug auf "weil das Ergebnis der Aufgabe von Python-Wrapper in SSH-Sitzung erfasst wird", bin ich mehr als sicher, dass das Ergebnis nicht von '~/.ansible/tmp /.../ command.py' auf dem entfernten Host erfasst wird (wenn das gemeint ist, aber von dem Teil, der lokal auf dem Kontrollknoten läuft. Korrigiere mich, wenn ich falsch liege. –

+0

'Ich könnte einige wichtige Nachrichten verpassen, ja, es gibt eine Möglichkeit. 'command.py' erfasst die Ausgabe von 'echo' und sendet sie an den Kontrollknoten in Form eines JSON-Objekts mit' stdout'/'stderr' /' rc'-Schlüsseln, so dass Ansible auf dieses Objekt angewiesen ist anstelle von roher ssh-Ausgabe. Überprüfen Sie das Protokoll mit 'ANSIBLE_DEBUG = 1', es gibt ein klares Bild von dem, was vor sich geht. –

+0

Meine Vermutung bestätigt. Mit 'rohe' Modulen führt' ansible' einfach [einen Befehl] aus (https://github.com/ansible/ansible/blob/v2.1.5.0-0.2.rc2/lib/ansible/plugins/action/raw. py # L41) über ssh, als stdout was an stdout gesendet wurde, und ähnlich mit stderr ... –

Verwandte Themen