3

私は自分のアプリケーションを配備するために使用しています。 {{hostvars.localhost.public_bucket}}はバケット名、 {{client}}/{{version_id}}/assets/adminは、マルチレベルのフォルダを含むフォルダへのパスであり、新しいバケットを作成するには、次のように入力します。 アップロードする資産:aws s3にフォルダをアップロードするにはどうすればいいのでしょうか?

- 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 

ここでは、エラーメッセージです:

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のためのオプションを再帰的に見つけることができませんでした。 これはバグですか、何か不足していますか?

答えて

4

、あなたが何かの冪等を望んでいたように見えますが、ansibleはまだS3ディレクトリのアップロードまたは任意の再帰をサポートしていませんので、あなたはおそらく、このような仕事をするには、CLI AWSを使用する必要があります。

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

不可能なs3モジュールは、ディレクトリのアップロードや再帰をサポートしていません。 この作業では、s3cmdの構文を使用することをおすすめします。

ansible使用することにより
command: "aws s3 cp {{client}}/{{version_id}}/assets/admin s3://{{hostvars.localhost.public_bucket}}/ --recursive" 
1

は、私は私がアップロードしたいディレクトリリストの出力を反復処理によってS3モジュールを使用してこれを実現することができました。コマンドモジュール経由で実行している小さなインラインPythonスクリプトは、ディレクトリ内のファイルパスがJSON形式であれば完全なリストを出力します。

Ansible 2.3のよう
- 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

、あなたが使用することができます。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

関連する問題