首页 文章

Ansible和s3模块

提问于
浏览
4

我正在尝试使用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 回答

  • 2

    在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

  • 2

    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 playbook中使用本地环境变量 . 谢谢

  • 3

    如果您在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
    

相关问题