第 10 章 备份和恢复

重要
  • 您必须使用与备份相同的操作镜像版本进行恢复。
  • 要备份和恢复 Ansible Automation Platform 部署,务必要使现有 Ansible Automation Platform 管理 secret 名称和值记录在某个地方安全。
  • 还需要对 Cloud SQL 数据库实例和 filestore 备份进行常规手动备份,以确保部署可以尽可能接近其以前的工作状态。

playbook 备份和恢复为来自 GCP Marketplace 基础部署的 Ansible Automation Platform 提供备份和恢复支持。

注意

恢复过程会部署一个新的 Ansible Automation Platform,并将 filestore 和 SQL 数据库实例恢复到指定的备份。

10.1. 备份过程

备份允许您通过保存数据库和共享文件系统来备份您的环境。使用保存的共享文件系统在恢复过程中创建一个新环境。当新环境就位时,进程会恢复数据库。

备份和恢复过程必须使用相同的版本。如果使用早期版本执行备份,则必须使用该版本的恢复过程。然后,如果需要,您可以运行升级。

您还必须在升级前进行备份。如需更多信息,请参阅升级部署

备份过程涉及在给定时间点对 Cloud SQL 数据库和 filestore 实例进行备份。备份 playbook 需要运行 GCP Marketplace 基础部署的活跃 Ansible Automation Platform。

需要在项目中创建存储桶,因为恢复信息将存储在该存储桶中。

bucket 可以包含来自同一部署或不同的部署的多个备份。备份将生成一个名为 <prefix>-<deployment_name>-<timestamp> 的目录,以及名为 <prefix>-<deployment_name>-<timestamp>.json 的文件。目录包含 awx 和 pulp 数据库备份、部署配置和 secret。json 文件包含恢复过程的信息。

Playbook 通过 CLI 提供,以列出和删除备份。

以下流程描述了如何从 GCP Marketplace 部署备份 Ansible Automation Platform。

10.1.1. 拉取 ansible-on-clouds-ops 容器镜像

流程

  • 使用与基础部署相同的标签,拉取 ansible-on-clouds-ops 容器的 docker 镜像。

    注意

    在拉取 docker 镜像前,请确保使用 docker 登录到 registry.redhat.io。使用以下命令登录到 registry.redhat.io。

    $ docker login registry.redhat.io

    有关 registry 登录的更多信息,请参阅 Registry 身份验证

    $ export IMAGE=registry.redhat.io/ansible-on-clouds/ansible-on-clouds-ops-rhel9:2.4.20230630
    $ docker pull $IMAGE --platform=linux/amd64

10.1.2. 所需权限

您必须具有以下 GCP IAM 权限才能备份堆栈:

required-roles:

Service Account User
Compute Instance Admin (v1)
required-permissions:

compute.instances.list
deploymentmanager.deployments.get
deploymentmanager.manifests.get
deploymentmanager.manifests.list
deploymentmanager.resources.list
file.backups.create
file.operations.get
iap.tunnelInstances.accessViaIAP
storage.objects.create
storage.objects.list

10.1.3. 设置环境

流程

  • 创建用于存放配置文件的文件夹。

    $ mkdir command_generator_data

10.1.4. 备份要求

您必须创建一个存储桶,将 Ansible 存储在云部署备份上。bucket 包含备份信息、secret 和数据库备份。

流程

  1. 在 Google Cloud 控制台中进入 Cloud StorageBuckets
  2. 选择项目。
  3. Create
  4. 输入名称。
  5. 输入适合您的要求的数据位置。通过多和双区域,您可以对另一个区域进行恢复。
  6. 输入适合您要求的存储类。
  7. 输入适合您的要求的控制访问。
  8. 输入适合您的要求的数据保护。
  9. Create

故障排除

如果存储桶名称已在另一个项目中使用,则会引发错误。

10.1.5. 创建备份数据文件

流程

  1. 运行命令 generator command_generator_vars 来生成 backup.yml

    注意

    在 Linux 上,命令生成器创建的任何文件或目录默认归 root:root 所有。要更改文件和目录的所有权,您可以在创建文件后运行 sudo chmod 命令。如需更多信息,请阅读 命令生成器 - 由 root 拥有的 Linux 文件

    docker run --rm -v $(pwd)/command_generator_data/:/data $IMAGE command_generator_vars gcp_backup_deployment --output-data-file /data/backup.yml
  2. 运行此命令后,会创建一个 $(pwd)/command_generator_data/backup.yml 模板文件。此模板文件类似于以下内容:

    gcp_backup_deployment:
      cloud_credentials_path:
      deployment_name:
      extra_vars:
        backup_prefix: aoc-backup
        gcp_bucket_backup_name:
        gcp_compute_region:
        gcp_compute_zone:

10.1.6. backup.yml 文件中的参数

在触发备份前,您必须填充数据文件。以下变量是数据文件中列出的参数。

  • cloud_credentials_path 是 Google Cloud 服务帐户凭证文件的路径。这必须是绝对路径。
  • DEPLOYMENT_NAME 是您要备份的 AAP 部署的名称
  • backup_prefix 是您要添加到备份名称的前缀(默认:oc-backup)
  • gcp_bucket_backup_name 是之前创建的用于备份的存储桶。
  • gcp_compute_region 是部署基础部署的 GCP 区域。这可以通过检查 Deployment Manager 中的 Deployments 配置来检索。
  • gcp_compute_zone 是部署基础部署的 GCP 区。这可以通过检查 Deployment Manager 中的 Deployments 配置来检索。

10.1.7. 运行备份 playbook

流程

  1. 要运行备份,请运行命令生成器来生成 backup 命令。

    docker run --rm -v $(pwd)/command_generator_data:/data $IMAGE command_generator gcp_backup_deployment --data-file /data/backup.yml

    会产生以下 ouput:

    -----------------------------------------------
    Command to run playbook:
    
    docker run --rm --env PLATFORM=GCP -v  </path/to/gcp/service-account.json>:/home/runner/.gcp/credentials:ro \
    --env ANSIBLE_CONFIG=../gcp-ansible.cfg --env DEPLOYMENT_NAME=<deployment_name --env GENERATE_INVENTORY=true  \
    $IMAGE redhat.ansible_on_clouds.gcp_backup_deployment \
    -e 'gcp_service_account_credentials_json_path=/home/runner/.gcp/credentials  \
    gcp_deployment_name=<deployment_name> gcp_compute_region=<region> gcp_compute_zone=<zone> \
    gcp_bucket_backup_name=<bucket> backup_prefix=aoc-backup'
  2. 运行提供的备份命令来触发备份。

    $ docker run --rm --env PLATFORM=GCP -v  </path/to/gcp/service-account.json>:/home/runner/.gcp/credentials:ro \
    --env ANSIBLE_CONFIG=../gcp-ansible.cfg --env DEPLOYMENT_NAME=<deployment_name --env GENERATE_INVENTORY=true  \
    $IMAGE redhat.ansible_on_clouds.gcp_backup_deployment \
    -e 'gcp_service_account_credentials_json_path=/home/runner/.gcp/credentials  \
    gcp_deployment_name=<deployment_name> gcp_compute_region=<region> gcp_compute_zone=<zone> \
    gcp_bucket_backup_name=<bucket> backup_prefix=aoc-backup'
  3. playbook 运行后,输出类似于以下内容:

    TASK [redhat.ansible_on_clouds.standalone_gcp_backup : [backup_deployment] Print the variable required to restore deployment my-deployment] ***
    ok: [localhost] => {
        "msg": [
            "AAP on GCP Backup successful. Please note below the bucket name and backup name which are required for restore process.",
            "gcp_bucket_backup_name: my-bucket",
            "backup_name: aoc-backup-my-deployment-20230616T134002"
        ]
    }
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=38   changed=6    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

10.1.8. 列出备份

此 playbook 允许您列出特定存储桶中的现有备份。

流程

  1. 使用配置文件模板填充 command_generator_data 目录。

    注意

    在 Linux 上,命令生成器创建的任何文件或目录默认归 root:root 所有。要更改文件和目录的所有权,您可以在创建文件后运行 sudo chmod 命令。如需更多信息,请阅读 技术说明

    docker run --rm -v $(pwd)/command_generator_data/:/data $IMAGE command_generator_vars gcp_backup_list --output-data-file /data/backups_list.yml
  2. 运行此命令后,会创建一个 $(pwd)/command_generator_data/backups_list.yml 模板文件。此模板文件类似于以下内容:

    gcp_backup_list:
      cloud_credentials_path:
      extra_vars:
        gcp_bucket_backup_name:
  3. 要运行备份,请运行命令生成器来生成 backup 命令。

    docker run --rm -v $(pwd)/command_generator_data:/data $IMAGE command_generator gcp_backup_list --data-file /data/backups_list.yml

    会产生以下 ouput:

    -----------------------------------------------
    Command to run playbook:
    
    docker run --rm --env PLATFORM=GCP -v </path/to/gcp/service-account.json>:/home/runner/.gcp/credentials:ro \
    --env ANSIBLE_CONFIG=../gcp-ansible.cfg  $IMAGE redhat.ansible_on_clouds.gcp_backup_list \
    -e 'gcp_service_account_credentials_json_path=/home/runner/.gcp/credentials  gcp_bucket_backup_name=<bucket>'
  4. 运行提供的 backup 命令,以触发备份列表。
  5. playbook 运行后,输出类似于以下内容:

    TASK [redhat.ansible_on_clouds.standalone_gcp_backup_list : [list_backup] Display list of backups] ***
    ok: [localhost] => {
        "msg": [
            "aoc-backup-deployment1-20230614T203926",
            "aoc-backup-deployment1-20230616T114134",
            "aoc-backup-deployment1-20230616T134002",
            "aoc-backup-deployment2-20230613T124127"
        ]
    }
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=11   changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

10.1.9. 删除备份

删除备份有两个 playbook:

  • 使用 gcp_backup_delete playbook 删除单个备份。
  • 使用 gcp_backups_delete playbook 一次性删除多个备份。

gcp_backups_delete 使用字符串 ["backup1","backup2",…​] 的数组,而 gcp_backup_delete 只需要一个字符串,它是特定备份的名称 "backup1"。

本节描述了 gcp_backups_delete 的使用。

流程

  1. 使用配置文件模板填充 command_generator_data 目录。

    注意

    在 Linux 上,命令生成器创建的任何文件或目录默认归 root:root 所有。要更改文件和目录的所有权,您可以在创建文件后运行 sudo chmod 命令。如需更多信息,请阅读 命令生成器 - 由 root 拥有的 Linux 文件

    docker run --rm -v $(pwd)/command_generator_data/:/data $IMAGE command_generator_vars gcp_backups_delete --output-data-file /data/backups_delete.yml
  2. 运行此命令后,会创建一个 $(pwd)/command_generator_data/backups_delete.yml 模板文件。此模板文件类似于以下内容:

    gcp_backups_delete:
      cloud_credentials_path:
      extra_vars:
        backup_names:
        delete:
        gcp_bucket_backup_name:

backup_names 参数必须指定字符串数组,例如 ["backup1","backup2 "]。delete 参数必须设置为 true 才能成功删除。

  1. 要删除备份,请运行命令生成器来生成 gcp_backups_delete' 命令。

    docker run --rm -v $(pwd)/command_generator_data:/data $IMAGE command_generator gcp_backups_delete --data-file /data/backups_delete.yml

    会产生以下 ouput:

    -----------------------------------------------
    Command to run playbook:
    
    docker run --rm --env PLATFORM=GCP -v </path/to/gcp/service-account.json>:/home/runner/.gcp/credentials:ro \
    --env ANSIBLE_CONFIG=../gcp-ansible.cfg  $IMAGE redhat.ansible_on_clouds.gcp_backups_delete \
    -e 'gcp_service_account_credentials_json_path=/home/runner/.gcp/credentials  gcp_bucket_backup_name=<bucket> \
    backup_names=<backup_names> delete=True'
  2. 运行提供的备份命令以删除备份。
  3. playbook 运行后,输出类似于以下内容:

    TASK [redhat.ansible_on_clouds.standalone_gcp_backup_delete : [delete_backup] Dry-run message] ***
    skipping: [localhost]
    
    PLAY RECAP *********************************************************************
    localhost                  : ok=23   changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

10.1.10. 修复失败的备份删除

如果删除备份失败,请执行以下操作:

流程

  1. 导航到包含备份的存储桶。
  2. 找到具有备份名称的目录。
  3. 打开备份目录。
  4. 使用备份名称删除该目录。
  5. 删除带有 .json 扩展名的备份名称的文件。
  6. 导航到 FilestoreBackup
  7. 使用与备份相同的名称删除 Filestore 备份。