Ansible aws_s3 模块失败,提示 Boto3 丢失,而实际上却没有

问题描述 投票:0回答:6

此 Play 安装

python3
pip3
boto3
botocore
,并尝试使用 aws_s3 模块下载文件:

TASK [run yum update -y using yum module] 
**********************************************************************
ok: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [Install python3 and pip3] *************************************************************************************************
changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [Install boto3 and botocore with pip3 module] ******************************************************************************
changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [Create a directory if it does not exist using file module] ****************************************************************
changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [downlod file from s3 with aws_s3 module] **********************************************************************************
fatal: [ip-10-200-2-137.us-west-2.compute.internal]: FAILED! => 
{"changed": false, "msg": "Python modules \"botocore\" or \"boto3\" 
are missing, please install both"}

它失败了,因为它说

boto3
丢失了,但实际上不是:

从目标主机您可以看到

boto3
已安装:

[ec2-user@ip-10-200-2-137 ~]$ pip3 freeze
boto3==1.9.120
botocore==1.12.120
docutils==0.14
jmespath==0.9.4
python-dateutil==2.8.0
s3transfer==0.2.0
six==1.12.0
urllib3==1.24.1
[ec2-user@ip-10-200-2-137 ~]

这是安装的任务

boto3
:

- name: Install boto3 and botocore with pip3 module
    pip:
      name: 
      - boto3
      - botocore
      executable: pip-3.7

这是失败的任务:

- name: downlod file from s3 with aws_s3 module 
    aws_s3:
      bucket: mybucket
      object: mybucket/jre-8u201-linux-x64.tar.gz
      dest: /home/ec2-user/updater/jre-8u201-linux-x64.tar.gz
      mode: get   

目标主机确实安装了两个版本的Python:

[ec2-user@ip-10-200-2-157 ~]$ which python
/usr/bin/python
[ec2-user@ip-10-200-2-157 ~]$ which python3
/usr/bin/python3

我的配置文件如下所示:

[defaults]
private_key_file=/home/ec2-user/manual-builds/key.pem
ansible_python_interpreter=/usr/bin/python3

这是一个错误吗?我看到近一年前有人问过一些类似的问题,但我没有看到解决方案 - 非常感谢您的帮助。

ansible boto3
6个回答
4
投票

问题是我的剧本有两个任务,Ansible 使用 python2 解释器来完成第一个任务和第二个任务。第二个任务需要 python3 解释器才能工作,所以我必须在任务级别指定它:

- name: downlod file from s3 with aws_s3 module
  vars:
      ansible_python_interpreter: /usr/bin/python3    
  aws_s3:
      bucket: launch-data
      object: jre-8u201-linux-x64.tar.gz
      dest: /home/ec2-user/updater/jre-8u201-linux-x64.tar.gz
      mode: get 

4
投票

Ansible 使用

/usr/bin/python
作为默认的 Python 解释器。并且您仅安装适用于 python3 的 AWS 库:

- name: Install boto3 and botocore with pip3 module
    pip:
      name: 
      - boto3
      - botocore
      executable: pip-3.7

您可以使用 pip 将 AWS 库安装到 python2,或者同时安装(python3 和 python2),或者您可以在清单文件中定义:

ansible_python_interpreter=/usr/bin/python3
,然后将 ansible 执行限制为仅
python3


1
投票

Ansible 可能没有引用错误的 python 版本。只需运行 ansible version 命令即可查看 ansible 指向的位置。

ansible --version
ansible 2.9.9
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.17 (default, Apr 15 2020, 17:20:14) [GCC 7.5.0]

如您所见,Ansibe 指向位于

/usr/lib/python2.7/
ansible python 模块位置)的 Python 模块,您可以查看此 python 版本是否有 boto3 并且 botocore 软件包安装在
/usr/lib/python2.7/dist-packages/
路径中。

如果缺少,只需安装 boto3 和 botocore 即可。


0
投票

当 ansible 说

无法导入所需的Python库(botocore或boto3),请阅读模块文档并将其安装在适当的位置。

模块可能已安装。通过

python -m pip list installed
命令确认。然后通过输入
python
直接在终端中打开相关 python,并尝试通过
import boto3
导入 boto3 或 botocore。如果它抛出任何错误,请尝试解决该错误。

这个答案可能有用。


0
投票

https://github.com/aws/aws-cli/issues/3092#issuecomment-550281243

卸载 python3-botocore 然后使用 pip3 安装似乎可行。


0
投票

我遇到此错误是因为在我的 EC2 系统上,碰巧安装了两个版本的 Python。

/usr/bin/python3
/usr/local/bin/python3
。只有后者才在
pip
下安装了
/usr/local/bin/pip3
。因此,默认情况下,Ansible 尝试使用 Python 解释器
/usr/bin/python3
,但这个 Python 没有任何
pip
,也没有
boto3
或其他所需的库。然而,pip 的 Ansible 模块似乎解析为
/usr/local/bin/pip3
,尽管这与 Python 解释器不匹配。所以当我添加这样的任务时

  - name: Ensure botocore and boto3 modules are installed
    pip: 
      name: [ "boto3", "botocore"]
      extra_args: "--user"

Ansible 返回“OK”,因为它使用的

pip
确实检测到 boto3 和 botocore。 Ansible 不知道这些包安装在“错误”的 Python 下,而它实际上与
/usr/bin/python3
处的 Python 不匹配,它试图将其用于 S3 对象操作等操作。

我想我已经通过将其包含在我的剧本中来解决这个问题

- name: Run AWS Tasks
  hosts: "{{ myhosts | default('all') }}" # read from cli a single host or list of hosts
  gather_facts: yes
  vars:
    ansible_python_interpreter: /usr/local/bin/python3 

这迫使 Ansible 在

/usr/local/bin/python3
使用 Python 解释器,而不是在
/usr/bin/python3
错误地自动检测到的解释器。

请注意,我认为尝试在

/usr/bin/python3
安装 Python 库有点不稳定,而且可能很危险,因为我相信这是“系统 Python”。我想这就是我最终在
/usr/local/bin/python3
获得一个单独的 Python 的原因。

另请注意,使用 playbook 任务进行调试很有帮助,该任务可以打印出一些内部 Ansible 变量,以帮助揭示正在使用哪个 Python 可执行文件,例如

  - name: Check Python version
    debug:
      msg:
        - "Python interpreter: {{ ansible_facts.python.executable }}"
© www.soinside.com 2019 - 2024. All rights reserved.