Я сталкиваюсь с ошибкой, которую никогда не видел прежде. Вот команда и ошибка:
$ ansible-playbook create_api.yml
PLAY [straw] ******************************************************************
GATHERING FACTS ***************************************************************
failed: [104.55.47.224] => {"failed": true, "parsed": false}
/bin/sh: 1: /usr/bin/python: not found
TASK: [typical | install required system packages] *****************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/john/create_api.retry
104.55.47.224 : ok=0 changed=0 unreachable=0 failed=1
Вот файл create_api.yml:
---
- hosts: api
remote_user: root
roles:
- api
И вот файл hosts:
[api]
104.55.47.224
Я могу удалить раздел ролей, и он не попадет в первую ЗАДАЧУ, вместо этого он сделает это только в строке /bin/sh: 1: /usr/bin/python: not found
. Что здесь может происходить?
ПРИМЕЧАНИЕ. Если кто-либо пингует IP-адрес и не получает ответ, вы должны знать, что я изменил IP-адрес с момента вставки кода.
EDIT Python был установлен локально, проблема была в том, что он не был установлен на удаленной машине, на которой работал Ubuntu 15.04
источник
action: setup
в качестве окончательного pre_task также отлично работало :)raw
pre_tasks
tasks
pre_tasks
setup
Ansible 2.2 имеет технический предварительный просмотр поддержки Python 3. Чтобы воспользоваться этим (чтобы вам не нужно было устанавливать Python 2 в Ubuntu 16.04), просто установите
ansible_python_interpreter
опцию config в/usr/bin/python3
. Это можно сделать для каждого хоста в файле инвентаризации:источник
Решение 1:
Если вы используете
Ansible >2.2.0
, вы можете установитьansible_python_interpreter
опцию конфигурации на/usr/bin/python3
:или в вашем инвентарном файле:
Решение 2:
Если вы используете,
Ansible <2.2.0
то вы можете добавить ихpre_tasks
в свой playbook:ОБНОВЛЕНИЕ С
ansible 2.8.x
, вам не нужно беспокоиться об этом, это работает из коробки для Python> 3,5 для контроллера и целевой машины (ей)источник
ansible 2.3.0.0
и это не работает из коробки. Та же ошибка, что и ОП.Вы можете использовать модуль raw для установки Python на удаленных хостах:
источник
pre_tasks: - raw: sudo apt-get install python-simplejson
python-simplejson
написан на Python и поэтому требует Python. simplejson также является требованием для большинства основных модулей Ansible. Устанавливаяpython-simplejson
черезapt-get
/,yum
вы также устанавливаете Python и, следовательно, покрываете все основные зависимости Ansible ...Чтобы суммировать ответы всех остальных, вот объединенные настройки, которые работали для меня:
источник
Я лично нашел 3 возможных решения этой проблемы, которые хорошо работают в разных ситуациях:
Вариант 1 - установить
ansible_python_interpreter: /usr/bin/python3
для хостов, которыеpython3
установлены по умолчаниюЯ думаю, что это лучший метод для решения проблемы, если у вас есть способ сгруппировать ваши хосты, независимо от того,
python3
установлены они по умолчанию или нет . Насколько я знаю,python3
доступно на всех выпусках Ubuntu 16.04 и выше.python3
, вы можете добавить переменную в вашgroup_vars/all.yml
(или эквивалентный):python3
и у вас есть возможность пометить их при использовании динамического инвентаризации (например, тегирование AWS дляec2.py
), вы можете применить переменную к определенным хостам, например так:python3
, вы можете сделать что-то вроде этого:Мне больше нравится этот вариант, потому что он не требует никаких изменений на удаленном хосте и только незначительные изменения переменных, в отличие от вариантов 2 и 3, которые требуют дополнений к каждой пьесе.
Вариант 2 - установить Python 2 с помощью
raw
Эта опция требует размещения пьесы в верхней части каждой книги с тем,
gather_facts: false
что используетсяraw
для установкиpython
:ignore_errors: true
требуется, если вы планируете запускать игру на хостах, которые неapt-get
установлены (например, на основе RHEL), иначе они выдадут ошибку в первой игре.Это решение работает, но является самым низким в моем списке по нескольким причинам:
apt
находится в системе и игнорирует ошибки (в отличие от варианта 3)apt-get
Команды медленные (в отличие от варианта 3)Вариант 3 -
/usr/bin/python -> /usr/bin/python3
использование символической ссылкиraw
Я не видел такого решения, предложенного кем-либо еще. Это не идеал, но я думаю, что он превосходит вариант 2 во многих отношениях. Я предлагаю использовать
raw
команду оболочки для символической ссылки,/usr/bin/python -> /usr/bin/python3
если онаpython3
находится в системе, аpython
ее нет:Это решение аналогично варианту 2 в том смысле, что нам нужно ставить его в начале каждой книги, но я думаю, что оно превосходит несколько способов:
python3
присутствует, аpython
его нет - он не переопределит Python 2, если он уже установленapt
установленapt-get
Очевидно, что если вам нужен установленный Python 2
/usr/bin/python
, это решение не требуется, и вариант 2 лучше.Вывод
python3
, что делает вариант 1 намного более сложным и подверженным ошибкам./usr/bin/python
.источники
/usr/bin/python: not found
ошибку в Ansibleraw
Модуль на Ansible Docsисточник
Вам нужен Python 2.7 для запуска Ansible. В Ubuntu 16.04 вы можете установить его с помощью этой команды:
sudo apt-get install python-minimal
После этого я мог бежать
ansible-playbook -i inventories/staging playbook.yml
Пожалуйста, проверьте больше на Использование ansible в Ubuntu 16.04
источник
Что я использовал, чтобы заставить это работать на Ubuntu 15.10 на свежей капле Digital Digital:
Для Ubuntu 16.04 на новом SSD OVH мне пришлось обновить apt-get до того, как пакеты python2 стали доступны.
источник
Я обнаружил, что на самом деле можно иметь несколько воспроизведений в одной книге воспроизведения, поэтому в моей настройке теперь есть воспроизведение «обеспечения зависимости», которое выполняется на всех хостах, и другие игры для конкретных хостов. Так больше не надо
pre_tasks
.Например:
источник
Как говорили другие, это связано с отсутствием python2. Другие ответы здесь предоставляют обходной путь
pre_tasks
иgather_facts: no
, однако, если вы работаете в EC2 и запускаете экземпляр с ansible, вы можете использоватьuser_data
параметр:Тогда люди обычно ждут, когда ssh будет доступен следующим образом:
Однако я обнаружил, что это не всегда достаточно долго, так как CloudInit выполняется довольно поздно в процессе загрузки, поэтому python2 может быть не установлен сразу после того, как ssh станет доступен. Поэтому я добавил паузу на случай, если экземпляр был только что создан:
Это отлично сработает, и в качестве преимущества вы не проверяете python2 при каждом запуске, и вам не нужно обходиться, чтобы собрать факты позже.
Я уверен, что другие облачные провайдеры предоставляют аналогичную функциональность CloudInit, поэтому адаптируйтесь к своему варианту использования.
источник
Поэтому использование Packer может оказаться полезным для решения ниже.
давайте предположим, что вы используете ansible Provider упаковщика, ваш конфиг может выглядеть следующим образом
вы можете сначала установить python, используя утилиту инициализации оболочки, а затем настроить параметр ansible_python_intepreter, как показано ниже
источник
По умолчанию Ansible требует Python 2 , однако Ansible 2.2+ может работать с Python 3 .
Так что либо установите Python 2 с помощью
raw
модуля , напримерили установите
ansible_python_interpreter
переменную в файле инвентаря, например:Для Docker вы можете добавить следующую строку:
или запустите его как:
источник
В соответствии с этим Gist вы можете установить Python2 на Ubuntu 16.04 следующим образом:
источник
Много ответов .. Спасибо за сообщение, как я начал с этой страницы тоже!
Я немного покопался, и с Ubuntu 14.04LTS все шло хорошо, Ubuntu 15.04LTS, похоже, потерял последнюю
python
версию, а Ubuntu 16.04LTS, похоже, упалaptitude
.Я помещаю следующее действие в мой загрузчик перед выполнением любых
apt
вызовов:Если вам удастся в
become
другом месте, не стесняйтесь раздеть это.Источники:
источник
Я смог решить ту же проблему, установив Python на целевой машине, то есть на машине, к которой мы хотим использовать SSH. Я использовал следующую команду:
источник
@ Мирослав, спасибо, что указал мне правильное направление. Я использовал
user_data
вec2_instance
модуле тоже, и он работает как удовольствие.Т.е.
источник
Вы можете указать Ubuntu 18.04, что вы хотите использовать python3 в качестве первого приоритета для
/usr/bin/python
.источник
У меня была такая же проблема, пока я не понял, что вам также нужно установить python на удаленном хосте, а также на вашем собственном локальном компьютере. теперь это работает!
источник
Мы просто сталкиваемся с этим.
Мы развертываем Ubuntu 16.04 на vagrant, поэтому, если вы не используете vagrant, мой комментарий не имеет смысла.
Мы установили следующие бродячие плагины (trigger, shell-commander), и мы установили на машину python 2.7.6 (который был не без этих плагинов) и после того, как ansible смог развернуться
Это был наш последний тест, иначе мы собирались включить эту установку в команду оболочки в файле Vagrant
Надеюсь, что это может помочь кому-то
источник
gather_facts: no
строку, которая требует Python. Другая возможность заключается в том, что вам также нужен python на хост-машине, но я думаю, это вызвало бы ваши ошибки еще раньше.