12.4. MTV 移行計画へのフックの追加
Migration Toolkit for Virtualization (MTV) 移行計画にフックを追加して、移行前または移行後に仮想マシン上で自動化の操作を実行できます。
12.4.1. MTV 移行計画のフック
MTV CLI または Red Hat OpenShift Web コンソールにある MTV ユーザーインターフェイスを使用して、Migration Toolkit for Virtualization (MTV) 移行計画にフックを追加できます。
- 移行前 フックは、プロバイダー上にある仮想マシンに対して操作を実行するフックです。これにより、仮想マシンの移行の準備が整います。
- 移行後 フックは、OpenShift Virtualization に移行した仮想マシン上で操作を実行するフックです。
12.4.1.1. デフォルトのフックイメージ
MTV フックのデフォルトのフックイメージは quay.io/kubev2v/hook-runner
です。このイメージは、Ansible Runner イメージをベースにしており、Ansible Kubernetes リソースと最新の oc
バイナリーを提供するための python-openshift
が追加されています。
12.4.1.2. フックの実行
移行フックの一部として提供される Ansible Playbook は、ConfigMap
としてフックコンテナーにマウントされます。フックコンテナーは、選択した ServiceAccount
を使用して、openshift-mtv
namespace 内の目的のクラスター上でジョブとして実行されます。
フックを追加するときは、Hook
CR が配置されている namespace、フックの名前、およびフックが移行前フックか移行後フックかを指定する必要があります。
フックを仮想マシンで実行するには、仮想マシンが起動し、SSH を使用して利用可能な状態である必要があります。
次の図は、移行フックを使用する一般的なプロセスを示しています。具体的な手順は、Red Hat OpenShift Web コンソールを使用した移行計画への移行フックの追加 および CLI を使用した移行計画への移行フックの追加 を参照してください。
図12.1 移行計画へのフックの追加

プロセス:
Ansible フックと認証情報を入力します。
UI または CLI を使用して、Ansible フックイメージを MTV コントローラーに入力します。
-
UI で、
ansible-runner
を指定し、フックを含むplaybook.yml
を入力します。 - CLI で、フックを実行する Playbook を指定するフックイメージを入力します。
-
UI で、
Pod 内で Playbook を実行するために SSH データなどの追加データが必要な場合は、仮想マシンの認証情報を含むシークレットを作成します。このシークレットは Pod にマウントされませんが、Playbook によって呼び出されます。
注記このシークレットは、ソースプロバイダーの認証情報を含む
Secret
CR とは異なります。
MTV コントローラーは、次の内容を含む
ConfigMap
を作成します。-
workload.yml
、仮想マシンに関する情報を含む。 -
playbook.yml
、実行する生の文字列 Playbook。 plan.yml
、Plan
CR。ConfigMap
には仮想マシンの名前が含まれており、Playbook に何を実行するかを指示します。
-
MTV コントローラーは、ユーザーが指定したイメージを開始するジョブを作成します。
ConfigMap
をコンテナーにマウントします。Ansible フックは、ユーザーが以前に入力したシークレットをインポートします。
ジョブは、次のように移行前フックまたは移行後フックを実行します。
- 移行前フックの場合、ジョブは SSH を使用してソースプロバイダー上の仮想マシンにログインし、フックを実行します。
- 移行後のフックの場合、ジョブは SSH を使用して OpenShift Virtualization 上の仮想マシンにログインし、フックを実行します。
12.4.2. Red Hat OpenShift Web コンソールを使用した移行計画への移行フックの追加
Red Hat OpenShift Web コンソールを使用して、既存の移行計画に移行フックを追加できます。Migration Toolkit for Virtualization (MTV) CLI で 1 つのコマンドを実行する必要があることに注意してください。
たとえば、移行前に仮想マシンに cloud-init
サービスをインストールし、ファイルを書き込むフックを作成できます。
移行計画ごとに、移行前フックを 1 つ、移行後フックを 1 つ、またはそれぞれを 1 つ実行できます。
前提条件
- 移行計画。
- 移行フックファイル。その内容をコピーして Web コンソールに貼り付けます。
-
ソースプロバイダーの
シークレット
を含むファイル。 - フックによって呼び出され、作業している namespace に対して少なくとも書き込みアクセス権がある Red Hat OpenShift サービスアカウント。
- 仮想マシンにインストールされた公開鍵を使用して移行する仮想マシンへの SSH アクセス。
- Microsoft Server 上でのみ実行されている仮想マシン: リモート実行が有効化されている。
関連情報
サービスアカウントを作成する手順は、サービスアカウントの概要および作成 を参照してください。
手順
- Red Hat OpenShift Web コンソールで、Migration > Plans for virtualization をクリックし、フックを追加する移行計画をクリックします。
- Hooks をクリックします。
移行前のフックの場合は、以下の手順を実行します。
- Pre migration hook セクションで、Enable hook スイッチを Enable pre migration hook に切り替えます。
-
Hook ランナーイメージ を入力します。
spec.playbook
を指定する場合は、ansible-runner
が含まれるイメージを使用する必要があります。 - Ansible Playbook テキストボックスにフックを YAML ファイルとして貼り付けます。
移行後のフックの場合は、以下の手順を実行します。
- Post migration hook で、Enable hook を Enable post migration hook に切り替えます。
-
Hook ランナーイメージ を入力します。
spec.playbook
を指定する場合は、ansible-runner
が含まれるイメージを使用する必要があります。 - Ansible Playbook テキストボックスにフックを YAML ファイルとして貼り付けます。
- タブの上部にある Update hooks をクリックします。
ターミナルで以下のコマンドを実行し、各フックを Red Hat OpenShift サービスアカウントに関連付けます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc -n openshift-mtv patch hook <name_of_hook> \ -p '{"spec":{"serviceAccount":"<service_account>"}}' --type merge
$ oc -n openshift-mtv patch hook <name_of_hook> \ -p '{"spec":{"serviceAccount":"<service_account>"}}' --type merge
次の移行フックの例では、SSH を使用して仮想マシンにアクセスできることを確認し、SSH 鍵を作成し、Maria データベースの停止とテキストファイルの生成の 2 つのタスクを実行します。
移行フックの例
- 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
- 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
CR を使用すると、Migration Toolkit for Virtualization (MTV) CLI を使用して、既存の移行計画に移行前フックまたは移行後フックを追加できます。
たとえば、移行前に仮想マシンに cloud-init
サービスをインストールし、ファイルを書き込むための Hook
CR を作成できます。
移行計画ごとに、移行前フックを 1 つ、移行後フックを 1 つ、またはそれぞれを 1 つ実行できます。各フックには独自の Hook
CR が必要ですが、Plan
CR には使用するすべてのフックのデータが含まれます。
k8s
モジュールを使用して、シークレットまたは ConfigMap
に保存されている追加情報を取得できます。
前提条件
- 移行計画。
- 移行フックイメージまたはフックイメージを含む Playbook。
- ソースプロバイダーのシークレットを含むファイル。
- フックによって呼び出され、作業している namespace に対して少なくとも書き込みアクセス権がある Red Hat OpenShift サービスアカウント。
- 仮想マシンにインストールされた公開鍵を使用して移行する仮想マシンへの SSH アクセス。
- Microsoft Server 上でのみ実行されている仮想マシン: リモート実行が有効化されている。
関連情報
サービスアカウントを作成する手順は、サービスアカウントの概要および作成 を参照してください。
手順
必要に応じて、仮想マシンの SSH 秘密鍵でシークレットを作成します。
- 既存のキーを選択するか、キーペアを生成します。
- 仮想マシンに公開鍵をインストールします。
シークレット内の秘密鍵を base64 でエンコードします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: v1 data: key: VGhpcyB3YXMgZ2Vu... kind: Secret metadata: name: ssh-credentials namespace: openshift-mtv type: Opaque
apiVersion: v1 data: key: VGhpcyB3YXMgZ2Vu... kind: Secret metadata: name: ssh-credentials namespace: openshift-mtv type: Opaque
ファイルを連結し、Base64 エンコード用にパイプすることで、Playbook をエンコードします。次に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat playbook.yml | base64 -w0
$ cat playbook.yml | base64 -w0
Hook CR を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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> playbook: | LS0tCi0gbm... EOF
$ 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
注記デフォルトの
hook-runner
イメージを使用するか、カスタムイメージを指定することができます。カスタムイメージを指定する場合は、Playbook を指定する必要はありません。注記アタッチされた Playbook をデコードするには、カスタム出力でリソースを取得して base64 にパイプします。以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get -n konveyor-forklift hook playbook -o \ go-template='{{ .spec.playbook }}' | base64 -d
$ oc get -n konveyor-forklift hook playbook -o \ go-template='{{ .spec.playbook }}' | base64 -d
移行の
Plan
CR で、仮想マシンごとに、CR の末尾に次のセクションを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow vms: - id: <vm_id> hooks: - hook: namespace: <namespace> name: <name_of_hook> step: <type_of_hook>
vms: - id: <vm_id> hooks: - hook: namespace: <namespace> name: <name_of_hook> step: <type_of_hook>
1 - 1
- オプションは、移行前にフックを実行する
PreHook
と、移行後にフックを実行するPostHook
です。
PreHook を仮想マシンで実行するには、仮想マシンを起動し、SSH 経由で利用できるようにする必要があります。
次の移行フックの例では、SSH を使用して仮想マシンにアクセスできることを確認し、SSH 鍵を作成し、Maria データベースの停止とテキストファイルの生成の 2 つのタスクを実行します。
移行フックの例
- 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
- 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