Копировать и разархивировать с помощью set_fact ansible

#ansible #ansible-2.x

Вопрос:

Как исправить приведенную ниже задачу для модуля копирования и разархивирования ansible Здесь zip копируется из одного каталога в другой и регистрирует имя файла и использует имя файла для разархивирования в другом каталоге.

 -     name: find the file
      copy:
        src: "{{ item }}"
        dest: "/home/ec2-user/bb"
        remote_src: yes
      with_fileglob:
        - "/home/ec2-user/aa/Data*"
      register: result
    - name: show the result file path
      debug:
        msg: "{{ result }}"
      
 

Вывод из результата отладки

 ok: [localhost] => {
    "msg": {
        "changed": true,
        "msg": "All items completed",
        "results": [
            {
                "ansible_loop_var": "item",
                "changed": true,
                "checksum": "b045e5836bbd01d9c6dd2b7426afb5d1c8957b30",
                "dest": "/home/ec2-user/bb/DataFeed-1.1.tar.gz",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "_original_basename": null,
                        "attributes": null,
                        "backup": false,
                        "checksum": null,
                        "content": null,
                        "delimiter": null,
                        "dest": "/home/ec2-user/bb/DataFeed-1.1.tar.gz",
                        "directory_mode": null,
                        "follow": false,
                        "force": true,
                        "group": null,
                        "local_follow": null,
                        "mode": null,
                        "owner": null,
                        "regexp": null,
                        "remote_src": true,
                        "selevel": null,
                        "serole": null,
                        "setype": null,
                        "seuser": null,
                        "src": "/home/ec2-user/aa/DataFeed-1.1.tar.gz",
                        "unsafe_writes": null,
                        "validate": null
                    }
                },
                "item": "/home/ec2-user/aa/DataFeed-1.1.tar.gz",
                "md5sum": "df9309334454cc3ceac9a6ac8fea8989",
                "src": "/home/ec2-user/aa/DataFeed-1.1.tar.gz"
 

Как использовать dest или путь к элементу или имя файла в качестве входной переменной с помощью модуля set_fact для выполнения другой задачи

Комментарии:

1. Похоже, в вашем вопросе отсутствуют значительные части важной информации.

2. Для меня до сих пор неясно, где находится источник файлов, в какое место они должны быть скопированы, что наиболее важно, какая задача не выполняется и почему необходимо скопировать их раньше. Модуль unarchive может » распаковывать архив после (необязательно) его копирования с локального компьютера » только в одной задаче.

3. Источник файлов поступает из модуля fileglob. Задача состоит в том, чтобы скопировать zip-файл из каталога aa в каталог bb, зарегистрировать имя файла и использовать его для разархивирования в другом каталоге

4. Файлы поступают не из модуля with_fileglob . Источником обычно является своего рода URI. Что касается » Задачи скопировать zip-файл из каталога aa в каталог bb «, находятся ли эти каталоги на одном компьютере / компьютере? Вам нравится выполнять задачи копирования на локальном компьютере, не переходя по сети? Или вы хотите скопировать сетевую форму на другой или на свой локальный компьютер? Что касается » разархивировать его в другом каталоге «, это можно сделать в одной единственной задаче.

5. Все каталоги расположены на одном компьютере.

Ответ №1:

Я понимаю ваш вариант использования следующим образом:

Поскольку модуль copy and unarchive пропускается при использовании with_fileglob

 changed: false
results: []
skipped: true
skipped_reason: No items in the list
 

вам нравится находить доступные файлы раньше и регистрировать результат. В соответствии с использованием фильтров для управления данными — управление именами файлов и именами путей, вы можете получить последнее имя пути к файлу с помощью basename фильтра.

 - name: Find file(s) for copy and extract, register the result
  find:
    paths: "/tmp"
    pattern: "*.tar.gz"
  register: result

- name: Debug task to get comfortable with the data structure and filter
  debug:
    msg: "Full path: {{ item.path}}, basename: {{ item.path | basename }}"
  loop: "{{ result.files }}"

- name: Extract found files directly to into destination
  unarchive:
    src: "/tmp/{{ item.path | basename }}"
    dest: "/home/{{ ansible_user }}/extracted"
    remote_src: yes
  loop: "{{ result.files }}"
 

Если необходимо выполнить задачу копирования перед извлечением, используйте

 - name: Copy files before extracting
  copy:
    src: "/tmp/{{ item.path | basename }}"
    dest: "/home/{{ ansible_user }}/compressed"
    remote_src: yes
  loop: "{{ result.files }}"

- name: Extract found files into destination
  unarchive:
    src: "/home/{{ ansible_user }}/compressed/{{ item.path | basename }}"
    dest: "/home/{{ ansible_user }}/extracted"
    remote_src: yes
  loop: "{{ result.files }}"