Я пытаюсь изучить 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.
Создание хоста в анзибле, а затем работа с ним в той же playbook, возможно, но требует некоторых изменений на лету в файле инвентаря и перечитывания инвентаря в вашем playbook.
Сначала добавьте заполнитель в файл инвентаря, например:
[local]
localhost ansible_connection=local ansible_python_interpreter=python
[new_ones]
Во-вторых, в вашей playbook вам понадобятся два раздела: один для выполнения локального задания, а второй - для работы с хостом (ами), созданным вами из первого раздела. В первой части вы создадите хосты, а затем добавите IP-адрес хоста в инвентарь, который вы создали выше. Затем вы скажете ансиблю перечитать инвентарь с помощью meta
команду, а затем подождите, пока хост (-а) придумает 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
Ссылки
P.S. Я тестировал это здание только на одном хосте, если вы строите несколько, ваш пробег может отличаться.