Ansible 和 s3 模块

Ansible and s3 module

我正在尝试使用 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 剧本和角色供任何人使用,并且我不想对任何 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 凭证?

在 EC2 实例中,授权 运行 代码访问 AWS 资源的最佳方式是使用 IAM 角色。

您在启动时为任何实例分配角色。可以为角色设置任何策略。

在实例内部,任何进程都可以连接到已知的 URL 以检索临时密钥,以便对任何 AWS 服务进行身份验证。

A​​nsible S3 模块使用的 Python 库 Boto 自动支持 IAM 角色。因此,如果没有直接或在环境变量中提供密钥,Boto 将查询已知的 URL 以获取实例密钥。

有关 IAM 角色如何工作的更多详细信息,请参见此处: http://docs.aws.amazon.com/IAM/latest/UserGuide/roles-usingrole-ec2instance.html#role-usecase-ec2app-permissions

如果您在 ansible 主机上设置了 AWS_SECRET_KEY 和 AWS_ACCESS_KEY 环境变量,那么您可以将它们作为变量传递到 ansible 命令行,这样您就可以在 playbook 中引用它们:

$ ansible-playbook playbook.yml --extra-vars="mykey=${AWS_ACCESS_KEY} mysecret=${AWS_SECRET_KEY}"

如果您从脚本中调用剧本,那么这可能是一种很好的方法。另一种方法是在您的剧本中读取这些变量,然后以这种方式引用它们。我自己还没有尝试过,但是按照这些思路应该可以工作:

- name: get AWS_ACCESS_KEY
  local_action: shell echo ${AWS_ACCESS_KEY}
  register: mykey

- name: get AWS_SECRET_KEY
  local_action: shell echo ${AWS_SECRET_KEY}
  register: mysecret

- name: upload data import file
  s3: aws_access_key={{ mykey.stdout }} aws_secret_key={{ mysecret.stdout }} bucket=my-bucket object=/data.zip mode=get

ansible 中的 S3 模块不支持 profile 选项,但你可以这样使用,如果你已经将 aws_key 和 aws_secret 作为变量导出:

export aws_key="AAAAAAAAAAAAAAAAAAAAAAAAAA"
export aws_secret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

然后你可以像这样使用它们:

s3:
  aws_access_key: "{{ lookup('env','aws_key') }}"
  aws_secret_key: "{{ lookup('env','aws_secret') }}"
  bucket: "my-bucket"
  object: "/data.zip"
  mode: get

希望这会帮助您或正在寻找的任何人使用 ansible 剧本中的本地环境变量。谢谢