ノート:

Oracle Linux Automation Managerを使用したKVM仮想マシンの管理

イントロダクション

community.libvirtコレクションは、Ansible libvirtコミュニティーでサポートされているlibvirtモジュールおよびプラグインを提供します。これらのモジュールとプラグインは、libvirt APIを使用して仮想マシン(VM)とコンテナを管理するのに役立ちます。

目的

このチュートリアルでは、次の方法を学習します。

前提条件

ノート: Oracle Linux Automation ManagerまたはKVMのインストールの詳細は、この演習の最後にあるリンクを参照してください。

Oracle Linux Automation Managerのデプロイ

ノート:独自のテナンシで実行している場合は、linux-virt-labs GitHubプロジェクトREADME.mdを読み、演習環境をデプロイする前に前提条件を完了してください。

  1. Lunaデスクトップでターミナルを開きます。

  2. linux-virt-labs GitHubプロジェクトをクローニングします。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 作業ディレクトリに移動します。

    cd linux-virt-labs/olam
    
  4. 必要なコレクションをインストールします。

    ansible-galaxy collection install -r requirements.yml
    
  5. Oracle Linuxインスタンス構成を更新します。

    cat << EOF | tee instances.yml > /dev/null
    compute_instances:
      1:
        instance_name: "olam-node"
        type: "control"
      2:
        instance_name: "git-server"
        type: "server"
      3:
        instance_name: "kvm-server"
        type: "server"
    passwordless_ssh: true
    use_git: true
    use_kvm: true
    EOF
    
  6. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -e ansible_python_interpreter="/usr/bin/python3.6" -e "@instances.yml"
    

    無料のラボ環境では、Oracle Cloud Infrastructure SDK for Python用のRPMパッケージをインストールするため、追加の変数ansible_python_interpreterが必要です。このパッケージのインストール場所は、python3.6モジュールの下にあります。

    デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUまたはOracle Linux 9を使用するには、デプロイメント・コマンドに-e instance_shape="VM.Standard3.Flex"または-e os_version="9"を追加します。

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。Oracle Linux Automation Managerのインストールはプレイブックのこの段階で完了し、インスタンスの準備ができました。デプロイするノードのパブリックIPアドレスとプライベートIPアドレスを出力する前の再生に注意してください。

プレイブックの作成

  1. 新しいターミナル・ウィンドウを開きます。

  2. リモートgitサーバー・インスタンスに変数を設定します。

    export REMOTE=<ip_address_of_instance>
    
  3. プロジェクト・ディレクトリを作成します。

    mkdir ~/olamkvm
    
  4. 要件ファイルを作成します。

    Oracle Linux Automation Engineは、要件ファイルを使用して、必要なコレクションまたはロールを実行時にプロジェクトにプルします。

    cat << EOF > ~/olamkvm/requirements.yml 
    ---
    collections:
      - name: community.libvirt
      - name: community.general
      - name: community.crypto
    EOF
    
  5. 変数ファイルを作成します。

    このファイルには、変数とそのデフォルト値が格納されます。プレイブックは実行時にこのファイルをインポートします。

    1. ファイルを格納するディレクトリを作成します。

      mkdir ~/olamkvm/vars
      
    2. ファイルを作成します。

      cat << EOF > ~/olamkvm/vars/defaults.yml
      ---
      username: oracle
      base_image_name: OL9U5_x86_64-kvm-b253.qcow2
      base_image_url: https://yum.oracle.com/templates/OracleLinux/OL9/u5/x86_64/
      base_image_sha: 3b00bbbefc8e78dd28d9f538834fb9e2a03d5ccdc2cadf2ffd0036c0a8f02021
      libvirt_pool_dir: "/var/lib/libvirt/images"
      vm_name: ol9-dev
      vm_vcpus: 2
      vm_ram_mb: 2048
      vm_net: default
      vm_root_pass: 
      cleanup_tmp: no 
      EOF
      
  6. cloud-initテンプレートを作成します。

    これらのテンプレートは、cloud-init経由で VM構成をプロビジョニングするために、meta-dataおよび user-dataファイルを作成します。

    1. テンプレートを格納するディレクトリを作成します。

      mkdir ~/olamkvm/templates
      
    2. メタデータ・テンプレートを作成します。

      cat << EOF > ~/olamkvm/templates/meta-data.j2
      instance-id: iid-local01
      local-hostname: 
      EOF
      
    3. ユーザー・データ・テンプレートを作成します。

      cat << EOF > ~/olamkvm/templates/user-data.j2
      #cloud-config
      
      system_info:
        default_user:
          name: opc
      
      ssh_authorized_keys:
        - 
      EOF
      
  7. libvirt VM定義テンプレートを作成します。

    cat << EOF > ~/olamkvm/templates/vm-template.xml.j2
    <domain type="kvm">
      <name></name>
      <memory unit='MiB'></memory>
      <vcpu placement='static'></vcpu>
      <os>
        <type arch="x86_64" machine="q35">hvm</type>
        <boot dev="hd"/>
      </os>
      <features>
        <acpi/>
        <apic/>
      </features>
      <cpu mode="host-model"/>
      <clock offset="utc">
        <timer name="rtc" tickpolicy="catchup"/>
        <timer name="pit" tickpolicy="delay"/>
        <timer name="hpet" present="no"/>
      </clock>
      <pm>
        <suspend-to-mem enabled="no"/>
        <suspend-to-disk enabled="no"/>
      </pm>
      <devices>
        <emulator>/usr/libexec/qemu-kvm</emulator>
        <disk type="file" device="disk">
          <driver name="qemu" type="qcow2"/>
          <source file="/.qcow"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <disk type="file" device="cdrom">
          <driver name="qemu" type="raw"/>
          <source file="/.iso"/>
          <target dev="sda" bus="sata"/>
          <readonly/>
        </disk>
        <controller type="usb" model="qemu-xhci" ports="15"/>
        <interface type="network">
          <source network=""/>
          <model type="virtio"/>
        </interface>
        <console type="pty"/>
        <channel type="unix">
          <source mode="bind"/>
          <target type="virtio" name="org.qemu.guest_agent.0"/>
        </channel>
        <memballoon model="virtio"/>
        <rng model="virtio">
          <backend model="random">/dev/urandom</backend>
        </rng>
      </devices>
    </domain>
    EOF
    
  8. プレイブックを作成します。

    このプレイブックでは、KVMサーバーに既存のVMを問い合せて、新しいOracle Linux Cloud Imageをデプロイします。

    cat << EOF > ~/olamkvm/create_vm.yml
    ---
    - name: Create vm with community.libvirt collection
      hosts: kvm
      become: true
    
      vars_files:
        - vars/defaults.yml
    
      tasks:
    
      - name: Add python lxml module required by libvirt ansible module
        ansible.builtin.dnf:
          name: python3-lxml
          state: present
    
      - name: Get list of existing VMs
        community.libvirt.virt:
          command: list_vms
        register: existing_vms
        changed_when: false
    
      - name: Print list of existing VMs
        ansible.builtin.debug:
          var: existing_vms
    
      - name: Create VM when not exist
        when: ( vm_name not in existing_vms.list_vms )
        block:
    
        - name: Download base image
          ansible.builtin.get_url:
            url: ""
            dest: "/tmp/"
            checksum: "sha256:"
            mode: "0664"
    
        - name: Copy base image to libvirt directory
          ansible.builtin.copy:
            dest: "/.qcow"
            src: "/tmp/"
            force: false
            remote_src: true 
            owner: qemu
            group: qemu
            mode: "0660"
          register: copy_results
    
        - name: Generate a vm ssh keypair
          community.crypto.openssh_keypair:
            path: ~/.ssh/id_rsa
            size: 2048
            comment: vm ssh keypair
          register: vm_ssh_keypair
          become: true
          become_user: ""
    
        - name: Create vm meta-data
          ansible.builtin.template:
            src: templates/meta-data.j2
            dest: "~/meta-data"
            mode: "0664"
          become_user: ""
    
        - name: Read the vm ssh private key
          ansible.builtin.slurp:
            src: "~/.ssh/id_rsa.pub"
          register: vm_ssh_private_key
          become: true
          become_user: ""
    
        - name: Create var for private key
          ansible.builtin.set_fact:
            vm_private_key: ""
    
        - name: Create vm user-data
          ansible.builtin.template:
            src: templates/user-data.j2
            dest: ~/user-data
            mode: "0664"
          become: true
          become_user: ""
    
        - name: Generate iso containing cloud-init configuration
          ansible.builtin.shell: |
            genisoimage -output /tmp/.iso -volid cidata -joliet -rock ~/user-data ~/meta-data
          become: true
          become_user: ""
          register: generate_iso
          changed_when: generate_iso.rc == 0
    
        - name: Copy vm iso image to libvirt directory
          ansible.builtin.copy:
            dest: "/.iso"
            src: "/tmp/.iso"
            force: false
            remote_src: true 
            owner: qemu
            group: qemu
            mode: "0660"
    
        - name: Remove vm iso image from tmp
          ansible.builtin.file:
            path: "/tmp/.iso"
            state: absent
    
        - name: Define the vm
          community.libvirt.virt:
            command: define
            xml: ""
    
      - name: Start the vm
        community.libvirt.virt:
          name: ""
          state: running
        register: vm_start_results
        until: "vm_start_results is success"
        retries: 15
        delay: 2
    
      - name: Remove the temporary file
        ansible.builtin.file:
          path: "/tmp/"
          state: absent
        when: cleanup_tmp | bool
    EOF
    

ソース・コントロールへのプロジェクトの追加

  1. プロジェクトの作業ディレクトリをGitリポジトリに初期化します。

    リポジトリを初期化する前に、Gitの初回設定ステップを実行する必要があります。

    1. プロジェクトの初期化時に使用されるデフォルトのブランチ名を設定します。

      git config --global init.defaultBranch main
      
    2. アイデンティティを設定します。

      このチュートリアルでは、電子メールと名前の例を示します。プロジェクトで作業するときは、Eメールと名前を使用します。この情報は各コミットに没頭してまとめられます。

      git config --global user.email johndoe@example.com
      git config --global user.name "John Doe"
      
    3. プロジェクトの作業ディレクトリに移動します。

      cd ~/olamkvm
      
    4. ディレクトリをローカルのGitリポジトリとして初期化します。

      git init
      

      このコマンドは、空のGitリポジトリを初期化したことを返します。

  2. 作業ディレクトリおよびプロジェクト・ステージング領域の状態を確認します。

    git status
    

    ローカルリポジトリの状態は、追跡されていない2つのファイル create_vm.ymlrequirements.yml、およびディレクトリ varstemplatesを示します。

  3. ステージング領域に新しいファイルを追加して追跡します。

    git add --all
    

    --allオプションは、追跡されていないファイルや変更されたファイルをすべてステージング領域に追加します。

  4. ステージング領域に現在ある変更をコミットします。

    git commit -m 'initial commit'
    

    -mオプションを使用すると、コミットされた変更にコメントを追加できます。

  5. リモートGitリポジトリを作成して初期化します。

    リモート・リポジトリは、すべてのプロジェクト・コントリビュータによって使用される共有リポジトリであり、GitHubや自己ホスト・サーバーなどのコード・ホスティング・サービスに格納されます。

    ssh git@$REMOTE "git init -b main --bare /git-server/repos/olamkvm.git"
    

    -bオプションは、mainというブランチを使用してリモートリポジトリを確実に初期化します。

  6. yesと入力して、ECDSAキー・フィンガープリントを受け入れます。

  7. 新しいリモート・リポジトリ接続レコードを追加します。

    ローカル・リポジトリにリモート接続を追加すると、Gitコマンドの名前付きショートカットとして使用できます。

    git remote add origin git@$REMOTE:/git-server/repos/olamkvm.git
    

    コロンの後のパスは、リモートGitサーバー上のリポジトリのディレクトリの場所です。

  8. 新しく追加された接続レコードを確認します。

    git remote -v
    

    出力には、git fetchコマンドとgit pushコマンドの両方のリモートGitリポジトリの場所を指す接続レコードoriginが表示されます。

  9. ローカルリポジトリの変更をリモートリポジトリにプッシュします。

    git push origin main
    

    Oracle Linux Automation Managerプロジェクト内でolamkvmソースを使用できるようになりました。

Ansible Galaxy資格証明の作成

これらの資格証明により、Oracle Linux Automation Managerは、パブリックAnsible Galaxy HubからOCI Ansibleコレクションをプルできます。

  1. 新しいターミナル・ウィンドウを開き、olam-nodeインスタンスへのSSHトンネルを構成します。

    ssh -L 8444:localhost:443 oracle@<ip_address_of_instance>
    
  2. Webブラウザを開き、URLを入力します。

    https://localhost:8444
    

    ノート:使用するブラウザに基づいてセキュリティ警告を承認します。Chromeブラウザで、「詳細」ボタンをクリックし、「localhostに進む(安全でない)」リンクをクリックします。

  3. Oracle Linux Automation Manager WebUIにログインします。自動デプロイメント中に作成されたユーザー名adminおよびパスワードadminを使用します。

    olam2- ログイン

  4. ログインに成功すると、WebUIが表示されます。

    olam2-webui

  5. ナビゲーション・メニューの「リソース」セクションの下の「資格証明」をクリックします。

  6. 「追加」ボタンをクリックします。

  7. 特定のフィールドに次の値を入力または選択します。

    検索または値リストのあるフィールドでは、要求された値の入力を開始してから選択できます。

    • 名前: My Ansible Galaxy
    • 組織: Default
    • 資格証明タイプ: Ansible Galaxy/Automation Hub APIトークン

    Oracle Linux Automation Managerは、Ansible Galaxy資格証明を使用して、ansible-galaxyコマンドを使用してロールおよびコレクションをダウンロードできるようにします。

    • GalaxyサーバーURL: https://galaxy.ansible.com

    olam2-ansible-galaxy-creds

  8. エントリを確認し、「保存」ボタンをクリックします。

  9. ナビゲーション・メニューの「アクセス」セクションの下にある「組織」をクリックします。

    組織内でAnsible Galaxy資格証明を割り当てると、gitプロジェクト内からOracle Linux Infrastructure Ansibleコレクションをダウンロードできます。

  10. 「デフォルト」組織をクリックし、「編集」ボタンをクリックします。

  11. 「銀河資格証明」フィールドで検索オプションを選択します。

  12. 「ギャラクシー資格証明の選択」ポップアップ・ダイアログで「My Ansible Galaxy」を選択し、「選択」ボタンをクリックします。

  13. 確認して、「保存」ボタンをクリックします。

    olam2-ansible-galaxy-org

マシン資格証明の作成

これらの資格証明により、Oracle Linux Automation ManagerはSSHを介してKVM仮想化システムに接続できます。

  1. ナビゲーション・メニューの「リソース」の下にある「資格証明」をクリックします。

  2. 「追加」ボタンをクリックします。

  3. 特定のフィールドに次の値を入力または選択します。

    検索または値リストのあるフィールドでは、要求された値の入力を開始してから選択できます。

    • 名前: My KVM Server
    • 組織: Default
    • 資格証明タイプ: マシン

    Oracle Linux Automation Managerは、マシン資格証明を使用して、ホストへのSSH接続を確立する際に必要な情報を設定します。

    ページがリフレッシュされ、「タイプ詳細」がリクエストされます。

  4. 「ユーザー名」を入力します

    • ユーザー名: oracle

    olam2-machine-creds

  5. SSH秘密キーの「参照」ボタンをクリックします。

    「ファイルを開く」ウィンドウが表示されたダイアログボックスが表示されます。

  6. 「ファイルを開く」ウィンドウの中央パネルを右クリックし、ポップアップ・ダイアログ・ボックスで「非表示ファイルの表示」を選択します。

    olam2-open-file

  7. 中央パネルの任意の場所をクリックして、ダイアログボックスを閉じます。

  8. 「ファイルを開く」ウィンドウの左側にあるナビゲーション・メニューの「ホーム」の場所をクリックします。

  9. リスト内の .sshフォルダをダブルクリックし、id_rsaファイルをダブルクリックします。

    このアクションにより、id_rsaファイルの内容が SSH Private Keyフィールドにコピーされます。

  10. エントリを確認し、最下部までスクロールして「保存」ボタンをクリックします。

インベントリの作成

  1. ナビゲーション・メニューの「在庫」をクリックします。

  2. 「追加」ボタンをクリックし、値のドロップダウン・リストから「在庫の追加」を選択します。

  3. 特定のフィールドに次の値を入力または選択します。

    • 名前: KVM Servers
    • インスタンス・グループ: controlplane
  4. 確認して、「保存」ボタンをクリックします。

    olam2-inv

インベントリへのグループの追加

インベントリ内のグループは、特定のタスクのホスト・セットを制御できるホストまたは他のグループの分類です。

  1. KVMサーバーの「詳細」ページで「グループ」タブをクリックします。

    olam2-inv-kvm- 詳細

  2. 「追加」ボタンをクリックします。

  3. 特定のフィールドに次の値を入力または選択します。

    • 名前: kvm
  4. 確認して、「保存」ボタンをクリックします。

    olam2-kvm-group-details

インベントリ・グループへのホストの追加

  1. kvmの「グループ詳細」ページで「ホスト」タブをクリックします。

    olam2-kvm-group-details

  2. 「追加」ボタンをクリックし、値のドロップダウン・リストから「新規ホストの追加」を選択します。

  3. 特定のフィールドに次の値を入力または選択します。

    • 名前: kvm-serverホストのパブリックIPアドレスを使用します。
  4. 確認して、「保存」ボタンをクリックします。

    olam2-grp-new-host

在庫グループのPing

pingモジュールを使用して、Oracle Linux Automationがインベントリ・グループ内のホストに接続できることを確認します。

  1. ブレッドクラムを使用して、「KVMサーバー」をクリックします。

  2. 「グループ」タブをクリックします。

  3. kvmグループの横にあるボックスを選択し、「コマンドの実行」ボタンをクリックします。

    「コマンドの実行」ポップアップ・ダイアログが表示されます。

  4. pingモジュールを選択し、「Next」ボタンをクリックします。

  5. 「OLAM EE (2.2)」実行環境を選択し、「次へ」ボタンをクリックします。

  6. 「マイKVMサーバー」マシン資格証明を選択し、「次へ」ボタンをクリックします。

  7. 「起動」ボタンを確認してクリックします。

    ジョブが起動し、pingモジュールからの出力が表示されます。

    olam2-kvm-grp-ping

ソース・コントロール資格証明の追加

  1. ナビゲーション・メニューの「資格証明」をクリックします。

  2. 「追加」ボタンをクリックします。

  3. 特定のフィールドに次の値を入力または選択します。

    • 名前: Git Server
    • 組織: Default
    • 資格証明タイプ: ソース管理

    olam2-git-cred1

    ページがリフレッシュされ、「タイプ詳細」がリクエストされます。

  4. 「ユーザー名」を入力します

    • ユーザー名: git
  5. SCM秘密キーを入力します

    「参照」ボタンをクリックし、id_rsaファイルをダブルクリックします。このアクションにより、キーの内容が「SCM秘密キー」フィールドにコピーされます。

    olam2-git-cred2

  6. 確認して、「保存」ボタンをクリックします。

    olam2-git-cred3

プロジェクトの作成

  1. ナビゲーション・メニューの「プロジェクト」をクリックします。

  2. 「追加」ボタンをクリックします。

  3. 特定のフィールドに次の値を入力または選択します。

    • 名前: My Project
    • 実行環境: OLAM EE (2.2)
    • ソース・コントロール資格証明タイプ: Git

    olam2-proj1

    ページがリフレッシュされ、「タイプ詳細」がリクエストされます。

  4. git-serverのリモートURLを入力します。

    • ソース・コントロールURL: git@<ip_address_of_instance>:/git-server/repos/olamkvm.git
  5. 「ソース・コントロール資格証明」「Gitサーバー」を選択します。

  6. 確認して、「保存」ボタンをクリックします。

    olam2-proj2

  7. プロジェクト同期ステータスをレビューします。

    プロジェクトの作成後、同期の開始時にプロジェクトのステータスが「詳細」サマリーに表示されます。構成が正しく、Gitサーバーにアクセスできる場合、ステータスは「実行中」から「成功」に遷移します。

    olam2-proj-sync

ジョブ・テンプレートの作成

  1. ナビゲーション・メニューの「テンプレート」をクリックします。

  2. 「追加」ボタンをクリックし、値のドロップダウン・リストから「ジョブ・テンプレートの追加」を選択します。

  3. 必要な値を入力してください。

    • 名前: My Template
    • ジョブ・タイプ: 実行
    • インベントリ: KVMサーバー
    • プロジェクト: マイ・プロジェクト
    • 実行環境: OLAM EE (2.2)
    • プレイブック: create_vm.yml
    • 資格証明: My KVM Server

    olam2-temp1

  4. 確認し、下にスクロールして、「保存」ボタンをクリックします。

    olam2-temp2

  5. テンプレートを起動します。

    「起動」ボタンをクリックして、テンプレート・サマリー・ページからジョブを起動します。

    olam2- 一時起動

    成功すると、ジョブが起動し、テンプレートからの出力が表示されます。標準出力はプレイブックの実行を示し、プレイブックの結果を出力します。

    olam2-temp-output

仮想マシンの作成の検証

  1. 端末を開き、ssh経由でkvm-serverノードに接続します。

    ssh oracle@<ip_address_of_instance>
    
  2. 実行中のVMのリストを取得します。

    sudo virsh list
    

    出力例:

    [oracle@kvm-server ~]$ sudo virsh list
     Id   Name      State
    -------------------------
     1    ol9-dev   running
    
  3. ol9-dev VMのIPアドレスを取得します。

    sudo virsh net-dhcp-leases default
    

    出力例:

    [oracle@kvm-server ~]$ sudo virsh net-dhcp-leases default
     Expiry Time           MAC address         Protocol   IP address           Hostname   Client ID or DUID
    ------------------------------------------------------------------------------------------------------------
     2023-04-06 18:59:33   52:54:00:6e:93:07   ipv4       192.168.122.167/24   ol9-dev    01:52:54:00:6e:93:07
    
  4. VMに接続します。

    ssh opc@$(sudo virsh -q domifaddr ol9-dev | awk '{print substr($4, 1, length($4)-3)}')
    

    -qは、virshコマンドの出力からヘッダーを削除します。awkは、virsh domifaddrコマンドから4番目の列を取り出し、substr()は最後の3文字を削除します。

  5. VMから切断します。

    exit
    

(オプション)別の仮想マシンの作成

プレイブックでは、vm_name変数を変更して別のVMを作成できます。

  1. Oracle Linux Automation Manager WebUIを含むブラウザ・ウィンドウに切り替えて、必要に応じてログインします。

  2. ナビゲーション・メニューの「テンプレート」をクリックします。

  3. 「My Template」「Edit Template」アイコンをクリックします。

    olam2-temp-edit

  4. ol9-newの値を持つ変数vm_name「変数」セクションに追加します。

    olam2-temp-vars

  5. 下にスクロールして、「保存」ボタンをクリックします。

  6. テンプレートを起動します。

  7. 仮想マシンの検証ステップを繰り返し、新しく作成したVMに接続します。

次のステップ

Oracle Linux Automation Managerのジョブ出力の成功と仮想マシンへのSSH機能により、すべてが機能することが確認されます。community.libvirtコレクションをさらに試し、Oracle Linux KVM内に仮想マシンを作成してインフラストラクチャを拡張します。次に、それらの仮想マシンに追加のプレイブックをプロビジョニングしようとします。Oracle Linuxトレーニング・ステーションで追加のトレーニングを確認してください。

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。