我知道我可以在调用之前ec2.py
通过指定环境变量,或者使用带有纯文本密码(或 python 密钥环)的配置文件。export
ec2.py
boto
因为我在 ansible 保险库中拥有 aws 密钥和机密,所以有没有办法从保险库中自动导出它们,或者通过任何其他方式传递值,ec2.py
而不必再次指定它?
答案1
那么您可以编写一个简单的任务来将密钥转储到配置vault
中boto3
。
---
- name: Ensure AWS credentials configuration is present.
template:
src: credentials.j2
dest: "/home/{{ ansible_user }}/.aws/credentials"
credentials.j2
[default]
aws_access_key_id = {{ aws_access_key_id }}
aws_secret_access_key = {{ aws_secret_access_key }}
在哪里aws_access_key_id
并且aws_secret_access_key
可以存储在保险库中。
然后需要针对 Ansible 控制主机(执行的主机ansible-playbook
)运行该任务。
然后密钥将在 Ansible 控制主机上解密。恕我直言(我可能错了),您需要通过环境变量(export
命令)或通过 boto 配置向 boto 提供纯 AWS 密钥。
Ansible 通过 boto 向 AWS 发出 API 调用。Boto 不是 Ansible 的一部分。因此,在 boto 中没有原生方式来使用 Ansible 中定义的参数。该功能必须是 boto 的一部分。
答案2
正如您提到的,您在 EC2 实例上运行 Ansible,您实际上不应该使用凭据,而是使用附加到 EC2 实例的角色:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
这个想法是,您的实例本身能够获得临时凭证并可以执行在此角色中定义的必要命令。由于您从未在任何地方存储任何凭证,因此这是从 EC2 实例使用 AWS API 最安全的方式。由于 Ansible 依赖于 boto,因此它可以开箱即用 - 您只需创建一个具有所有必要 IAM 权限的角色并将其附加到您正在运行 Ansible 的实例上。之后,您的动态库存将正常工作,而无需任何额外的凭证。