此 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 使用 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
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
。
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 即可。
当 ansible 说
无法导入所需的Python库(botocore或boto3),请阅读模块文档并将其安装在适当的位置。
模块可能已安装。通过
python -m pip list installed
命令确认。然后通过输入 python
直接在终端中打开相关 python,并尝试通过 import boto3
导入 boto3 或 botocore。如果它抛出任何错误,请尝试解决该错误。
这个答案可能有用。
https://github.com/aws/aws-cli/issues/3092#issuecomment-550281243
卸载 python3-botocore 然后使用 pip3 安装似乎可行。
我遇到此错误是因为在我的 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 }}"