×

要使用 Ansible 管理 Kubernetes 上的应用程序生命周期,您可以使用适用于 Ansible 的 Kubernetes 集合。此 Ansible 模块集合允许开发人员利用他们用 YAML 编写的现有 Kubernetes 资源文件,或者以原生 Ansible 表达生命周期管理。

Red Hat 支持的 Operator SDK CLI 工具版本(包括与 Operator 项目相关的脚手架和测试工具)已弃用,并计划在未来版本的 OpenShift Dedicated 中移除。Red Hat 将在此版本的生命周期内为此功能提供错误修复和支持,但此功能将不再接收增强功能,并将从未来的 OpenShift Dedicated 版本中移除。

不建议使用 Red Hat 支持的 Operator SDK 版本创建新的 Operator 项目。拥有现有 Operator 项目的操作符作者可以使用 OpenShift Dedicated 发布的 Operator SDK CLI 工具版本来维护其项目并创建针对较新版本的 OpenShift Dedicated 的 Operator 版本。

以下与 Operator 项目相关的基础镜像_未_被弃用。这些基础镜像的运行时功能和配置 API 仍然支持错误修复和解决 CVE。

  • 基于 Ansible 的 Operator 项目的基础镜像

  • 基于 Helm 的 Operator 项目的基础镜像

有关不受支持的、社区维护的 Operator SDK 版本的信息,请参阅Operator SDK (Operator Framework)

结合使用 Ansible 和现有的 Kubernetes 资源文件的一大优势是能够使用 Jinja 模板,以便您可以通过 Ansible 中的几个变量轻松定制资源。

本节详细介绍 Kubernetes 集合的使用方法。要开始使用,请在本地工作站上安装该集合,并使用 playbook 测试它,然后再在 Operator 中使用它。

安装适用于 Ansible 的 Kubernetes 集合

您可以在本地工作站上安装适用于 Ansible 的 Kubernetes 集合。

步骤
  1. 安装 Ansible 2.15+

    $ sudo dnf install ansible
  2. 安装Python Kubernetes 客户端

    $ pip install kubernetes
  3. 使用以下方法之一安装 Kubernetes 集合

    • 您可以直接从 Ansible Galaxy 安装该集合

      $ ansible-galaxy collection install community.kubernetes
    • 如果您已经初始化了 Operator,则项目顶层可能会有一个 `requirements.yml` 文件。此文件指定 Operator 正常运行必须安装的 Ansible 依赖项。默认情况下,此文件安装 `community.kubernetes` 集合以及 `operator_sdk.util` 集合,后者提供用于 Operator 特定功能的模块和插件。

      要安装 `requirements.yml` 文件中的依赖模块

      $ ansible-galaxy collection install -r requirements.yml

在本地测试 Kubernetes 集合

Operator 开发人员可以在本地机器上运行 Ansible 代码,而不是每次都运行和重新构建 Operator。

先决条件
  • 使用 Operator SDK 初始化基于 Ansible 的 Operator 项目并创建具有生成的 Ansible 角色的 API

  • 安装适用于 Ansible 的 Kubernetes 集合

步骤
  1. 在基于 Ansible 的 Operator 项目目录中,使用所需的 Ansible 逻辑修改 `roles//tasks/main.yml` 文件。`roles//` 目录是在创建 API 时使用 `--generate-role` 标志时创建的。`` 可替换项与您为 API 指定的种类匹配。

    以下示例根据名为 `state` 的变量的值创建和删除配置映射

    ---
    - name: set ConfigMap example-config to {{ state }}
      community.kubernetes.k8s:
        api_version: v1
        kind: ConfigMap
        name: example-config
        namespace: <operator_namespace> (1)
        state: "{{ state }}"
      ignore_errors: true (2)
    1 指定您想要创建 ConfigMap 的命名空间。
    2 设置ignore_errors: true 可确保删除不存在的 ConfigMap 不会失败。
  2. 修改roles/<kind>/defaults/main.yml文件,将state默认设置为present

    ---
    state: present
  3. 通过在项目目录的顶层创建一个playbook.yml文件来创建 Ansible playbook,并包含您的<kind>角色。

    ---
    - hosts: localhost
      roles:
        - <kind>
  4. 运行 playbook。

    $ ansible-playbook playbook.yml
    示例输出
    [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
    
    PLAY [localhost] ********************************************************************************
    
    TASK [Gathering Facts] ********************************************************************************
    ok: [localhost]
    
    TASK [memcached : set ConfigMap example-config to present] ********************************************************************************
    changed: [localhost]
    
    PLAY RECAP ********************************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  5. 验证 ConfigMap 是否已创建。

    $ oc get configmaps
    示例输出
    NAME               DATA   AGE
    example-config     0      2m1s
  6. 重新运行 playbook 并将state设置为absent

    $ ansible-playbook playbook.yml --extra-vars state=absent
    示例输出
    [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
    
    PLAY [localhost] ********************************************************************************
    
    TASK [Gathering Facts] ********************************************************************************
    ok: [localhost]
    
    TASK [memcached : set ConfigMap example-config to absent] ********************************************************************************
    changed: [localhost]
    
    PLAY RECAP ********************************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  7. 验证 ConfigMap 是否已删除。

    $ oc get configmaps

后续步骤