据我所知,Ansible的S3模块,它只能一次得到一个对象。
我的问题是,如果我想一次从S3存储桶下载/获取整个存储桶或多个对象,该怎么办?有没有黑客攻击?
答案 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_ID
和AWS_SECRET_ACCESS_KEY
环境变量的假定角色下运行的实例上工作
---
- name: download fs s3 bucket
command: aws s3 sync s3://{{ s3_backup_bucket }} {{ dst_path }}