Amazon-Ec2
如何在 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 的情況下完成此操作嗎?如果是,如何。文件似乎有點缺乏。
經過更多的調試和試驗,我發現問題的原因是 Ansible S3 模組中的一個錯誤。
我在原始問題中引用的 ansible playbook 僅適用於 IAM 角色除了GetObject權限之外還具有**ListBucket權限的情況。
我遇到了完全相同的問題。我發現如果我通過 ansible playbook 提供 AWS 訪問密鑰 ID 和秘密訪問密鑰,它將工作並從 S3 下載對象。使用內聯提供的鍵將其作為 ansible 命令執行也可以。因此,“找不到源儲存桶”消息具有誤導性,這是由於 Ansible 無法使用 IAM 角色。
Ansible GitHub中有一張 bug 票(我猜是同一作者打開的),但仍未解決。