3

나는 내 응용 프로그램을 배포하는 데 사용하고 있습니다. 새로 만든 버킷에 내 무딘 자산을 업로드하고 싶습니다. 여기에 제가 한 일이 있습니다 : {{hostvars.localhost.public_bucket}}은 버킷 이름입니다. {{client}}/{{version_id}}/assets/admin은 다중 레벨 폴더가있는 폴더의 경로이며 자산 업로드 :aws s3에 폴더를 업로드하는 방법 재능있는 사람을 사용하여

fatal: [x.y.z.t]: FAILED! => {"changed": false, "failed": true, "invocation": {"module_name": "s3"}, "module_stderr": "", "module_stdout": "\r\nTraceback (most recent call last):\r\n File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1468581761.67-193149771659393/s3\", line 2868, in <module>\r\n main()\r\n File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1468581761.67-193149771659393/s3\", line 561, in main\r\n upload_s3file(module, s3, bucket, obj, src, expiry, metadata, encrypt, headers)\r\n File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1468581761.67-193149771659393/s3\", line 307, in upload_s3file\r\n key.set_contents_from_filename(src, encrypt_key=encrypt, headers=headers)\r\n File \"/usr/local/lib/python2.7/dist-packages/boto/s3/key.py\", line 1358, in set_contents_from_filename\r\n with open(filename, 'rb') as fp:\r\nIOError: [Errno 21] Is a directory: '/home/abcd/efgh/public/assets/admin'\r\n", "msg": "MODULE FAILURE", "parsed": false} 

내가 문서를 통해 가서 내가 ansible s3_module에 대한 옵션을 재귀 찾을 수 없습니다 :

- s3: 
    aws_access_key: "{{ lookup('env','AWS_ACCESS_KEY_ID') }}" 
    aws_secret_key: "{{ lookup('env','AWS_SECRET_ACCESS_KEY') }}" 
    bucket: "{{hostvars.localhost.public_bucket}}" 
    object: "{{client}}/{{version_id}}/assets/admin" 
    src: "{{trunk}}/public/assets/admin" 
    mode: put 

다음은 오류 메시지입니다. 이 버그입니까? 아니면 뭔가 빠졌습니까?!

답변

4

, 그것은 보이지만 ansible 아직 S3 디렉토리 업로드 또는 재귀를 지원하지 않기 때문에 당신은 아마 사용해야하는 AWS CLI이 같은 일을 할 수 있습니다 :

3

신뢰할 수있는 s3 모듈은 디렉토리 업로드 또는 재귀를 지원하지 않습니다. 이 작업에서는 s3cmd 아래 구문을 사용하는 것이 좋습니다. 당신이 뭔가 멱등 원처럼 ansible 사용하여

command: "aws s3 cp {{client}}/{{version_id}}/assets/admin s3://{{hostvars.localhost.public_bucket}}/ --recursive" 
1

내가 업로드하고 싶은 디렉토리 목록의 출력을 반복하여 s3 모듈을 사용하여이 작업을 수행 할 수있었습니다. 명령 모듈을 통해 실행중인 작은 인라인 파이썬 스크립트는 JSON으로 포맷 된 디렉토리의 파일 경로 인 경우 전체 목록을 출력합니다.

- name: upload things 
    hosts: localhost 
    connection: local 

    tasks: 
    - name: Get all the files in the directory i want to upload, formatted as a json list 
     command: python -c 'import os, json; print json.dumps([os.path.join(dp, f)[2:] for dp, dn, fn in os.walk(os.path.expanduser(".")) for f in fn])' 
     args: 
      chdir: ../../styles/img 
     register: static_files_cmd 

    - s3: 
      bucket: "{{ bucket_name }}" 
      mode: put 
      object: "{{ item }}" 
      src: "../../styles/img/{{ item }}" 
      permission: "public-read" 
     with_items: "{{ static_files_cmd.stdout|from_json }}" 
2

Ansible 2.3의, 당신은 사용할 수 있습니다 s3_sync :

- name: basic upload 
    s3_sync: 
    bucket: tedder 
    file_root: roles/s3/files/ 

참고 : 기본이 아닌 영역을 사용하는 경우, 당신은 명시 적으로 region을 설정해야합니다, 그렇지 않으면 당신은 얻을 An error occurred (400) when calling the HeadObject operation: Bad Request An error occurred (400) when calling the HeadObject operation: Bad Request

위에서 수행하려고했던 내용과 일치하는 전체 플레이 북은 다음과 같습니다.

- hosts: localhost 
    vars: 
    aws_access_key: "{{ lookup('env','AWS_ACCESS_KEY_ID') }}" 
    aws_secret_key: "{{ lookup('env','AWS_SECRET_ACCESS_KEY') }}"  
    bucket: "{{hostvars.localhost.public_bucket}}" 
    tasks: 
    - name: Upload files 
    s3_sync: 
     aws_access_key: '{{aws_access_key}}' 
     aws_secret_key: '{{aws_secret_key}}' 
     bucket: '{{bucket}}' 
     file_root: "{{trunk}}/public/assets/admin" 
     key_prefix: "{{client}}/{{version_id}}/assets/admin" 
     permission: public-read 
     region: eu-central-1 

참고 :

  1. 당신은 아마 지역을 제거 할 수 있습니다, 난 그냥 단지 명시 적으로 키를 추가 한
  2. 위 내 지점을 예시에 추가. 당신은 (그리고 아마도한다)이 환경 변수를 사용할 수 있습니다

를 문서에서 : 매개 변수가 모듈 내에서 설정되지 않은 경우

, 다음과 같은 환경 변수가 감소하는 순서로 사용할 수 있습니다 우선 AWS_URL 또는 EC2_URL, AWS_ACCESS_KEY_ID 또는 AWS_ACCESS_KEY 또는 EC2_ACCESS_KEY, AWS_SECRET_ACCESS_KEY 또는 AWS_SECRET_KEY 또는 EC2_SECRET_KEY, AWS_SECURITY_TOKEN 또는 EC2_SECURITY_TOKEN, AWS_REGION 또는 EC2_REGION

관련 문제