我在分配了 Iam 角色的 EC2 实例上运行 Ansible。我正在运行此剧本:
$ cat s3.yaml
---
- hosts: localhost
remote_user: ec2-user
tasks:
- name: download ec2.py from s3
s3:
bucket: mybucket
object: /ec2.py
dest: /tmp/ec2.py
mode: get
使用 -vvv 运行它会提供以下错误消息:
fatal: [localhost]: FAILED! => {
"changed": false,
"failed": true,
"invocation": {
"module_args": {
"aws_access_key": null,
"aws_secret_key": null,
"bucket": "mybucket",
"dest": "/tmp/ec2.py",
"ec2_url": null,
"encrypt": true,
"expiry": "600",
"headers": null,
"marker": null,
"max_keys": "1000",
"metadata": null,
"mode": "get",
"object": "/ec2.py",
"overwrite": "always",
"permission": [
"private"
],
"prefix": null,
"profile": null,
"region": null,
"retries": 0,
"rgw": false,
"s3_url": null,
"security_token": null,
"src": null,
"validate_certs": true,
"version": null
},
"module_name": "s3"
},
"msg": "Source bucket cannot be found"
}
根据文档,带有 boto 的 Ansible 应该能够选择 EC2 实例角色。
到目前为止我已经:
- 尝试了文档,这意味着它应该可以工作。
- 已验证我的 boto 版本足够新(boto 2.42)
- 验证 EC2 实例角色具有正确的权限(
aws s3 cp s3://mybucket/ec2.py /tmp/ec2.py
工作正常) - 已验证 EC2 实例凭证可通过
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
这个回答的问题并且文档表明这是可能的。
我可以在不直接向 boto/ansible 提供实例凭证的情况下完成此操作吗?如果可以,该怎么做。文档似乎有点欠缺。
答案1
经过更多的调试和实验后,我发现问题的原因是 Ansible S3 模块中的一个错误。
我最初问题中引用的 ansible playbook 仅在 IAM 角色具有以下情况时才有效:列表桶除了获取对象权限。
答案2
我遇到了完全相同的问题。我发现,如果我通过 ansible playbook 提供 AWS 访问密钥 ID 和秘密访问密钥,它将起作用并从 S3 下载对象。将其作为 ansible 命令运行,并使用内联提供的密钥也可以。因此,“找不到源存储桶”消息具有误导性,这是由于 Ansible 无法使用 IAM 角色。
有一个错误单Ansible GitHub(我猜是同一个作者打开的)但是仍然没有解决。