Я пытаюсь запустить простой сценарий Ansible для уже подготовленного хоста EC2. Когда я запускаю ansible-playbook, я получаю следующую ошибку:
SSH Error: data could not be sent to the remote host. Make sure this host can be reached over ssh
Используя предоставленный Amazon файл .pem, я могу вручную ввести ssh в поле, просто выполнив
ssh ubuntu @ my_instance_ip
.
Это полная команда, которую я выполняю:
ansible-playbook --inventory-file=inventory/production --extra-vars=ansible_ssh_user=ubuntu my-playbook.yml -vvvv
Это мой инвентарный файл (замаскированный IP / DNS):
[test]
ec2-1-1-1-1.us-west-1.compute.amazonaws.com ansible_ssh_private_key_file=~/path_to_pem_file.pem
Интересно то, что если я запустил команду ssh, которую подробно выплевывает ansible-playbook:
ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60m -o ControlPath="/Users/me/.ansible/cp/ansible-ssh-%h-%p-%r" -o IdentityFile="/path_to_my_pem_file.pem" -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 ec2-1-1-1-1.us-west-1.compute.amazonaws.com
Получаю следующее:
debug3: muxserver_listen: temporary control path /Users/me/.ansible/cp/ansible-ssh-ec2-1-1-1-1.us-west-1.compute.amazonaws.com-22-ubuntu.8MjEBnDdRIAO8zAT
unix_listener: "/Users/me/.ansible/cp/ansible-ssh-ec2-1-1-1-1.us-west-1.compute.amazonaws.com-22-ubuntu.8MjEBnDdRIAO8zAT" too long for Unix domain socket
Эта ошибка действительна? Если да, можно ли сделать команду короче? Спасибо!
Как уже отмечалось в комментариях и в связанный вопрос SO соответствующее сообщение об ошибке здесь: too long for Unix domain socket
. Эту ошибку можно решить, настроив control_path
параметр в ansible.cfg
Путь для использования сокетов ControlPath. По умолчанию это "% (каталог) s / ansible-ssh - %% h - %% p - %% r", однако в некоторых системах с очень длинными именами хостов или очень длинными именами путей (вызванными длинными именами пользователей или глубоко вложенным домашним каталогов) это может превышать ограничение на количество символов для имен файловых сокетов (108 символов для большинства платформ). В этом случае вы можете сократить строку ниже.
Пример: control_path =% (каталог) s / %% h - %% r
У меня двойная проблема, поскольку машины присоединены к домену, а $HOME
путь очень длинный, как и мое имя пользователя, например: /home/local.companyname.com/Smitty.Werbenjagermanjensen
так что практически любой путь сокета управления будет чертовски длинным.
Есть два других способа решить эту проблему:
%r
, %h
, и %p
ты можешь использовать %C
который является хешем из трех.dfd609b4ea05eab3927aa71b91115b29317d017d
Для длинных предыдущих путей:
Я очень предпочитаю, чтобы мои розетки жили в ~/.ssh/sockets
чтобы никто другой не мог их трогать.
mkdir -p ~/.ssh/sockets && \
chmod 0700 ~/.ssh/sockets && \
sudo ln -s ~/.ssh/sockets /var/local/sw-ssh && \
sudo chown -h $myuser:$mydomain /var/local/sw-ssh
Установите свой Ansible control_path
к /var/local/sw-ssh/%%C
С обоими из них мои пути к сокетам идут от: /home/local.companyname.com/Smitty.Werbenjagermanjensen/.ssh/sockets/Smitty.Werbenjagermanjensen@foobar.dev.application.companyname.com-22
Кому: /var/local/sw-ssh/dfd609b4ea05eab3927aa71b91115b29317d017d
Примечание: Это все совершенно допустимая конфигурация клиента ssh, и ее можно добавить в ваш ~/.ssh/config
вместо этого вы можете пользоваться преимуществами ssh sockety 24/7, а не только пока вы запускаете Ansible play.
Host *
ControlMaster auto
ControlPath /var/local/sw-ssh/%C
ControlPersist 600