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で実行する方法を教えてください。
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
参照
追伸複数のホストを構築する場合、マイレージは異なる場合があります。