"msg": "boto required for this module"
似乎使 ansible 中的所有 aws 支持都变得无用,因为逻辑似乎在太多地方被破坏了。
这在两种情况下都被破坏了,即使您尝试通过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 机器上发生的,我确认我已经安装了 boto。
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 - 自从我将 localhost 显式添加到主机文件以将其包含在限制模式中以来,我一直在解决这个令人讨厌的问题以及与 ec2 相关的所有问题。
https://www.zigg.com/2014/using-virtualenv-python-local-ansible.html有一个不错的解决方案,它似乎适用于直接使用hosts: localhost
或调用local_action
@ssbarnea @pauricthelodger你们还有这个问题吗?
我刚刚有一个已经工作数月(数年)的剧本,在向 ELB 注册实例并使用ec2.py
清单时开始在local_action: ec2_elb
上失败。
在 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我可以确认这在 ansible 版本 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
)
和您的本地主机库存: 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 的工作方式。 如果您不想使用默认位置/usr/bin/python
您必须简单地告诉 Ansible 您的 python 可执行文件在哪里。
负 ghostrider ......奇怪的是,所有其他 python 程序都设法在不需要 virtualenv 的情况下正常工作。
可执行文件的硬编码路径在许多环境中都会中断。 不过,通常它不是像这个特定错误那样的整个平台。
让我们说得对,调用 python 的正确方法是通过#!/usr/bin/env python
而不是通过硬编码路径。 此规则有一个例外,来自 virtualenvs 的 shell 脚本更喜欢使用完整路径而不是使用env
。
在使用默认系统 Python 的 MacOS 上,env恰好解析为/usr/bin/python
但这并不意味着我们应该在安装的脚本中看到/usr/bin/python
。
随着时间的推移,我使用的一件事是避免使用 shell 脚本并将 ansible 作为模块调用。
@ssbarnea同意,除了#!/usr/bin/env python
在 virtualenvs 中做正确的事情,所以仍然没有理由硬编码路径。
在 ansible 中使用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"}
剧本:
- 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 下的开发更新日志中注意到以下内容:
添加了包含“当前 python 可执行文件”的“ansible_playbook_python”,在某些情况下,它可以是空白的,其中 Ansible 不是通过标准 CLI 调用的(sys.executable 限制)。
如果你使用的是 Mac 并且你已经通过 homebrew 安装了 python 的其他副本,你可以运行这些命令将 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的解决方案对我python2
替换python
python2
。
谢谢。
除了@rsanchez对Mac 上可能有多个python 副本的情况的解决方案之外,另一种方法是通过“ansible_python_interpreter”变量告诉ansible 使用哪个python。
假设/usr/bin/python的路径中没有 boto 并且/usr/local/bin/python (通过自制软件安装)的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_HOME 和 PYTHON_PATH 之类的 python 环境变量是否会帮助解决这个问题,但我对它们不太了解。
当我天真地为 ansible 2.3.1.0 做了一个 docker build 时
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 将任务编组到主机(甚至没有 ssh 的 localhost )的方式是复制 python 可执行文件 - 但是,该可执行文件应该尊重环境设置。
稍等片刻,对标准实践的无知是 ansible 反复出现的问题。 我在使用带有会话令牌(用于角色假设或 mfa auth)的 AWS 模块时遇到了很多挑战,我倾向于使用awscli
来处理所有可能的情况。 愚蠢的事情是,如果他们只是让 boto 处理凭据的解析,而不是注入自己的 2/3 解决方案来传递它们,那么他们就会两全其美。 当然,本地凭据将无法从远程主机获得,但是 1) 如果他们没有自己的凭据,那么无论如何远程运行任务有什么意义,因为无论如何它只会访问公共 api 并且在大多数情况下,可以很容易地在本地完成; 和 2) 如果他们确实有自己的凭据,您可能想要拿起它们。 不相关,但另一个例子是 ansible 实施者在不知道他们可以并且应该遵循的最佳实践的情况下继续前进。 对我来说很容易说,我不是要实现 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 开发上仍然有这个问题。
我的核选项解决方法是在我的站点包中破解 ansible 安装,因为我不想记住每次都传递额外的变量。 您可能会畏缩,不要对我大喊大叫,自担风险,没有明示或暗示的保证。
要查找文件:
python -c "import ansible; print ansible.__path__"
要修复所有 python shebangs:
grep -lir "/usr/bin/python" /path/to/my/site-packages/ansible/* | xargs sed -i '' "s|/usr/bin/python|/usr/bin/env python|g"
我这样做时遇到了一些错误
致命:[本地主机]:失败! => {"changed": false, "msg": "boto 这个模块需要"}
但 boto 已经安装
所以我使用了这个命令(因为我使用的是 mac)
须藤/usr/bin/python -m pip install boto
我在 env/hosts 中又添加了一行
ansible_pyhton_interpreter=/usr/bin/python
所以它的工作
任何人都可以建议出现这些错误的原因是什么,我已经安装了 boto 那么为什么我需要这个命令
须藤/usr/bin/python -m pip install boto
@ jawad486 ,我也使用 Mac,并且已经docker运行 ansible。 它完全避免了查找模块的问题,并且可以同时可靠地运行任何版本的 ansible,无论是新的还是旧的。 对于 brew、virtualenv 或内置 Python 的任何其他方法,我不能说同样的话。 我根据需要安装在 ~/.aws 和 ~/.ssh 中。
@jawad846通读有关此问题的帖子。 这是一个错误。 ansible 错误地硬编码了 python 的路径,而不是从环境中获取它。
在 ansible 2.5.1 这个问题仍然存在(在 linux 上),并且不同的模块表现不同。 我已经将@pauricthelodger解决方法与主机文件中的ansible_python_interpreter=python
设置一起使用。 这会导致 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 都安装到您的 virtualenv 中。 然后我用@benauthor sed 脚本的修改版本修改了所有shebang 标题。 我在我的 Makefile 中将它设置为在构建 virtualpython 后运行,因此:
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 中。
这是我的库存主机文件的外观:
[当地的]
本地主机 ansible_connection=本地 ansible_python_interpreter=/usr/local/bin/python/
它现在应该可以工作了。
我假设 Ansible 开发人员没有看到任何正在进行的讨论,因为它在打开 4 天后自动关闭。 我终于有时间在邮件列表上发布一个问题,看看我们是否可以通过这种方式解决问题。
https://groups.google.com/forum/#!topic/ansible -project/WCqmyKB46qQ
最有用的评论
@stevenscg ,仍然在我的库存文件中使用这个:
如果这对您有帮助,请告诉我!