12.4. 在 MTV 迁移计划中添加 hook


您可以在 Migration Toolkit for Virtualization (MTV)迁移计划中添加 hook,以便在迁移之前或之后在虚拟机上执行自动操作。

12.4.1. 关于 MTV 迁移计划的 hook

您可以使用 MTV CLI 或 MTV 用户界面在 Red Hat OpenShift web 控制台中为 Virtualization (MTV)迁移计划添加 hook。

  • 预迁移 hook 是 hook,可在位于供应商的虚拟机上执行操作。这会为迁移准备虚拟机。
  • 迁移后 hook 是在迁移到 OpenShift Virtualization 的虚拟机上执行操作的 hook。

12.4.1.1. 默认 hook 镜像

MTV hook 的默认 hook 镜像是 quay.io/kubev2v/hook-runner。镜像基于 Ansible Runner 镜像,并添加 python-openshift,以提供 Ansible Kubernetes 资源和最新的 oc 二进制文件。

12.4.1.2. hook 执行

作为迁移 hook 的一部分提供的 Ansible playbook 作为 ConfigMap 挂载到 hook 容器中。hook 容器使用您选择的 ServiceAccountopenshift-mtv 命名空间中的所需集群中作为作业运行。

添加 hook 时,您必须指定 Hook CR 所在的命名空间、hook 的名称,以及 hook 是否为 pre-migration hook 或 post-migration hook。

重要

要让 hook 在虚拟机上运行,必须使用 SSH 启动虚拟机并可用。

下图显示了使用迁移 hook 的一般过程。具体步骤请参阅 使用 Red Hat OpenShift Web 控制台将迁移 hook 添加到迁移计划中,并使用 CLI 将迁移 hook 添加到迁移计划中

图 12.1. 在迁移计划中添加 hook

在迁移计划中添加 hook

Process:

  1. 输入您的 Ansible hook 和凭证。

    1. 使用 UI 或 CLI 将 Ansible hook 镜像输入到 MTV 控制器。

      • 在 UI 中,指定 ansible-runner 并输入包含 hook 的 playbook.yml
      • 在 CLI 中,输入 hook 镜像,该镜像指定运行 hook 的 playbook。
    2. 如果您需要额外数据在 pod 中运行 playbook (如 SSH 数据),请创建一个包含虚拟机凭证的 Secret。Secret 不挂载到 pod,而是由 playbook 调用。

      注意

      此 Secret 与包含源供应商凭证的 Secret CR 不同。

  2. MTV 控制器创建 ConfigMap,其中包含:

    • workload.yml,其中包含有关虚拟机的信息。
    • playbook.yml,这是您要执行的原始字符串 playbook。
    • plan.yml,即 Plan CR。

      ConfigMap 包含虚拟机的名称,并指示 playbook 执行的操作。

  3. MTV 控制器会创建一个启动用户指定镜像的作业。

    1. ConfigMap 挂载到容器。

      Ansible hook 导入之前输入的用户的 Secret。

  4. 该作业运行迁移前 hook 或迁移后 hook,如下所示:

    1. 对于 pre-migration hook,作业会使用 SSH 登录到源供应商上的虚拟机,并运行 hook。
    2. 对于迁移后 hook,作业使用 SSH 登录到 OpenShift Virtualization 上的虚拟机,并运行 hook。

12.4.2. 使用 Red Hat OpenShift Web 控制台在迁移计划中添加迁移 hook

您可以使用 Red Hat OpenShift Web 控制台将迁移 hook 添加到现有迁移计划中。请注意,您需要在 Migration Toolkit for Virtualization (MTV) CLI 中运行一个命令。

例如,您可以创建一个 hook 来在虚拟机上安装 cloud-init 服务,并在迁移前写入文件。

注意

您可以运行一个预迁移 hook、一个迁移后 hook 或每个迁移计划之一。

先决条件

  • 迁移计划
  • 迁移 hook 文件,其中包含您复制的内容并粘贴到 web 控制台中
  • 包含源供应商的 Secret 的文件
  • 由 hook 调用的 Red Hat OpenShift 服务帐户,并且至少对您正在使用的命名空间具有写入访问权限
  • 使用在虚拟机上安装的公钥迁移的虚拟机的 SSH 访问
  • 仅在 Microsoft Server 上运行的虚拟机:启用远程执行

其他资源

有关创建服务帐户的说明,请参阅 了解并创建服务帐户

流程

  1. 在 Red Hat OpenShift web 控制台中,点 Migration > Plans for virtualization,然后点击您要将 hook 添加到的迁移计划。
  2. Hook
  3. 对于 pre-migration hook,请执行以下步骤:

    1. Pre migration hook 部分中,将 Enable hook 开关切换为 Enable pre migration hook
    2. 输入 Hook 运行程序镜像。如果要指定 spec.playbook,则需要使用具有 ansible-runner 的镜像。
    3. 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
  4. 对于迁移后 hook,请执行以下步骤:

    1. Post migration hook 中,切换 Enable hook 开关 启用后迁移 hook
    2. 输入 Hook 运行程序镜像。如果要指定 spec.playbook,则需要使用具有 ansible-runner 的镜像。
    3. 将 hook 粘贴到 Ansible playbook 文本框中的 YAML 文件。
  5. 在选项卡的顶部,单击 Update hook
  6. 在终端中,输入以下命令将每个 hook 与 Red Hat OpenShift 服务帐户关联:

    $ oc -n openshift-mtv patch hook <name_of_hook> \
      -p '{"spec":{"serviceAccount":"<service_account>"}}' --type merge

以下迁移 hook 示例确保可以使用 SSH 访问虚拟机,创建 SSH 密钥并运行 2 个任务:停止 Maria 数据库并生成文本文件。

迁移 hook 示例

- name: Main
  hosts: localhost
  vars_files:
    - plan.yml
    - workload.yml
  tasks:
  - k8s_info:
      api_version: v1
      kind: Secret
      name: privkey
      namespace: openshift-mtv
    register: ssh_credentials

  - name: Ensure SSH directory exists
    file:
      path: ~/.ssh
      state: directory
      mode: 0750

  - name: Create SSH key
    copy:
      dest: ~/.ssh/id_rsa
      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      mode: 0600

  - add_host:
      name: "{{ vm.ipaddress }}"  # ALT "{{ vm.guestnetworks[2].ip }}"
      ansible_user: root
      groups: vms

- hosts: vms
  vars_files:
    - plan.yml
    - workload.yml
  tasks:
  - name: Stop MariaDB
    service:
      name: mariadb
      state: stopped

  - name: Create Test File
    copy:
      dest: /premigration.txt
      content: "Migration from {{ provider.source.name }}
                of {{ vm.vm1.vm0.id }} has finished\n"
      mode: 0644

12.4.3. 使用 CLI 在迁移计划中添加迁移 hook

您可以使用 Hook CR 使用 Migration Toolkit for Virtualization (MTV) CLI 将 pre-migration hook 或 post-migration hook 添加到现有迁移计划中。

例如,您可以创建一个 Hook CR 来在虚拟机上安装 cloud-init 服务,并在迁移前写入文件。

注意

您可以运行一个预迁移 hook、一个迁移后 hook 或每个迁移计划之一。每个 hook 需要自己的 Hook CR,但 Plan CR 包含它所使用的所有 hook 的数据。

注意

您可以使用 k8s 模块检索存储在 secret 或 ConfigMap 中的附加信息。

先决条件

  • 迁移计划
  • 迁移 hook 镜像或包含 hook 镜像的 playbook
  • 包含源供应商的 Secret 的文件
  • 由 hook 调用的 Red Hat OpenShift 服务帐户,并且至少对您正在使用的命名空间具有写入访问权限
  • 使用在虚拟机上安装的公钥迁移的虚拟机的 SSH 访问
  • 仅在 Microsoft Server 上运行的虚拟机:启用远程执行

其他资源

有关创建服务帐户的说明,请参阅 了解并创建服务帐户

流程

  1. 如果需要,为虚拟机创建一个具有 SSH 私钥的 Secret。

    1. 选择现有密钥或生成密钥对。
    2. 在虚拟机上安装公钥。
    3. 将 Secret 中的私钥编码为 base64。

      apiVersion: v1
      data:
        key: VGhpcyB3YXMgZ2Vu...
      kind: Secret
      metadata:
        name: ssh-credentials
        namespace: openshift-mtv
      type: Opaque
  2. 通过串联一个文件并以 Base64 编码方式对 playbook 进行编码,例如:

    $ cat playbook.yml | base64 -w0
  3. 创建 Hook CR:

    $  cat << EOF | oc apply -f -
    apiVersion: forklift.konveyor.io/v1beta1
    kind: Hook
    metadata:
      name: <hook>
      namespace: <namespace>
    spec:
      image: quay.io/kubev2v/hook-runner
      serviceAccount:<service account> 1
      playbook: |
        LS0tCi0gbm... 2
    EOF
    1
    (可选)Red Hat OpenShift 服务帐户。如果要操作集群的任何资源,则必须提供 serviceAccount
    2
    base64 编码的 Ansible Playbook.如果指定了 playbook,镜像 必须包含 ansible-runner
    注意

    您可以使用默认 hook-runner 镜像或指定自定义镜像。如果指定自定义镜像,则不需要指定 playbook。

    注意

    要解码附加的 playbook,请使用自定义输出检索资源,并将其传送到 base64。例如:

    $ oc get -n konveyor-forklift hook playbook -o \
        go-template='{{ .spec.playbook }}' | base64 -d
  4. 在迁移的 Plan CR 中,对于每个虚拟机,请在 CR 的末尾添加以下部分:

      vms:
        - id: <vm_id>
          hooks:
            - hook:
                namespace: <namespace>
                name: <name_of_hook>
              step: <type_of_hook> 1
    1
    选项是 PreHook,可在迁移前运行 hook,以及 PostHook 以在迁移后运行 hook。
重要

为了在虚拟机上运行 PreHook,必须通过 SSH 启动并可使用虚拟机。

以下迁移 hook 示例确保可以使用 SSH 访问虚拟机,创建 SSH 密钥并运行 2 个任务:停止 Maria 数据库并生成文本文件。

迁移 hook 示例

- name: Main
  hosts: localhost
  vars_files:
    - plan.yml
    - workload.yml
  tasks:
  - k8s_info:
      api_version: v1
      kind: Secret
      name: privkey
      namespace: openshift-mtv
    register: ssh_credentials

  - name: Ensure SSH directory exists
    file:
      path: ~/.ssh
      state: directory
      mode: 0750

  - name: Create SSH key
    copy:
      dest: ~/.ssh/id_rsa
      content: "{{ ssh_credentials.resources[0].data.key | b64decode }}"
      mode: 0600

  - add_host:
      name: "{{ vm.ipaddress }}"  # ALT "{{ vm.guestnetworks[2].ip }}"
      ansible_user: root
      groups: vms

- hosts: vms
  vars_files:
    - plan.yml
    - workload.yml
  tasks:
  - name: Stop MariaDB
    service:
      name: mariadb
      state: stopped

  - name: Create Test File
    copy:
      dest: /premigration.txt
      content: "Migration from {{ provider.source.name }}
                of {{ vm.vm1.vm0.id }} has finished\n"
      mode: 0644

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat, Inc.