注意:

通过 Oracle Linux Automation Engine 使用 OCI 动态库存

简介

Oracle Linux Automation Engine 是一款用于预配和配置管理的开源软件,它利用清单文件对基础设施中的托管节点或主机进行操作。此清单文件包含服务器列表、其 IP 地址和其他可选连接信息。

如果您的基础设施几乎没有变化,则静态清单文件可以正常工作。

但是,使用云时,您的基础设施可能会不断变化。因此,在添加和删除主机时动态更新您的清单会很有帮助。

目标

在本教程中,您将学习:

先决条件

部署 Oracle Linux Automation Engine

注:如果在您自己的租户中运行,请阅读 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: "ol-control-node"
        type: "control"
      2:
        instance_name: "ol-host"
        type: "remote"
    olam_type: none
    EOF
    
  6. 创建清单文件。

    cat << EOF | tee hosts > /dev/null
    localhost ansible_connection=local ansible_connection=local ansible_python_interpreter=/usr/bin/python3.6
    EOF
    
  7. 部署实验室环境。

    ansible-playbook create_instance.yml -i hosts -e "@instances.yml"
    

    对于 localhost,免费实验室环境需要额外的变量 ansible_python_interpreter,因为它为 Oracle Cloud Infrastructure SDK for Python 安装 RPM 软件包。根据您的 Oracle Linux 版本,此软件包的安装位置位于系统的默认 Python 模块下面。使用清单变量可避免影响在本地主机以外的主机上运行的播放。

    默认部署配置使用 AMD CPU。您可以通过在命令行上传递新的配置变量定义来更改实例的配置。

    例如:-e instance_shape="VM.Standard3.Flex"

    同样,Oracle Linux 映像的缺省版本使用在 `default_vars.yml file' 中定义的变量 os_version。可以通过在命令行上传递 Oracle Linux 主版本来修改此值。

    例如:-e os_version="9"

    重要提示:等待手册成功运行并到达暂停任务。在手册的这一阶段,Oracle Linux 安装已完成,实例已准备就绪。请注意上一个播放,其中输出其部署的节点的公共和专用 IP 地址。

设置 Oracle Linux Automation Engine 控制节点

控制节点是用于运行 Oracle Linux Automation Engine 手册的系统。运行剧本需要安装 Oracle Linux Automation Engine 软件包。

  1. 将一个变量设置为等于控制节点的 IP 地址。

    export CONTROL="<ip_address_of_ol-control-node>"
    
  2. 打开终端并将 SSH 密钥对复制到控制节点。

    scp -rp ~/.ssh/id_rsa* oracle@$CONTROL:~/.ssh/
    
  3. 设置 SSH 私有密钥的权限。

    ssh oracle@$CONTROL "chmod 600 ~/.ssh/id_rsa"
    
  4. 通过 SSH 连接到 ol-control-node 系统。

    ssh oracle@$CONTROL
    
  5. 安装 Oracle Linux Automation Engine 软件包和依赖项。

    sudo dnf install -y ansible-core
    

    ansible-core 软件包在 AppStream 系统信息库中可用。

  6. 测试软件包安装。

    ansible --version
    

    查看输出并查找 Python Oracle Linux Automation Manager 的默认版本。在该环境中,我们必须安装适用于 Python 的 Oracle Cloud Infrastructure (OCI) SDK。

    注:如果输出显示 ERROR:Ansible 要求语言环境编码为 UTF-8;Detected None ,则表示 ansible 的语言环境设置不正确。通过设置以下两个环境变量来修复问题:

    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    

安装适用于 Python 的 Oracle Cloud Infrastructure SDK

OCI 动态清单插件需要在控制节点上提供适用于 Python 配置的 OCI SDK。我们可以使用 Oracle Linux RPM 或 PIP(适用于 Python 的软件包安装程序)安装 OCI SDK。

  1. 使用 PIP 安装适用于 Python 的 OCI SDK。

    1. 安装 PIP 的软件包和依赖项。

      Oracle Linux 8:

      sudo dnf install -y python3.12-pip python3.12-setuptools
      

      Oracle Linux 9:

      sudo dnf install -y python3.9-pip python3.9-setuptools
      
    2. 安装 Python 软件包

      Oracle Linux 8:

      /usr/bin/python3.12 -m pip install oci
      

      Oracle Linux 9:

      /usr/bin/python3.9 -m pip install oci
      

      如果位于代理后面,则添加 --proxy 选项。通过运行命令 python3.12 -m pip help install,可以在帮助中找到详细信息。

  2. 通过打印其版本测试用于 Python 安装的 OCI SDK。

    Oracle Linux 8:

    python3.12 -c "import oci;print(oci.__version__)"
    

    Oracle Linux 9:

    python3.9 -c "import oci;print(oci.__version__)"
    
  3. 创建 OCI SDK 默认配置目录。

    mkdir -p ~/.oci
    
  4. 创建 SDK 默认配置文件

    免费实验室提供预生成的 SDK 配置,您可以使用 scp 将其复制到 ol-control-node 系统。

    1. 从桌面环境中打开终端。

    2. 将所有 SDK 配置文件复制到 ol-control-node 系统。

      scp ~/.oci/* oracle@<ip_address_of_instance>:~/.oci/.
      
      exit
      

    如果您在免费实验室环境之外遵循本教程,请参见 OCI 文档的 SDK and CLI Configuration FileRequired Keys and OCIDs 部分中提供的说明,以生成 OCI 配置文件。

  5. 切换到连接到 ol-control-node 系统的终端窗口。

  6. 更新 SDK 配置文件中 key_file 的位置。

    从桌面环境复制 SDK 配置文件时,我们必须修改 key_file 的用户起始目录部分,以确保其与控制系统的用户名匹配。

    sed -i 's/luna.user/oracle/g' ~/.oci/config
    
  7. 创建测试 Python 脚本以验证 SDK 是否正常工作。

    cat << EOF | tee test.py > /dev/null
    import oci
    object_storage_client = oci.object_storage.ObjectStorageClient(oci.config.from_file())
    result = object_storage_client.get_namespace()
    print("Current object storage namespace: {}".format(result.data))
    EOF
    

    test.py 脚本显示配置的 OCI 租户和区间的对象存储名称空间。

  8. 运行脚本

    Oracle Linux 8:

    python3.12 test.py
    

    Oracle Linux 9:

    python3.9 test.py
    

    测试脚本已成功打印配置租户的唯一名称空间。

安装 Oracle Cloud Infrastructure Ansible 集合

OCI Ansible Collection 包含一组模块,可自动执行云基础设施预配和配置、编排复杂的运营流程以及部署和更新软件资产。

  1. 创建项目目录。

    mkdir ~/myproject
    
  2. 创建需求文件。

    cat << EOF | tee ~/myproject/requirements.yml > /dev/null
    ---
    collections:
      - name: oracle.oci
    EOF
    
  3. 安装 OCI Ansible Collection。

    ansible-galaxy collection install -r ~/myproject/requirements.yml
    

    如果已安装了以前的版本,请通过运行带有 --force 选项的命令来获取最新版本。

    ansible-galaxy collection install --force oracle.oci
    

使用 OCI 动态库存

Oracle 在 OCI Ansible Collection 中包含其动态清单插件。

  1. 通过创建 YAML 配置源来配置清单插件。

    源文件名必须为 <filename>.oci.yml<filename>.oci.yaml。其中 <filename> 是用户定义的有用标识符。

    cat << EOF | tee ~/myproject/myproject.oci.yml > /dev/null
    ---
    plugin: oracle.oci.oci
    
    # Optional fields to specify oci connection config:
    config_file: ~/.oci/config
    config_profile: DEFAULT
    EOF
    
  2. 通过创建清单图来测试清单插件。

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    输出显示一系列警告和错误。怎么了?

    出现错误是因为插件需要知道区间 OCID。如果您提供租户 OCID(而非区间 OCID)并且具有正确的权限,则插件将为整个租户生成清单。

    由于插件无法直接从 SDK 配置文件读取区间 OCID 信息,因此请将其添加到插件配置文件。

  3. 从 SDK 配置文件中获取区间 OCID 并将其分配给变量 comp_ocid

    comp_ocid=$(grep -i compartment ~/.oci/config | sed -e 's/compartment-id=//g')
    
  4. 将区间参数附加到插件源文件。

    cat << EOF | tee -a ~/myproject/myproject.oci.yml > /dev/null
    
    compartments:
      - compartment_ocid: "$comp_ocid"
        fetch_compute_hosts: true
    EOF
    

    fetch_compute_hosts 设置为 true 将导致清单仅收集计算主机上的信息,并忽略区间内部署的其他实例类型。

  5. 重新运行测试。

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    我们的示例将区间内的可用计算实例显示为由 @ 字符指定的清单组列表,并显示实例的公共 IP 地址。

    如果我们想要专用 IP 地址,该怎么办?

    需要根据控制器节点的物理位置或云基础结构内配置的网络拓扑来抓取专用 IP 地址。当请求的计算实例只有专用 IP 地址时,获取专用 IP 地址的另一个原因。

  6. 通过更新插件配置文件来更改插件主机名格式参数。

    cat << EOF | tee -a ~/myproject/myproject.oci.yml > /dev/null
    
    hostname_format_preferences:
      - "private_ip"
      - "public_ip"
    EOF
    

    上面的示例格式将系统的专用 IP 地址优先于其公共 IP 地址。有关此配置的更多详细信息,请参阅文档中的主机名格式首选项

  7. 重新测试插件。

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    输出现在显示专用 IP 地址。

运行手册

通过动态库存设置和配置,我们可以用它来运行一个简单的手册。确保在控制节点和任何远程节点之间启用 SSH 访问。

  1. 创建一个对主机进行 ping 操作的手册。

    cat << EOF | tee ~/myproject/ping.yml > /dev/null
    ---
    - hosts: all,!$(hostname -i)
      tasks:
      - name: Ansible ping test
        ansible.builtin.ping:
    EOF
    

    Oracle Linux Automation Engine 需要在 - hosts: 条目之后列出主机或组的逗号分隔列表,! 表示应排除这些条目。all 条目将在顶级组中以 @all 形式 ping 清单中显示的每个主机。您可以修改此剧本以使用不同于图形输出的组,方法是从其名称中删除 @ 字符并将该名称输入到 - hosts: 条目中。

  2. 运行剧本。

    ansible-playbook -u opc -i ~/myproject/myproject.oci.yml ~/myproject/ping.yml
    

    出现提示时接受 ECDSA 密钥指纹

    -i 选项设置使用的动态清单文件。

    -u 选项在尝试连接时设置远程 SSH 用户。

后续步骤

ok 状态完成剧本运行,确认 Oracle Linux Automation Engine 成功使用 OCI 动态清单与其在区间中搜索到的远程实例进行通信。继续学习并使用此功能来帮助管理 OCI 实例组并在 Oracle Linux 上执行例行管理任务。

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心