knockd не работает для ansible playbook через ssh

Когда я использую knock от клиента к серверу, ansible playbook не работает и не работает во время аутентификации SSH, даже если я использую ключи SSH

Когда я запускаю ту же книгу вручную, она работает, но когда я пытаюсь использовать knockd, клиент может подключиться к серверу, на котором запущен knockd, но ssh не может пройти аутентификацию. У меня есть пароль для аутентификации с открытым ключом ssh, поэтому я не уверен, почему возникает эта проблема

ubuntu@ip-192-168-5-238:~$ sudo knockd -vD
sudo: unable to resolve host ip-192-168-5-238
config: new section: 'options'
config: usesyslog
config: new section: 'ansible'
config: ansible: sequence: 9000:tcp,9999:tcp
config: ansible: seq_timeout: 5
config: ansible: start_command: ansible-playbook -i hosts default.yml -vvv
ethernet interface detected
Local IP: 192.168.5.238
listening on eth0...
2016-00-27 20:54:59: tcp: 192.168.5.150:33260 -> 192.168.5.238:9000 74 bytes
192.168.5.150: ansible: Stage 1
2016-00-27 20:54:59: tcp: 192.168.5.150:53055 -> 192.168.5.238:9999 74 bytes
192.168.5.150: ansible: Stage 2
192.168.5.150: ansible: OPEN SESAME
ansible: running command: ansible-playbook -i hosts default.yml -vvv
No config file found; using defaults
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
1 plays in default.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
<192.168.5.150> ESTABLISH SSH CONNECTION FOR USER: ubuntu
<192.168.5.150> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/home/ubuntu/.ansible/cp/ansible-ssh-%h-%p-%r -tt 192.168.5.150 '( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1453928100.08-29024361375363 )" && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1453928100.08-29024361375363 )" )'
fatal: [192.168.5.150]: UNREACHABLE! => {"changed": false, "msg": "ERROR! SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", "unreachable": true}

PLAY RECAP *********************************************************************
192.168.5.150              : ok=0    changed=0    unreachable=1    failed=0

ansible: command returned non-zero status code (3)

Вот плейбук, когда он запускается вручную

ubuntu@ip-192-168-5-238:~$ ansible-playbook -i hosts default.yml
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.5.150]

TASK [ensure apache is at the latest version] **********************************
ok: [192.168.5.150]

TASK [drop an arbitrary file just so we know something happened] ***************
changed: [192.168.5.150]

PLAY RECAP *********************************************************************
192.168.5.150              : ok=3    changed=1    unreachable=0    failed=0

person uberrebu    schedule 28.01.2016    source источник


Ответы (1)


Knockd работает под root (вы запустили его с помощью sudo), а когда вы запускаете ansible-playbook вручную, вы делаете это под пользователем ubuntu. Чтобы исправить это, вы можете использовать sudo, то есть:

sudo -H -u ansible /bin/bash -c "ansible-playbook -i hosts default.yml"

Его можно улучшить:

  1. Не используйте статический файл инвентаризации, используйте динамический, например:

- add_host: name={{ IP }} groups=knockers ansible_user=ubuntu ansible_become=yes ansible_ssh_private_key_file=key_file changed_when: False failed_when: IP is not defined or not (IP | ipaddr) tags: - always

  1. При запуске ansible-playbook с knockd передайте IP-адрес в playbook: sudo -H -u ansible /bin/bash -c "ansible-playbook -i hosts default.yml -e IP=%IP%"

Этот дизайн позволяет реализовать архитектуру ведущий-ведомый с использованием Ansible (или другими словами).

person Alexander Svyrydov    schedule 10.01.2017