Ansible aws_s3模块在没有缺失Boto3的情况下失败
Ansible aws_s3模块在没有缺失Boto3的情况下失败
这个Play安装了python3
、pip3
、boto3
和botocore
,并尝试使用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吗?我看到一些类似的问题已经被问了将近一年,但是我没有看到解决方案 - 非常感谢任何帮助。
问题原因:
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
问题出现的原因是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一起工作,所以将所有任务限制在一个版本上对我来说不是好的解决办法,这就是为什么选择在任务级别指定版本的解决方法。
问题出现的原因是我的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上得到了相同的错误。