Извлечение многокомпонентных zip-файлов с помощью Ansible (пример: установка WebSphere)
Для соединений HCL нам по-прежнему нужен WebSphere, и я хочу автоматизировать этот сложный и медленный процесс с помощью Ansible. WebSphere необходимо загрузить вручную с различными ZIP-файлами для каждого компонента, например:
├── CIK1VML.zip
├── CIK1WML.zip
└── CIK1XML.zip
Символ после
CIK1
идентифицирует часть. В командной строке я могу разархивировать их, заменив идентификатор этой части знаком вопроса:
unzip '/cnx-smb/was/supplements/CIK1?ML.zip' -d /tmp/was-suppl-manual
я хотел бы использовать
unarchive
модуль, потому что он поддерживает такие функции, как
remote_src
что было бы полезно для меня, поэтому я попробовал простую книгу POC:
- hosts: 127.0.0.1
connection: local
tasks:
- name: Unpack test
become: yes
unarchive:
src: "/cnx-smb/was/supplements/CIK1?ML.zip"
remote_src: no
dest: "/tmp/was-extracted"
Но это не работает:
TASK [Unpack test] **********************************************************************************************************************************************************************************************************************************************************
Wednesday 10 February 2021 16:17:25 +0000 (0:00:00.637) 0:00:00.651 ****
fatal: [127.0.0.1]: FAILED! => changed=false
msg: |-
Could not find or access '/cnx-smb/was/supplements/'CIK1?ML.zip'' on the Ansible Controller.
If you are using a module and expect the file to exist on the remote, see the remote_src option
я тоже пробовал разные
src
пути, как
/cnx-smb/was/supplements/'CIK1?ML.zip'
, вызвать
unzip
Вызов CLI работает только тогда, когда хотя бы имя файла заключено в кавычки или, как вариант, весь путь. Ansible принимает только тогда, когда имя файла заключено в кавычки,
'/cnx-smb/was/supplements/CIK1?ML.zip'
кажется, интерпретируется как относительный путь (который, очевидно, терпит неудачу).
1 ответ
Кажется, что эти составные zip-архивы на самом деле не являются «составными» архивами, как я знаю из форматов сжатия, таких как 7zip, где у нас есть File.partX.7z, которые используются только вместе. 7zip проверяет их и выдает ошибку, если, например, часть отсутствует.
С этими zip-файлами ситуация иная. Я заглянул в них и заметил, что могу распаковать каждый zip-файл без других. Каждый zip-файл содержит часть установочного архива. Кажется, сам zip не делит большую папку на части. Именно IBM по какой-то причине поместила некоторые папки, такие как disk2 , в отдельный файл архива.
Это означает, что я могу сделать то же самое с ansible: просто извлечь каждый файл отдельно, но в тот же каталог:
- hosts: 127.0.0.1
connection: local
vars:
base_dir: /cnx-smb/was/supplements/
tasks:
- name: Unpack
become: yes
unarchive:
src: "{{ base_dir }}/{{ item }}"
remote_src: no
dest: "/tmp/was-extracted"
with_items:
- CIK1VML.zip
- CIK1WML.zip
- CIK1XML.zip
Обе извлеченные папки (Ansible + вручную с помощью
zip
команда с
?
заполнитель) были одного размера и содержали одни и те же данные:
vagrant@ansible:/cnx-repo$ du -hs /tmp/was-extracted/
3.0G /tmp/was-extracted/
vagrant@ansible:/cnx-repo$ du -hs /tmp/was-suppl-manual
3.0G /tmp/was-suppl-manual