Ansible не работает с / bin / sh: 1: / usr / bin / python: не найден

Я сталкиваюсь с ошибкой, которую я никогда раньше не видел. Вот команда и ошибка:

$ 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

    Я наткнулся на эту ошибку, запущенную на сервере Ubuntu 15.10 , потому что она поставляется с Python 3.4.3, а ansible требует Python 2 .

    Вот как выглядит мое provision.yml :

     - hosts: my_app sudo: yes remote_user: root gather_facts: no pre_tasks: - name: 'install python2' raw: sudo apt-get -y install python tasks: - name: 'ensure user {{ project_name }} exists' user: name={{ project_name }} state=present 
    • Не забывайте, что опция -y (говорит «да» на все вопросы) с apt-get (или сырой модуль застрянет молча)

    • gather_facts: no строка не является критичной (потому что мы не можем собирать факты без python)

    Ansible 2.2 имеет технический обзор поддержки Python 3. Чтобы воспользоваться этим (поэтому вам не нужно устанавливать Python 2 на Ubuntu 16.04), просто установите ansible_python_interpreter конфигурации ansible_python_interpreter в /usr/bin/python3 . Это можно сделать на основе каждого узла в вашем файле инвентаря:

     [db] 123.123.123.123 ansible_python_interpreter=/usr/bin/python3 

    Решение 1:

    Если вы используете Ansible >2.2.0 , вы можете установить ansible_python_interpreter конфигурации ansible_python_interpreter в /usr/bin/python3 :

     ansible my_ubuntu_host -m ping -e 'ansible_python_interpreter=/usr/bin/python3' 

    или в вашем файле инвентаря:

     [ubuntu_hosts]  [ubuntu_hosts:vars] ansible_python_interpreter=/usr/bin/python3 

    Решение 2:

    Если вы используете Ansible <2.2.0 то вы можете добавить эти pre_tasks в свой playbook:

     gather_facts: False pre_tasks: - name: Install python for Ansible raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) register: output changed_when: output.stdout != "" tags: always - setup: # aka gather_facts 

    Вы можете использовать необработанный модуль для установки Python на удаленных хостах:

     - raw: sudo apt-get install python-simplejson 

    Чтобы обобщить ответы остальных, вот комбинированные настройки, которые работали на меня:

      - hosts: all become: true gather_facts: false # Ansible requires python2, which is not installed by default on Ubuntu Xenial pre_tasks: - raw: sudo apt-get -y install python-simplejson # action: setup will gather facts after python2 has been installed - action: setup 

    Для запуска Ansible вам потребуется python 2.7. На Ubuntu 16.04 вы можете установить его с помощью этой команды:

    sudo apt-get install python-minimal

    После этого я мог бежать

    ansible-playbook -i inventories/staging playbook.yml

    Запустить успешно

    Пожалуйста, уточните, как использовать функцию Ubuntu 16.04

    То, что я использовал, чтобы это работало на ubuntu 15.10 на новой капли Digital Ocean:

     # my-playbook.yml - name: python2 hosts: test gather_facts: no pre_tasks: - raw: sudo apt-get -y install python-simplejson $ ansible-playbook path/to/my-playbook.yml 

    Для Ubuntu 16.04 на новом OVH SSD мне пришлось apt-get обновить до того, как были доступны пакеты python2.

    Я узнал, что на самом деле возможно иметь несколько пьес в одной пьесе, поэтому моя установка теперь содержит игру «заработка по зависимостям», которая выполняется на всех хостах и ​​другие игры для определенных хостов. Так что больше нет pre_tasks .

    Например:

     - name: dependency provisioning hosts: all become: yes become_method: sudo gather_facts: false tasks: - name: install python2 raw: sudo apt-get -y install python-simplejson - name: production hosts: production_host roles: - nginx tasks: - name: update apt cache apt: update_cache=yes cache_valid_time=3600 # .... - name: staging hosts: staging_host roles: - nginx tasks: - name: update apt cache apt: update_cache=yes cache_valid_time=3600 # .... 

    Как говорили другие, это связано с отсутствием python2. Другие ответы здесь дают обходной путь с pre_tasks и gather_facts: no , однако, если вы находитесь на EC2, и вы user_data экземпляр с невозможным, вы можете использовать параметр user_data :

     - ec2: key_name: mykey instance_type: t2.micro image: ami-123456 wait: yes group: webserver count: 3 vpc_subnet_id: subnet-29e63245 assign_public_ip: yes user_data: | #!/bin/bash apt-get update apt-get install -y python-simplejson register: ec2 

    Тогда люди обычно ждут, когда ssh будет доступен следующим образом:

      - name: "Wait for the instances to boot and start ssh" wait_for: host: "{{item.public_ip}}" port: 22 delay: 5 timeout: 300 with_items: "{{ ec2.tagged_instances }}" when: ec2|changed 

    Однако я обнаружил, что это не всегда достаточно долго, так как CloudInit выполняется довольно поздно в процессе загрузки, поэтому python2 все еще не может быть установлен сразу после выхода ssh. Поэтому я добавил паузу, если экземпляр был только что создан:

      - name: "Wait for cloud init on first boot" pause: minutes=2 when: ec2|changed 

    Это сделает работу отлично и как преимущество, которое вы не проверяете на python2 при каждом запуске, и вам не нужно делать какие-либо обходные пути для сбора фактов позже.

    Я уверен, что другие облачные провайдеры предоставляют аналогичные функциональные возможности CloudInit, поэтому адаптируйте их для использования.

    В соответствии с этим Gist вы можете установить Python2 на Ubuntu 16.04 следующим образом:

     enter code here gather_facts: False pre_tasks: - raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) - setup: # aka gather_facts tasks: # etc. etc. 

    Много ответов. Спасибо за сообщение, так как я начал с этой страницы!

    Я немного поработал, и он был прочным с Ubuntu 14.04LTS, Ubuntu 15.04LTS, похоже, уронил последний python , и Ubuntu 16.04LTS, похоже, сбросил aptitude .

    Я выполнил следующие действия в своем загрузочном блоке, прежде чем делать какие-либо apt вызовы:

     - name: "FIX: Ubuntu 16.04 LTS doesn't come with certain modules, required by ansible" raw: apt-get install python-minimal aptitude -y become: true become_user: root become_method: sudo 

    Если вам удастся become другом месте, не стесняйтесь снимать его.

    Источники:

    Я смог решить ту же проблему, установив Python на целевую машину, то есть машину, на которую мы хотим SSH. Я использовал следующую команду:

     sudo apt-get install python-minimal 

    По умолчанию Ansible требует Python 2 , однако Ansible 2.2+ также может работать с Python 3 .

    Поэтому либо установите Python 2 с использованием raw модуля , например

     ansible localhost --sudo -m raw -a "yum install -y python2 python-simplejson" 

    или установите переменную ansible_python_interpreter в файле инвентаризации, например:

     [local] localhost ansible_python_interpreter="env python3" 

    Для Docker вы можете добавить следующую строку:

     RUN printf '[local]\r\nlocalhost ansible_python_interpreter="env python3"\r\n' > /etc/ansible/hosts 

    или запустите его как:

     ansible-playbook /ansible/provision.yml -e 'ansible_python_interpreter=/usr/bin/python3' -c local 

    У меня была такая же проблема, пока я не понял, что вам также нужно установить python на удаленный хост, а также на свой собственный локальный компьютер. теперь это работает!

    Мы просто сталкиваемся с этим.

    Мы разворачиваем ubuntu 16.04 на бродягу, поэтому, если вы не используете бродягу, мой комментарий бессмыслен.

    Мы установили следующие брандмауэр-плагины (триггер, shell-commander), и мы установили на этом компьютере python 2.7.6 (которые не были без плагинов thioose) и после того, как можно будет развернуть

    Это был наш последний тест, иначе мы собирались включить эту установку в команду оболочки в файле Vagrant

    Надеюсь, это может помочь кому-то

    Interesting Posts

    Аргументы или параметры?

    Как инициализировать страницы в jQuery mobile? Не показывать

    foldl хвост рекурсивный, так как же foldr работает быстрее, чем foldl?

    Windows 7 – Быстрые приложения / переключатели окон, например, набрав имя приложения?

    Нажмите программную кнопку «Уведомление»

    Есть ли способ настроить начальный экран Windows 8, чтобы вернуться к работающему настольному приложению, а не запускать новый, когда я нажимаю на плитку?

    Расширенный MySql-запрос: обновить таблицу с информацией из другой таблицы

    Что такое идиоматический эквивалент Go, эквивалентный тернарному оператору C?

    Есть ли практическая причина для Linux с двойной загрузкой вместе с Windows?

    MySQL хранимой процедуры против функции, которую я буду использовать, когда?

    Окно 10 Wi-Fi проблема отключена

    определить размер массива, если он передан функции

    Может ли USB-накопитель USB 3.0 использоваться на порту USB 2.0?

    Textpad – открытие новых файлов в одном экземпляре по умолчанию

    Как обновить _id одного документа MongoDB?

    Давайте будем гением компьютера.