我正在尝试编写一个 Ansible 脚本来将 Payara 实例升级到较新的实例,方法是备份当前安装中的域,删除它,安装新版本的 Payara,然后恢复刚刚对其进行的备份。这似乎是升级 Payara 的推荐方法。
我在这方面取得了相当大的进展,部分是来自我已经编写的用于运行全新安装的 Payara 的代码,部分是我为这个脚本编写的新代码,但在最后一部分遇到了障碍。因为给定的 Payara 实例可能有多个域,所以我不得不弄清楚如何在 Ansible 中使用循环,但我仍然不完全理解它们的工作原理。我已经成功地完成了该过程的前半部分(提取所有域的备份),方法是找到 Payara 存储域的目录并对其进行循环,但恢复带来了麻烦,因为文件名每次都是唯一的——它将是该文件夹中唯一的文件,但即使分析了一段时间后,我也不明白如何引用实际上同时是两个循环的文件。
到目前为止我的代码(为了相关性而删减):
- name: Get list of Payara domains
find:
paths: /opt/{{ payara_folder }}/glassfish/domains
file_type: directory
register: result_of_find
- name: Run backup-domain on each of the Payara domains
command: "/opt/{{ payara_folder }}/bin/asadmin backup-domain --backupDir /tmp/payara_backup {{ item.path | basename }}"
with_items: "{{ result_of_find.files }}"
- name: Run restore-domain on each of the Payara domains
command: "/opt/{{ payara_folder }}/bin/asadmin restore-domain --fileName /tmp/payara_backup/{{ item.path | basename }}/**NAME OF BACKUP FILE HERE** --backupDir /tmp/payara_backup {{ item.path | basename }}"
with_items: "{{ result_of_find.files }}"
如上所述,任务 1 和 2 运行良好,但我在任务 3 上遇到了困难:Payara 的备份提取会弹出一个类似的名称domain_yyyy_mm_dd_v00001.zip
。我考虑添加一个任务,将所有备份重命名为类似于backup.zip
步骤 2 和步骤 3 之间的名称,因为它们都在单独的子目录中,但 a) 我不知道 Payara 是否会接受具有不同命名布局的文件(我不明白为什么它不会接受?)并且 b) 这只会将识别文件名的问题转移到另一个任务。
对于我该如何处理此事有什么建议吗?
答案1
为什么不将您的command
任务替换为shell
任务和通配符?
- name: Run restore-domain on each of the Payara domains
shell: >-
/opt/{{ payara_folder }}/bin/asadmin restore-domain
--fileName /tmp/payara_backup/{{ item.path | basename }}/*.zip
--backupDir /tmp/payara_backup {{ item.path | basename }}
with_items: "{{ result_of_find.files }}"
由于每个目录仅包含一个文件,我们可以写入/tmp/payara_backup/{{ item.path | basename }}/*.zip
,然后 shell 将*.zip
用适当的文件名替换我们的通配符 ( )。
请注意,我已经重新格式化了任务以提高可读性,但除了从到command
的变化shell
和在路径中使用通配符之外,它在语法上仍然与原始任务相同。