Назад | Перейти на главную страницу

Невозможно запустить Ansible playbook на хосте EC2

Я пытаюсь запустить простой сценарий 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 так что практически любой путь сокета управления будет чертовски длинным.

Есть два других способа решить эту проблему:

  1. Для длинных имен хостов:
    • Вместо использования обычных флагов %r, %h, и %p ты можешь использовать %C который является хешем из трех.
    • например: dfd609b4ea05eab3927aa71b91115b29317d017d
    • Примечание: Эта опция, по-видимому, является недавним дополнением к ssh, поэтому, если она не работает, вам действительно следует посмотреть на обновление ssh и / или вашей ОС.
  2. Для длинных предыдущих путей:

    • Я очень предпочитаю, чтобы мои розетки жили в ~/.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