如何在 Ansible 中使用 AWS EC2 Iam 角色

如何在 Ansible 中使用 AWS EC2 Iam 角色

我在分配了 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(我猜是同一个作者打开的)但是仍然没有解决。

相关内容