Ansible升级Payara时如何动态引用多域的唯一备份文件名?
Ansible升级Payara时如何动态引用多域的唯一备份文件名?
我懂你这个头疼的点!Payara自动生成的带时间戳和版本号的备份文件名确实给Ansible循环带来了麻烦,不过咱们可以通过在备份后动态查找每个域对应的备份文件来解决这个问题,不需要去重命名文件,更可靠也更省事。
核心思路
备份完成后,针对每个域的备份目录,找到里面的唯一(或最新)备份文件,把「域名」和「备份文件名」关联起来,之后恢复时直接用这个关联好的信息就行。
具体实现步骤
在你的备份任务之后,添加一个查找备份文件的任务,然后修改恢复任务的逻辑:
1. 查找每个域对应的备份文件
添加这个任务,遍历每个域名对应的备份子目录,找到里面的zip备份文件(如果有多个就取最新的):
- name: 获取每个域对应的最新备份文件名 find: paths: "/tmp/payara_backup/{{ item }}" patterns: "*.zip" file_type: file sort: modified # 按修改时间排序 order: descending # 最新的排在前面 limit: 1 # 只取最新的那个备份文件 register: domain_backup_files loop: "{{ result_of_find.files | map(attribute='path') | map('basename') | list }}"
这里的loop部分是从之前的result_of_find里提取出所有域名,然后逐个去查找对应目录下的备份文件,结果会存在domain_backup_files里。
2. 动态引用备份文件名完成恢复
修改你的恢复任务,循环domain_backup_files.results,这样就能同时拿到域名和对应的备份文件名了:
- name: 恢复每个Payara域 command: "/opt/{{ payara_folder }}/bin/asadmin restore-domain --fileName {{ item.files[0].basename }} --backupDir /tmp/payara_backup/{{ item.item }} {{ item.item }}" loop: "{{ domain_backup_files.results }}"
解释一下这里的变量:
item.item:就是当前循环的域名(来自前面的loop参数)item.files[0].basename:找到的那个备份文件的文件名(比如domain1_2024_05_20_v00001.zip)
为什么这个方法靠谱?
- 不需要修改备份文件名,完全适配Payara的默认备份逻辑,不用担心Payara不认自定义文件名的问题;
- 自动处理多个备份的情况,确保用最新的那个备份来恢复;
- 完美关联域名和对应的备份文件,解决了「两个循环」的问题——其实是把两次循环的信息合并成了一个关联的数据集。
可选优化:备份时指定备份名前缀
如果你想让备份文件名更规整,也可以在备份时用--backupName参数指定一个固定前缀,比如:
- name: Run backup-domain on each of the Payara domains command: "/opt/{{ payara_folder }}/bin/asadmin backup-domain --backupDir /tmp/payara_backup --backupName payara_upgrade_backup {{ item.path | basename }}" with_items: "{{ result_of_find.files }}"
这样备份文件名会变成[域名]_payara_upgrade_backup_v00001.zip,查找的时候可以把patterns改成*payara_upgrade_backup*.zip,进一步缩小查找范围,避免误找其他备份。
备注:内容来源于stack exchange,提问作者Chris Douglas
相关产品推荐
相关产品推荐

