<p>ansible не может найти boto: boto требуется для этого модуля</p>

Созданный на 17 мар. 2016  ·  32Комментарии  ·  Источник: ansible/ansible

"msg": "boto required for this module" похоже, делает всю поддержку aws в ansible бесполезной, поскольку логика, похоже, нарушена во многих местах.

Это не работает в обоих случаях, даже если вы попытаетесь запустить через local_action или напрямую, и я проверил

- hosts:
  - localhost

  tasks:
    - pip:
        name: boto
    - name: Provision Krypton (kr)
      local_action: ec2
        key_name=kr
        instance_type=m4.4xlarge
        image=ami-c109e8aa
        wait=yes
        group=webserver
        count=3
        vpc_subnet_id="{{ aws_vpc }}"
        assign_public_ip=yes

Это происходит на машине с OS X, и я убедился, что у меня установлен бото.

Python 2.7.10 (default, Jul 13 2015, 12:05:58)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto

Как вы можете заметить из самого playbook, он также импортирует boto на целевой компьютер, и если вы вызовете модуль ec2 напрямую вместо использования local_action, вы все равно получите ту же ошибку.

which python
/usr/local/bin/python

Самый полезный комментарий

@stevenscg , я все еще работаю над этим в моем файле инвентаря:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Дайте мне знать, если это что-то для вас сделает!

Все 32 Комментарий

Информация о списке

Привет!

Большое спасибо за ваш интерес к Ansible. Это для нас очень много значит.

Похоже, это вопрос пользователя, и мы хотели бы направлять подобные вещи либо в список рассылки, либо на канал IRC.

Если вы можете зайти туда, мы будем признательны. Это позволяет нам отслеживать ошибки, извлекать запросы, RFE и тому подобное.

Еще раз спасибо, и мы с нетерпением ждем встречи с вами в списке IRC. Спасибо!

@bcoca закрытие ошибок с копированием и прошлым поможет в достижении целей сообщества. Это верный отчет об ошибке, а не «но».

Тот факт, что ansible предполагает, что python 2 установлен на /usr/bin/python является ошибкой, довольно критичной.

@ssbarnea -

https://www.zigg.com/2014/using-virtualenv-python-local-ansible.html имеет достойное решение, которое, похоже, работает как для действий напрямую с hosts: localhost и для вызова local_action

@ssbarnea @pauricthelodger Ребята, у вас все еще проблемы с этим?

У меня только что был сценарий, который работал месяцами (годами) и начинал давать сбой на local_action: ec2_elb при регистрации экземпляра в ELB и использовании инвентаря ec2.py .

У меня случается при запуске из MacOS с Ansible 2.0.0.2, 2.0.1 и 2.1.0.

Я еще не пробовал рекомендации статьи zigg.

TASK [AWS - Register instances with the load balancer] *************************
fatal: [10.x.x.x -> localhost]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"}
$ which python
/usr/local/bin/python

$ pip list boto | grep boto
boto (2.38.0)
boto3 (1.1.4)
botocore (1.2.10)

$ ansible --version
ansible 2.0.0.2

$ python -V
Python 2.7.9

@stevenscg , я все еще работаю над этим в моем файле инвентаря:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Дайте мне знать, если это что-то для вас сделает!

@pauricthelodger Я могу подтвердить, что у меня это сработало на доступных версиях 2.0.0.2, 2.0.1 и 2.1.0. Еще раз спасибо!

По какой причине это закрыто? Это все еще проблема в OS X (Sierra):

$ which python
/usr/local/bin/python

$ pip list boto | grep boto
boto (2.45.0)
botocore (1.5.1)

$ ansible --version
ansible 2.2.1.0

$ python -V
Python 2.7.12

Обход файла инвентаря обходится без этого, но все еще проблема.

@rolette Ansible по умолчанию использует /usr/bin/python (не то же самое, что /usr/local/bin/python ). Мой совет - используйте virtualenv ( virtualenv .venv )

и ваш инвентарь localhost: inventory/localhost :

#!/bin/bash
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/.."
echo "{
  \"localhost\": {
    \"ansible_connection\": \"local\",
    \"ansible_python_interpreter\": \"${ROOT_DIR}/.venv/bin/python\"
  }
}"

@ wojtek-oledzki Спасибо за еще один обходной путь, но я ищу исправление для ansible, чтобы оно правильно работало в OS X, вместо того, чтобы требовать от всех, кто сталкивается с проблемой, тратить время на поиск обходного пути.

это не обходной путь - это то, как работает python. Вам нужно просто указать Ansible, где находится ваш исполняемый файл python, если вы не хотите использовать местоположение по умолчанию /usr/bin/python .

негативный ghostrider ... Как ни странно, любая другая программа на Python умеет нормально работать, не требуя virtualenv.

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

Давайте будем правы, правильный способ вызова python - через #!/usr/bin/env python а не через жестко заданный путь. Есть одно исключение из этого правила: сценарии оболочки из virtualenvs, где предпочтительно иметь полный путь вместо использования env .

На MacOS с помощью системы по умолчанию Python окр происходит с решимостью /usr/bin/python , но это вовсе не означает , что мы должны видеть /usr/bin/python в установленном скрипте.

Одна вещь, которую я использовал со временем, - это избегать использования сценариев оболочки и вызывать ansible как модуль.

@ssbarnea Согласен, за исключением того, что #!/usr/bin/env python делает правильные вещи в virtualenvs, так что по-прежнему нет причин жестко кодировать путь.

Получил ту же ошибку при использовании модуля ec2_tag в анзибле.

TASK [Retrieve all tags on an instance] ****************************************
fatal: [10_12_26_12]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"}

playbook:

  - name: Get instance ec2 facts
    action: ec2_facts
    register: ec2_facts

  - name: Retrieve all tags on an instance
    ec2_tag:
      region: '{{ ansible_ec2_placement_region }}'
      resource: '{{ ansible_ec2_instance_id }}'
      state: list
    register: ec2_tags

Но работайте с local_action

  - name: Get instance ec2 facts
    action: ec2_facts
    register: ec2_facts

  - name: Get resource tags from ec2 facts
    #sudo: false
    local_action: ec2_tag resource={{ec2_facts.ansible_facts.ansible_ec2_instance_id}} region={{ec2_facts.ansible_facts.ansible_ec2_placement_region}} state=list
    register: ec2_tags

Та же ошибка с тегом ec2_elb :

  pre_tasks:
    - name: Gathering ec2 facts
      action: ec2_facts
    - name: Trackor Instance de-register
      become: no
      local_action:
        module: ec2_elb
        region: "{{ ansible_ec2_placement_region }}"
        instance_id: "{{ ansible_ec2_instance_id }}"
        state: absent
        wait_timeout: 30
        ec2_elbs: '{{ trackor_elb_name }}'

Не уверен, что он подключен, но, если он поможет людям в будущем, я только что заметил следующее в журнале изменений в версии под Ansible 2.3:

Добавлен 'ansible_playbook_python', который содержит 'текущий исполняемый файл python', он может быть пустым в некоторых случаях, когда Ansible не вызывается через стандартный интерфейс командной строки (ограничение sys.executable).

Если у вас Mac и вы установили другие копии python через homebrew, вы можете запустить эти команды, чтобы установить boto на системный python:

sudo /usr/bin/python -m easy_install pip
sudo /usr/bin/python -m pip install boto

Это решило проблему. Спасибо!!

Я использую Arch Linux, и по умолчанию кажется, что это python 3, в то время как Ansible по умолчанию использует python 2.
Итак, решение @rsanchez работает для меня, если я заменю python явным python2 .
Спасибо.

В дополнение к решению @rsanchez для сценария, когда на вашем Mac может быть несколько копий python, еще один способ - указать ansible, какой питон использовать, через переменную ansible_python_interpreter.

Предположим, что / usr / bin / python не имеет boto на своем пути, а python в / usr / local / bin / python (установленный через homebrew) имеет его ("import boto" работает, пока находится в repl). Затем вы можете установить " ansible_python_interpreter = / usr / local / bin / python " в файле инвентаризации.

Также вы устанавливаете его в командной строке с параметром « --extra-vars = 'ansible_python_interpreter = / usr / local / bin / python' ».

У меня была такая же проблема, но с netaddr .

Ansible использовал некоторую абсолютно случайную версию Python, установленную на моей машине:

ansible all -i ./.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory -m debug -a "var=ansible_playbook_python"
elastic0 | SUCCESS => {
    "ansible_playbook_python": "/usr/local/opt/python/bin/python2.7"
}

Затем я просто использовал трюк /usr/local/opt/python/bin/python2.7 -m pip install netaddr чтобы установить его.

Мне интересно, помогут ли переменные среды Python, такие как PYTHON_HOME и PYTHON_PATH, решить эту проблему, но я мало о них знаю.

Когда я наивно делал сборку докеров для ansible 2.3.1.0 с чем-то вроде

FROM python:2.17
RUN pip install --upgrade pip
RUN pip install boto3 botocore ansible>=2.3.1.0 awscli

Я получил ошибку

fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "boto3 and botocore are required for this module"}

А, интересно. Конечно, я могу настроить интерпретатор на какую-нибудь жестко запрограммированную вещь или найти другой обходной путь, но важно отметить, как уже было сказано ранее, что _нет других приложений на Python эта проблема_. Справедливо отметить, что способ, которым ansible маршалирует задачи на хосты (даже localhost без ssh), - это копирование исполняемого файла python, но, тем не менее, этот исполняемый файл должен уважать настройки среды.

Встав на секунду в мыльницу, незнание стандартной практики вызывает повторяющуюся проблему с анзиблем. У меня было так много проблем с использованием модулей AWS с токенами сеанса (для предположения роли или аутентификации mfa), что я склонен использовать awscli для всего возможного. Глупо то, что если бы они просто позволили boto обрабатывать разрешение учетных данных вместо того, чтобы вводить свое собственное 2/3 решение для их передачи, у них было бы лучшее из обоих миров. Конечно, локальные учетные данные не будут доступны с удаленных хостов, но 1) если у них не было собственных учетных данных, какой смысл в любом случае запускать задачу удаленно, так как она все равно попадет только в общедоступный api и что в большинстве случаев так же легко можно сделать на месте; и 2) если бы у них были свои учетные данные, вы, вероятно, захотели бы их забрать. Несвязанный, но еще один пример того, как разработчики анзибля действуют, игнорируя передовой опыт, которому они могли и должны были следовать. Мне легко сказать, я не пытаюсь реализовать ansible: P

В качестве временного исправления я сделал:

[local]
localhost              ansible_connection=local     ansible_python_interpreter=/usr/local/bin/python3

У меня есть pip, botocore и boto3, интегрированные в python3, а не в Mac OS по умолчанию /usr/bin/python . В качестве правильного исправления я мог бы попытаться установить ansible_python_interpreter в качестве переменной среды.

По какой-либо причине, почему это закрыто? По-прежнему возникает эта проблема на 2.5 devel.

Мое обходное решение с ядерным вариантом заключалось в том, чтобы взломать доступную установку в моих пакетах сайта, потому что я не хочу помнить, чтобы каждый раз передавать дополнительные вары. Вы можете вздрогнуть, не кричите на меня, действуйте на свой страх и риск, никаких гарантий, явных или подразумеваемых.

Чтобы найти файлы:

python -c "import ansible; print ansible.__path__"

Чтобы исправить все шебанги Python:

 grep -lir "/usr/bin/python" /path/to/my/site-packages/ansible/* | xargs sed -i '' "s|/usr/bin/python|/usr/bin/env python|g"

Я столкнулся с какой-то ошибкой, сделав это
фатальный: [localhost]: НЕ ВЫПОЛНЕНО! => {"изменено": false, "msg": "для этого модуля требуется boto"}
но бото уже установлено
поэтому я использовал эту команду (потому что использую Mac)
sudo / usr / bin / python -m pip install boto
и я добавил еще одну строчку в env / hosts
ansible_pyhton_interpreter = / usr / bin / python
так что его работа

кто-нибудь может предложить, в чем причина получения этой ошибки, я уже установил boto, тогда зачем мне эта команда
sudo / usr / bin / python -m pip install boto

@ jawad486 , я тоже использую Mac, и у меня есть практика запускать ansible исключительно с помощью docker. Он полностью избегает проблем с поиском модулей и позволяет надежно запускать любую версию ansible, новую или старую, одновременно. Я не могу сказать то же самое о любом другом методе с brew, virtualenv или встроенным Python. При необходимости я монтирую ~ / .aws и ~ / .ssh.

@ jawad846 Прочтите сообщения по этой проблеме. Это ошибка. ansible неправильно кодирует путь к python вместо того, чтобы получать его из среды.

В ansible 2.5.1 эта проблема все еще сохраняется (в Linux), и разные модули ведут себя по-разному. Я использовал обходной путь ansible_python_interpreter=python в файле hosts. Это приводит к тому, что ec2_vpc_net и ec2_vpc_subnet работают, но ec2_vpc_igw не работает с {"changed": false, "msg": "boto is required for this module"} . Что странно забавно, потому что все эти модули являются частью одного набора и используются вместе.

Вникнув в это, я обнаружил, что ec2_vpc_net и ec2_vpc_subnet используют boto3, но ec2_vpc_igw используют boto v2. Таким образом, вам нужно будет установить в виртуальном окружении ОБА boto3 и boto2. Затем я изменил все заголовки shebang с помощью модифицированной версии сценария sed

grep -lir "/usr/bin/python" vp/local/lib/python2.7/site-packages/ansible/* | xargs sed -i "s@/usr/bin/python@/usr/bin/env python@g"

Где vp - это локальный путь virtualenv, который я использую.

По-прежнему проблема с 2.5.2.

@ timm088 Я только что исправил эту проблему в своем MacBook.
запустить "какой питон". он должен предоставить вам путь, в моем случае это был «/ usr / local / bin / python».
Затем перейдите в свой файл инвентаря и вставьте этот путь в ansible_python_interpreter.
Вот как выглядит мой файл хостов инвентаря:
[местный]
localhost ansible_connection = локальный ansible_python_interpreter = / usr / local / bin / python /

Теперь он должен работать.

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

https://groups.google.com/forum/#!topic/ansible -project / WCqmyKB46qQ

Была ли эта страница полезной?
0 / 5 - 0 рейтинги