通过Ansible从AWS S3存储桶中获取整个存储桶或多个对象

时间:2015-09-17 10:53:08

标签: amazon-s3 ansible

据我所知,Ansible的S3模块,它只能一次得到一个对象。

我的问题是,如果我想一次从S3存储桶下载/获取整个存储桶或多个对象,该怎么办?有没有黑客攻击?

8 个答案:

答案 0 :(得分:7)

我能够像这样实现它:

- name: get s3_bucket_items
  s3:
    mode=list
    bucket=MY_BUCKET
    prefix=MY_PREFIX/
  register: s3_bucket_items

- name: download s3_bucket_items
  s3:
    mode=get
    bucket=MY_BUCKET
    object={{ item }}
    dest=/tmp/
  with_items: s3_bucket_items.s3_keys

注意:

  • 您的前缀不应有前导斜杠。
  • {{ item }}值将具有前缀。

答案 1 :(得分:3)

ansible S3模块目前没有以递归方式将桶同步到磁盘的内置方法。

理论上,您可以尝试来收集要使用

下载的密钥
- name: register keys for syncronization
  s3:     
    mode: list
    bucket: hosts
    object: /data/*
  register: s3_bucket_items

- name: sync s3 bucket to disk
  s3:
    mode=get
    bucket=hosts
    object={{ item }}
    dest=/etc/data/conf/
  with_items: s3_bucket_items.s3_keys

虽然我经常看到这个解决方案,但它似乎不适用于当前的ansible / boto版本,因为嵌套的S3'目录' (有关更多信息,请参阅this bug report),以及不为密钥创建子目录的ansible S3模块。 我相信在同步非常大的存储桶时,使用此方法可能会遇到一些内存问题。

我还想补充一点,你很可能不想使用编码到你的剧本中的凭证 - 我建议你改用IAM EC2 instance profiles,这样会更加安全和舒适。

对我有用的解决方案是:

- name: Sync directory from S3 to disk
  command: "s3cmd sync -q --no-preserve s3://hosts/{{ item }}/ /etc/data/conf/"
  with_items:
    - data

答案 2 :(得分:3)

您必须首先将文件列出到变量中,然后使用该变量复制文件。

- name: List files
  aws_s3: 
    aws_access_key: 'YOUR_KEY'
    aws_secret_key: 'YOUR_SECRET'
    mode: list
    bucket: 'YOUR_BUCKET'
    prefix : 'YOUR_BUCKET_FOLDER' #Remember to add trailing slashes
    marker: 'YOUR_BUCKET_FOLDER' #Remember to add trailing slashes
  register: 's3BucketItems'

- name: Copy files
  aws_s3:
    aws_access_key: 'YOUR_KEY'
    aws_secret_key: 'YOUR_SECRET'
    bucket: 'YOUR_BUCKET'
    object: '{{ item }}'
    dest: 'YOUR_DESTINATION_FOLDER/{{ item|basename }}'
    mode: get
  with_items: '{{s3BucketItems.s3_keys}}'

答案 3 :(得分:1)

从Ansible 2.0开始,S3 module包含list操作,可让您列出存储桶中的密钥。

如果您尚未准备好升级到Ansible 2.0,那么另一种方法可能是使用s3cmd之类的工具并通过命令模块调用它:

- name: Get objects
  command: s3cmd ls s3://my-bucket/path/to/objects
  register: s3objects

答案 4 :(得分:1)

它将能够:

- name: Get s3 objects
  s3:
    bucket: your-s3-bucket
    prefix: your-object-directory-path
    mode: list
  register: s3_object_list

- name: Create download directory
  file:
    path: "/your/destination/directory/path/{{ item | dirname }}"
    state: directory
  with_items:
      - "{{ s3_object_list.s3_keys }}"

- name: Download s3 objects
  s3:
    bucket: your-s3-bucket
    object: "{{ item }}"
    mode: get
    dest: "/your/destination/directory/path/{{ item }}"
  with_items:
    - "{{ s3_object_list.s3_keys }}" 

答案 5 :(得分:0)

以下代码将列出帐户中每个S3广告资源中的每个文件。它作为包含AWS密钥的group_vars / localhost / vault.yml的角色运行。

我仍然没有发现为什么第二种更直接的方法II不起作用,但也许有人可以启发我们。

- name: List S3 Buckets
  aws_s3_bucket_facts:
    aws_access_key: "{{ aws_access_key_id }}"
    aws_secret_key: "{{ aws_secret_access_key }}"
#    region: "eu-west-2"
  register: s3_buckets

#- debug: var=s3_buckets

- name: Iterate buckets
  set_fact:
    app_item: "{{ item.name }}"
  with_items: "{{ s3_buckets.ansible_facts.buckets }}"
  register: app_result

#- debug: var=app_result.results  #.item.name <= does not work??

- name: Create Fact List
  set_fact:
    s3_bucketlist: "{{ app_result.results | map(attribute='item.name') | list }}"

#- debug: var=s3_bucketlist

- name: List S3 Bucket files - Method I - works
  local_action:
    module: aws_s3
    bucket: "{{ item }}"
    aws_access_key: "{{ aws_access_key_id }}"
    aws_secret_key: "{{ aws_secret_access_key }}"
    mode: list
  with_items:
    - "{{ s3_bucketlist }}"
  register: s3_list_I

#- debug: var=s3_list_I

- name: List S3 Bucket files - Method II - does not work
  aws_s3:
    aws_access_key: "{{ aws_access_key_id }}"
    aws_secret_key: "{{ aws_secret_access_key }}"
    bucket: "{{ item }}"
    mode: list
    with_items: "{{ s3_bucketlist }}"
  register: s3_list_II

答案 6 :(得分:0)

也许你可以改变你的“with_items”,然后应该工作

  - name: get list to download
    aws_s3:
      region: "{{ region }}"
      bucket: "{{ item }}"
      mode: list
    with_items: "{{ s3_bucketlist }}"
    register: s3_bucket_items

但也许很快就是:

   - name: Sync directory from S3 to disk
    command: "aws --region {{ region }} s3 sync s3://{{ bucket }}/ /tmp/test"

答案 7 :(得分:0)

这是一种不可解决的解决方案,但最终使其可以在具有S3存储桶访问权限或AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY环境变量的假定角色下运行的实例上工作

---
- name: download fs s3 bucket
  command: aws s3 sync s3://{{ s3_backup_bucket }} {{ dst_path }}