Вопрос:

Общий доступ к серверу закрыт

ssh ansible

3406 просмотра

1 ответ

6001 Репутация автора

Когда я запускаю это:

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

Я получил:

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

Но так:

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

Я не получаю "Общий доступ к s1 закрыт." часть:

s1 | SUCCESS | rc=0 >>
test

Это почему?

PS Выше приведен упрощенный способ воспроизвести проблему. С чем я сталкиваюсь, так это то, что при запуске playbook я получаю дополнительную строку, которая мешает.

UPD Линия явно идет от ssh. И если я запускаю rawкоманду с -vvvv, я получаю:

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

Но с command, это просто:

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

Куда sshпропала вся продукция?

Автор: x-yuri Источник Размещён: 08.03.2017 04:02

Ответы (1)


3 плюса

42666 Репутация автора

Решение

Раздельное подключение к s1 закрыто.

Это сообщение является сообщением об ошибке от клиента ssh.

С raw: echo testAnsible выполняется, ssh <many parameters> s1 'echo test'и вы получаете stdout / stderr из команды ssh . Таким образом, в результате выполнения задачи появляется сообщение об общем подключении.

С command: echo testанзибль копией питоном-оберткой ( command.py) и выполнить эту оболочку, которая , в свою очередь , плодится echo testи захват стандартного вывод / STDERR от эха вводе команды . Затем command.pyвыводит echoрезультат в виде JSON-объекта с ключами stdout/ stderr/ rc. Сообщение об ошибке ssh по-прежнему появляется, но вы его не видите (оно фильтруется Ansible), потому что Ansible получает результат задачи из ключа JSON-объекта, а не из ssh plain stdout / stderr / rc.

Куда пропал весь вывод ssh?

Это связано с той же разницей в обработке raw / command. Чтобы увидеть подробный вывод ssh, установите ANSIBLE_DEBUG=1переменную среды.

Если вы хотите скрыть это сообщение об ошибке, вы можете использовать ansible_ssh_extra_args='-o LogLevel=QUIET'переменную инвентаря. Но я не уверен, что это может дать другие неожиданные результаты.

Автор: Konstantin Suvorov Размещён: 08.03.2017 04:47
Вопросы из категории :
32x32