Ansible aws_s3模块在没有缺失Boto3的情况下失败

9 浏览
0 Comments

Ansible aws_s3模块在没有缺失Boto3的情况下失败

这个Play安装了python3pip3boto3botocore,并尝试使用aws_s3模块下载一个文件:

TASK [使用yum模块运行yum update -y]

**********************************************************************

ok: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [安装python3和pip3] *************************************************************************************************

changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [使用pip3模块安装boto3和botocore] ******************************************************************************

changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [使用文件模块创建目录(如果不存在)] ****************************************************************

changed: [ip-10-200-2-137.us-west-2.compute.internal]

TASK [使用aws_s3模块从s3下载文件] **********************************************************************************

fatal: [ip-10-200-2-137.us-west-2.compute.internal]: 失败! =>

{"changed": false, "msg": "Python模块\"botocore\"或\"boto3\"缺失,请同时安装两者"}

它失败了,因为它说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: 使用pip3模块安装boto3和botocore

pip:

name:

- boto3

- botocore

executable: pip-3.7

这是失败的任务:

- name: 使用aws_s3模块从s3下载文件

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

这是一个bug吗?我看到一些类似的问题已经被问了将近一年,但是我没有看到解决方案 - 非常感谢任何帮助。

0
0 Comments

问题原因:

Ansible引用的Python模块位置错误,指向了/usr/lib/python2.7/路径下的模块。需要查看该路径下是否安装了boto3和botocore包。

解决方法:

1. 运行ansible version命令,查看ansible所指向的Python版本。

ansible --version

输出结果中的ansible python module location一项显示了Ansible所使用的Python模块位置。

2. 检查该路径(例如/usr/lib/python2.7/)下是否安装了boto3和botocore包。

如果缺少这两个包,可以通过以下命令安装:

pip install boto3 botocore

0
0 Comments

问题出现的原因是Ansible在默认情况下使用`/usr/bin/python`作为Python解释器,而你只安装了Python 3的AWS库。解决方法有三种:一是使用pip将AWS库安装到Python 2中;二是同时安装Python 3和Python 2的AWS库;三是在清单文件中定义`ansible_python_interpreter=/usr/bin/python3`,然后将Ansible的执行限制在Python 3上。

感谢提问者指出亚马逊Linux上预安装了Python 2。如果将Ansible的执行限制在Python 3上,所有Ansible模块是否仍然可用?还是因为某些模块需要Python 2而导致失败?

我将这个设置添加到了我的cfg文件中,但结果完全相同。我的cfg文件内容已添加到原始帖子中。

你确定pip-3.7是你系统的默认版本吗?

我不确定如何判断,但是我使用的awslinux2镜像预安装了Python 2,所以我猜想Python 2是默认版本。

这个设置不是在ansible.cfg文件中,而是在清单文件(hosts)中。此外,为什么你的回答被接受为正确答案,当ozlevka之前已经给出了答案?

谢谢Gordo,所以`ansible_python_interpreter=/usr/bin/python3`应该放在清单文件中而不是cfg文件中。这对我很有帮助。我忽略了ozlevka的帖子中的这一点,但在我的情况下,我实际上需要两个Python版本与Ansible一起工作,所以将所有任务限制在一个版本上对我来说不是好的解决办法,这就是为什么选择在任务级别指定版本的解决方法。

0
0 Comments

问题出现的原因是我的playbook有两个任务,而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

对我来说,这种方法不起作用,我在Amazon Linux 2上得到了相同的错误。

0