#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 }}"