【问题标题】:Ansible and s3 moduleAnsible 和 s3 模块
【发布时间】:2017-11-30 04:04:30
【问题描述】:

我正在尝试使用 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 凭证?

【问题讨论】:

    标签: amazon-web-services amazon-s3 ansible ansible-playbook


    【解决方案1】:

    ansible 中的 S3 模块不支持配置文件选项,但如果您已将 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 playbook 中的本地环境变量。谢谢

    【讨论】:

    • 您可以只导出AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY shell 环境变量,ansible 将自动使用它们而无需更改您的代码。
    【解决方案2】:

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

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

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

    Ansible S3 模块使用的 Python 库 Boto 自动支持 IAM 角色。所以如果没有直接提供key或者在环境变量中没有提供key,Boto会查询已知的URL来获取实例key。

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

    【讨论】:

    • IAM 角色很棒。此外,如果创建者尝试从非 EC2 实例执行此操作,它使用 boto 凭据格式,您可以使用 AWS_DEFAULT_PROFILE="profilename" 更改配置文件。
    • boto 配置文件方法的问题在于,听起来 OP 在 Ansible 主机上有凭据,但在运行 S3 模块的主机上没有凭据,而且他不想拥有密钥硬编码在任何地方。要临时使用 boto 配置文件,他需要在目标主机上用适当的凭据写出临时 boto 配置文件,调用 S3 模块,然后删除配置文件。这是很多额外的工作。
    • 这对我很有用。我修改了用于配置我的 EC2 实例的 Ansible 脚本,消除了在其他任何地方提及的所有凭证,瞧。谢谢!
    • 如果有帮助,那就太酷了(不要忘记接受让你走上正确道路的回应;))
    【解决方案3】:

    如果你在你的 ansible 主机上设置了 AWS_SECRET_KEY 和 AWS_ACCESS_KEY 环境变量,那么你可以将它们作为变量传递到 ansible 命令行,以便你可以在你的剧本中引用它们:

    $ 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多