我正在尝试使用Ansible将一些文件下载到我的各种EC2实例中 . 我遇到的问题是我的AWS凭据 . AWS Ansible模块都运行良好,包括S3模块 . 以下(当我在我的AWS凭证中替换时)就像一个魅力 .
- name: upload data import file
s3: aws_access_key=<accesskey> aws_secret_key=<secretkey> bucket=my-bucket object=/data.zip mode=get
但是,我需要Ansible playbooks和我正在编写的角色供任何人使用,我不想让任何AWS凭证硬编码 . 在其他地方我使用Ansible AWS模块,我已经删除了aws_access_key和aws_secret_key,它可以正常工作,因为Ansible在环境变量中查找这些值 . 但是,对于其他所有用途,我将它们作为本地操作运行 . 所以,它从我的本地机器中提取凭据,这就是我想要的 . 问题是当我在我的一个实例上运行S3模块时,如果我取消了凭证参数,我得到:
failed: [54.173.19.238] => {"failed": true}
msg: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials
我想这是因为我没有指定凭据,它在我的实例上的环境变量中查找它们,它们没有设置 . 我也不想在实例上的环境变量中设置它们 .
有没有办法我可以使用ansible从S3下载文件,而不必指定我的AWS凭据?
3 回答
在EC2实例中,授权运行代码访问AWS资源的最佳方法是使用IAM角色 .
您在启动时为任何实例分配角色 . 可以将任何策略设置为该角色 .
在实例内部,任何进程都可以连接到已知URL以检索临时密钥,以便对任何AWS服务进行身份验证 .
Boto是Ansible S3模块使用的Python库,它自动支持IAM角色 . 因此,如果没有直接提供密钥或在环境变量中提供密钥,Boto将查询已知URL以获取实例密钥 .
有关IAM角色如何工作的更多详细信息,请访问:http://docs.aws.amazon.com/IAM/latest/UserGuide/roles-usingrole-ec2instance.html#role-usecase-ec2app-permissions
ansible中的S3模块不支持profile选项,但如果已将aws_key和aws_secret导出为变量,则可以这样使用:
然后你可以像这样使用它们:
希望这会帮助您或正在寻找的任何人在ansible playbook中使用本地环境变量 . 谢谢
如果您在ansible主机上设置了AWS_SECRET_KEY和AWS_ACCESS_KEY环境变量,那么您可以将这些变量作为变量传递到ansible命令行,以便您可以在您的playbook中引用它们:
如果您从脚本调用您的剧本,那么这可能是一种很好的方法 . 另一种方法是读取你的剧本中的那些变量,然后以这种方式引用它们 . 我自己没有试过这个,但是这些方面应该有用: