Назад | Перейти на главную страницу

Ошибка загрузки файла 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.

Создание хоста в анзибле, а затем работа с ним в той же 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

Ссылки

Модуль Ansible Meta

P.S. Я тестировал это здание только на одном хосте, если вы строите несколько, ваш пробег может отличаться.