注意:

使用 Oracle Linux Automation Manager 管理 KVM 虚拟机

简介

community.libvirt 集合提供了 Ansible libvirt 社区支持的 libvirt 模块和插件。这些模块和插件有助于使用 libvirt API 管理虚拟机 (virtual machine,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"
    

    免费实验室环境需要额外的变量 ansible_python_interpreter,因为它为 Oracle Cloud Infrastructure SDK for Python 安装了 RPM 程序包。此软件包安装的位置位于 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 地址。

创建手册

  1. 打开一个新的终端窗口。

  2. 将变量设置为远程 git-server 实例。

    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 模板。

    这些模板创建 meta-datauser-data 文件,以通过 cloud-init 预配 VM 配置。

    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. 设置您的身份。

      电子邮件和名称是本教程中的示例。在处理项目时使用您的电子邮件和名称,因为这些信息会不可变地包含在每次提交中。

      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
    

    本地系统信息库的状态指示两个未跟踪的文件(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 fetchgit push 命令的远程 Git 系统信息库位置的连接记录 origin

  9. 将本地系统信息库更改推送到远程系统信息库。

    git push origin main
    

    现在可以在 Oracle Linux Automation Manager 项目中使用 olamkvm 源。

创建 Ansible Galaxy 身份证明

这些凭据允许 Oracle Linux Automation Manager 从公共 Ansible Galaxy Hub 中提取 OCI Ansible Collection。

  1. 打开新终端窗口并配置指向 olam-node 实例的 SSH 隧道。

    ssh -L 8444:localhost:443 oracle@<ip_address_of_instance>
    
  2. 打开 Web 浏览器并输入 URL。

    https://localhost:8444
    

    注:根据使用的浏览器批准安全警告。对于 Chrome 浏览器,单击 Advanced(高级)按钮,然后单击 Proceed to localhost (unsafe) 链接。

  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 Server URL :https://galaxy.ansible.com

    olam2-ansible-galaxy-creds

  8. 查看条目并单击保存按钮。

  9. 单击导航菜单中访问部分下的组织

    通过在组织内分配 Ansible Galaxy 凭证,可以从 git 项目内下载 Oracle Linux Infrastructure Ansible Collection。

  10. 单击默认组织,然后单击编辑按钮。

  11. Galaxy Credentials(Galaxy 身份证明)字段中选择搜索选项。

  12. Select My Ansible Galaxy in the Select Galaxy Credentials pop-up dialogand click the Select button.

  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- 计算机贷项

  5. 单击 SSH 私有密钥的浏览按钮。

    此时将显示一个对话框,其中显示了 "Open File"(打开文件)窗口。

  6. 在 "Open File"(打开文件)窗口的中央面板中右键单击,然后在弹出对话框中选择 Show Hidden Files(显示隐藏的文件)

    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 Servers Details(KVM 服务器详细信息)页面上的 Groups(组)选项卡。

    olam2-inv-kvm- 详细信息

  2. 单击添加按钮。

  3. 在特定字段中输入或选择下列值。

    • 名称kvm
  4. 复查并单击保存按钮。

    olam2-kvm-group-details

将主机添加到清单组

  1. 单击 kvm 组详细信息页上的主机选项卡。

    olam2-kvm-group-details

  2. 单击 Add(添加)按钮,然后从值下拉列表中选择 Add new host(添加新主机)

  3. 在特定字段中输入或选择下列值。

    • 名称:使用 kvm-server 主机的公共 IP 地址。
  4. 复查并单击保存按钮。

    olam2-grp-new-host

Ping 库存组

使用 ping 模块验证 Oracle Linux Automation 是否可以连接到清单组中的主机。

  1. 使用面包屑并单击 KVM 服务器

  2. 单击选项卡。

  3. 选中 kvm 组旁边的框并单击 Run Command 按钮。

    此时将显示 Run Command(运行命令)弹出对话框。

  4. 选择 ping 模块并单击 Next 按钮。

  5. 选择 OLAM EE (2.2) 执行环境,然后单击 Next 按钮。

  6. 选择 My KVM Server 计算机身份证明,然后单击 Next 按钮。

  7. 复查并单击启动按钮。

    作业启动并显示 ping 模块的输出。

    olam2-kvm-grp-ping

添加源控件身份证明

  1. 单击导航菜单中的身份证明

  2. 单击添加按钮。

  3. 在特定字段中输入或选择下列值。

    • 名称Git Server
    • 组织Default
    • 身份证明类型源控制

    olam2-git-cred1

    页面将刷新,请求类型详细信息

  4. 输入用户名

    • 用户名git
  5. 输入 SCM Private Key

    单击 Browse(浏览)按钮,然后双击 id_rsa 文件。此操作会将密钥内容复制到 SCM Private Key 字段中。

    olam2-git-cred2

  6. 复查并单击保存按钮。

    olam2-git-cred3

创建项目

  1. 单击导航菜单中的项目

  2. 单击添加按钮。

  3. 在特定字段中输入或选择下列值。

    • 名称My Project
    • 执行环境OLAM EE (2.2)
    • 源控制身份证明类型Git

    olam2-proj1

    页面将刷新,请求类型详细信息

  4. 输入 git-server 的远程 URL。

    • 源控制 URLgit@<ip_address_of_instance>:/git-server/repos/olamkvm.git
  5. Source Control Credential 选择 Git Server

  6. 复查并单击保存按钮。

    olam2-proj2

  7. 复核项目同步状态。

    创建项目后,在同步开始时,项目将在详细信息摘要中显示其状态。如果配置正确且可访问 Git 服务器,则状态从正在运行转换为成功

    olam2-proj-sync

创建作业模板

  1. 单击导航菜单中的 Templates

  2. 单击 Add(添加)按钮,然后从值下拉列表中选择 Add job template(添加作业模板)

  3. 输入所需值。

    • 名称My Template
    • 作业类型运行
    • 库存KVM 服务器
    • 项目我的项目
    • 执行环境OLAM EE (2.2)
    • 游戏手册create_vm.yml
    • 身份证明我的 KVM 服务器

    olam2-temp1

  4. 复查、向下滚动,然后单击保存按钮。

    olam2-temp2

  5. 启动该模板。

    通过单击启动按钮,从模板汇总页启动作业。

    olam2- 临时启动

    如果成功,作业将启动并显示模板的输出。标准输出显示剧本运行并输出剧本的结果。

    olam2- 临时输出

验证虚拟机创建

  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)}')
    

    -qvirsh 命令输出中删除标头。awkvirsh domifaddr 命令中提取第四列,substr() 将删除最后三个字符。

  5. 断开与 VM 的连接。

    exit
    

(可选)创建另一个虚拟机

该手册允许通过更改 vm_name 变量来创建其他 VM。

  1. 切换到包含 Oracle Linux Automation Manager WebUI 的浏览器窗口并根据需要登录。

  2. 单击导航菜单中的 Templates

  3. 单击我的模板编辑模板图标。

    olam2- 临时编辑

  4. 将值为 ol9-new 的变量 vm_name 添加到 Variables(变量)部分。

    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 帮助中心