web-dev-qa-db-ja.com

AnsibleダウンロードファイルをS3からec2インスタンスにエラー

Ansibleを学ぼうとしています。インスタンスの作成とそのインスタンスへのファイルのアップロードに取り組んでいます。ec2インスタンスに入れたいファイルはS3に保存されていますが、c2内の宛先は存在しないと言われ続けますが、存在します。 。

これは失敗しています。インスタンスの作成を含む、それ以前の他のすべては正常に機能しています。

- name: Deploy war file
        aws_s3:
            bucket: "{{ war_bucket }}"
            object: "{{ war_file }}"
            dest: "{{ war_deploy_path }}/{{ war_file }}"
            mode: get
            overwrite: no
        register: war_downloaded

そしてこれは私が私の変数を宣言した方法です:

war_file: file.war
war_bucket: ansible-bucket
war_deploy_path: /opt/folder/file.war

そして、これは私が得るエラーです:

[Errno 2] No such file or directory: '/opt/folder/file.war.1f1ccA91'

この奇妙なコード「1f1cA91」を追加するのはなぜですか?問題が発生していますか?

更新:宛先を「{{war_deploy_path}}/{{war_file}}」から「{{war_deploy_path}}」に変更しようとしましたが、同じ問題が解決せず、エラーのみが[Errno 2] No such file or directory: '/opt/folder.Ac2926c3'現在。

重要な更新2:わかりました。テストのために、ローカルマシンに同じパスを作成することにしました。驚いたことに、このスクリプトは実際にはec2インスタンスではなくローカルマシンで実行されていますlolなので、ec2インスタンスxDで実行する方法を教えてください。

2
logax

Ansibleでホストを作成し、同じプレイブックで作業することは可能ですが、インベントリファイルをその場で変更し、プレイブックのインベントリを再度読み取る必要があります。

まず、次のようにプレースホルダーをインベントリファイルに追加します。

[local]
    localhost ansible_connection=local ansible_python_interpreter=python

[new_ones]

次に、プレイブックには2つのセクションが必要です。1つはローカルジョブを実行するためのもので、もう1つは最初のセクションから作成したホストに対して実行するためのものです。最初の部分では、ホストを作成してから、上記で作成したインベントリにホストIPを追加します。次に、metaコマンドを使用してインベントリを再度読み取るようにansibleに指示し、ホストがpauseコマンドを表示するのを待ちます。次に例を示します。

---

- name: Testing Part One
  hosts: local
  become: yes
  tasks:
    - name: create an ec2 instance
      local_action: 
          module: ec2
          aws_secret_key: <redacted>
          aws_access_key: <redacted>
          group_id: sg-1234567
          key_name: my_key
          instance_type: t2.micro
          image: AMI-0123456789abcde
          wait: yes
          count: 1
          vpc_subnet_id: subnet-987654321
          assign_public_ip: no
          region: us-east-1
      register: ec2

# This part adds the IP address of the Host that was created above to the
#   inventory file

    - name: Add instance to inventory
      local_action:
          module: lineinfile
          path: inv/hosts_default
          regexp: "{{ item.private_ip }}"
          insertafter: "new_ones"
          line: "{{ item.private_ip }}"
      with_items: '{{ ec2.instances }}'

# Have the playbook reread the inventory file
    - meta: refresh_inventory

# Wait for a bit to ensure SSH is enabled
    - pause:
        minutes: 5

次に、同じプレイブックに別のエントリを作成して、ファイルをコピーします。私はデフォルトでホストにpipをインストールしていないので、同じボートにいる場合に備えて追加しました。

- name: Testing Part Two
  hosts: new_ones
  become: yes
  tasks:

# Install pip, boto, boto3, and botocore.  You may not need this
    - name: install pip
      easy_install:
        name: pip
        state: latest

    - name: install boto, boto3 and botocore
      pip:
         name: "{{ item }}"
      loop:
        - boto
        - boto3
        - botocore

# Finally we get to what you were trying to do to begin with...

    - name: Deploy war file
      aws_s3:
          aws_secret_key: <redacted>
          aws_access_key: <redacted>
          bucket: "mybucketname"
          object: "blah.txt"
          dest: "/tmp/blah.txt"
          mode: get
          overwrite: no
      register: war_downloaded

まだ混乱している場合のための完全なプレイブックは次のとおりです。

---

- name: Testing Part 1
  hosts: local
  become: yes
  tasks:
    - name: create an ec2 instance
      local_action: 
          module: ec2
          aws_secret_key: <redacted>
          aws_access_key: <redacted>
          group_id: sg-1234567
          key_name: my_key
          instance_type: t2.micro
          image: AMI-0123456789abcde
          wait: yes
          count: 1
          vpc_subnet_id: subnet-987654321
          assign_public_ip: no
          region: us-east-1
      register: ec2

    - name: Add instance to inventory
      local_action:
          module: lineinfile
          path: inv/hosts_default
          regexp: "{{ item.private_ip }}"
          insertafter: "new_ones"
          line: "{{ item.private_ip }}"
      with_items: '{{ ec2.instances }}'

    - meta: refresh_inventory

    - pause:
        minutes: 5

- name: Testing Part Two
  hosts: new_ones
  become: yes
  tasks:
    - name: install pip
      easy_install:
        name: pip
        state: latest

    - name: install boto, boto3 and botocore
      pip:
         name: "{{ item }}"
      loop:
        - boto
        - boto3
        - botocore

    - name: Deploy war file
      aws_s3:
          aws_secret_key: <redacted>
          aws_access_key: <redacted>
          bucket: "mybucketname"
          object: "blah.txt"
          dest: "/tmp/blah.txt"
          mode: get
          overwrite: no
      register: war_downloaded

参照

Ansibleメタモジュール

追伸複数のホストを構築する場合、マイレージは異なる場合があります。

0
kenlukas