2015-09-17 14 views
5

के माध्यम से एडब्ल्यूएस एस 3 बाल्टी से पूरी बाल्टी या एक से अधिक वस्तुओं को प्राप्त करें जहां तक ​​मुझे उत्तर के एस 3 मॉड्यूल पता है, यह केवल एक ही वस्तु को प्राप्त कर सकता है।उत्तर

मेरा सवाल यह है कि अगर मैं एक बार में पूरी बाल्टी या एक से अधिक ऑब्जेक्ट को डाउनलोड करना/प्राप्त करना चाहता हूं तो क्या होगा। क्या कोई हैक है?

+0

** अद्यतन: ** एक है ansible 2.3 के रूप में s3_sync मॉड्यूल [http://docs.ansible.com/ansible/latest/s3_sync_module.html ](http://docs.ansible.com/ansible/latest/s3_sync_module.html) – Norm1710

+0

@ Norm1710 s3_sync केवल मोड = पुश का समर्थन करता है (अपलोड करें) अब के लिए –

उत्तर

1

उत्तर 2.0 के अनुसार S3 module में list क्रिया शामिल है, जो आपको बाल्टी में चाबियाँ सूचीबद्ध करने देती है।

आप Ansible 2.0 के लिए उन्नत करने के लिए तैयार नहीं हैं अभी तक फिर एक और दृष्टिकोण s3cmd जैसे उपकरण भी और कमांड मॉड्यूल के माध्यम से यह आह्वान करने के लिए हो सकता है:

- name: Get objects 
    command: s3cmd ls s3://my-bucket/path/to/objects 
    register: s3objects 
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 }} मान पहले से ही उपसर्ग होगा।
+0

यह समाधान ' टी उपनिर्देशिका के साथ काम नहीं करता है, क्योंकि एस 3 मॉड्यूल स्वचालित रूप से उन्हें नहीं बनाता है। निर्देशिकाओं से संबंधित एक खुली बग भी है जिसमें केवल अन्य निर्देशिकाएं हैं, https://github.com/ansible/ansible/issues/19600 देखें –

2

उत्तरदायी एस 3 मॉड्यूल वर्तमान में डिस्क पर बाल्टी को सिंक्रनाइज़ करने के लिए कोई अंतर्निहित तरीका नहीं है।

सिद्धांत रूप में, आप एक

- 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 संस्करणों के साथ काम करने के लिए प्रतीत नहीं होता नेस्टेड एस 3 'निर्देशिका' के साथ बग (अधिक जानकारी के लिए this bug report देखें), और उत्तरदायी एस 3 मॉड्यूल कुंजी के लिए उपनिर्देशिका नहीं बना रहा है। मेरा मानना ​​है कि यह भी संभव है कि आप बहुत बड़ी बाल्टी को सिंक करते समय इस विधि का उपयोग करके कुछ स्मृति समस्याओं में भाग लेंगे।

मैं यह भी जोड़ना चाहता हूं कि आप अपनी प्लेबुक में कोड किए गए क्रेडेंशियल का उपयोग नहीं करना चाहते हैं - मेरा सुझाव है कि आप इसके बजाय 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 
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 }}" 
0

निम्नलिखित कोड हर फ़ाइलहर S3 बाल्टी में सूची जाएगा खाते में यह AWS कुंजी वाले समूह_वर्स/लोकलहोस्ट/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 
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" 
संबंधित मुद्दे