"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
Привет!
Большое спасибо за ваш интерес к 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
Самый полезный комментарий
@stevenscg , я все еще работаю над этим в моем файле инвентаря:
Дайте мне знать, если это что-то для вас сделает!