我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统现状。
参与 Ansible 项目 2024 年调查




用于 Ansible Network 的新 LibSSH 连接插件取代 Paramiko,并添加 FIPS 模式启用功能

用于 Ansible Network 的新 LibSSH 连接插件取代 Paramiko,并添加 FIPS 模式启用功能

随着 Red Hat Ansible Automation Platform 随着不断增长的客户群而扩展其影响范围,安全性仍然是组织整体战略的重要方面。Red Hat 定期审查和增强基础代码库,以遵循更好的安全实践。作为此工作的一部分,我们通过一个新开发的 Ansible SSH 连接插件引入了 FIPS 140-2 就绪 启用功能,该插件使用 libssh 库。

Ansible Network SSH 连接基础

由于大多数网络设备不支持或对本地执行第三方软件的功能有限,因此与 Linux 主机不同,Ansible 网络模块不会复制到远程主机;相反,它们在控制节点本身上运行。因此,Ansible 网络无法使用与 Linux 主机一起使用的典型 Ansible SSH 连接插件。此外,由于这种行为,底层 SSH 子系统的性能至关重要。新的 LibSSH 连接插件不仅支持 FIPS 就绪,而且还旨在 比现有的 Paramiko SSH 子系统性能更高

diagram of module code execution

ansible.netcommon 集合(特别是 ansible.netcommon.network_cli)提供的顶级 network_cli 连接插件提供到网络设备的基于 SSH 的连接。它依次调用 ansible.builtin.paramiko_ssh 连接插件,该插件依赖于 paramiko python 库来初始化控制节点和远程主机之间的会话。之后,它创建一个伪终端 (PTY) 以将命令从控制节点发送到网络设备并接收响应。

为什么要替换 Paramiko?

替换 paramiko 库的主要原因是它不保证 FIPS 就绪,因此限制了 Ansible 网络在强制启用 FIPS 模式环境中的运行能力。Paramiko 也不是速度最快的连接插件,因此也可以对其进行增强。因此,新的 ansible.netcommon.libssh 连接插件现在可以轻松地替换 paramiko。ansible.netcommon 集合现在默认包含此插件,并且可以用于测试目的,直到代码库变得更加稳定(它目前是 技术预览)。

将连接流程与上述流程进行比较,ansible.netcommon 集合(特别是 ansible.netcommon.network_cli)提供的顶级 network_cli 连接插件仍然提供到网络设备的基于 SSH 的连接。它依次调用 ansible.netcommon.libssh 连接插件,该插件依赖于 ansible-pylibssh python 库 来初始化控制节点和远程主机之间的会话。此 python 库本质上是 libssh C 库 之上的 Cython 包装器。然后,它使用 python 通过 SSH 创建伪终端 (PTY)。

切换 Ansible Playbook 以使用 LibSSH

ansible.netcommon 集合版本 1.0.0 中,添加了 ansible.netcommon.network_cli 连接插件中的一个新配置参数,该参数允许将 ssh_type 设置为 libsshparamiko

如果配置参数的值设置为 libssh,它将使用 ansible.netcommon.libssh 连接插件,该插件依次使用支持 FIPS 就绪的 ansible-pylibssh python 库。如果该值设置为 paramiko,它将继续使用依赖于 paramiko python 库的默认 ansible.builtin.paramiko 连接插件。

同样,默认值设置为 paramiko,但将来计划将其更改为 libssh

安装和配置 LibSSH

为了利用 LibSSH 插件,您必须首先通过以下命令从 PyPI 安装 ansible-pylibssh python 库

pip install ansible-pylibssh

注意

  • 当前的 PyPI 安装方法将正确版本的 LibSSH 库及其依赖项捆绑为 特定于平台的轮子,这些轮子在运行时不依赖于任何操作系统级库。
  • 未来的计划包括创建、发布和维护 ansible-pylibssh 库的独立 RPM 和 DEB 软件包,这些软件包可以使用众所周知的 Linux 软件包管理器进行安装。这些软件包将在控制节点上安装所需的系统 libssh 版本及其依赖项。仅供参考,Red Hat Enterprise Linux 8.1 及更高版本包含正确的 libssh 软件包版本及其依赖项。
  • 目前使用 LibSSH 与 Ansible 的主要用例是连接到网络设备。连接到其他类型的端点(例如 Linux)将在以后启用。

在 Ansible Playbook 中使用 LibSSH

方法 1:ssh_type 配置参数可以设置为在项目的活动 ansible.cfg 文件中使用 libssh,如下所示

[persistent_connection]
ssh_type = libssh

方法 2:设置 ANSIBLE_NETWORK_CLI_SSH_TYPE 环境变量,如下所示

$export ANSIBLE_NETWORK_CLI_SSH_TYPE=libssh

方法 3:在 playbook 的 play 级别将 ansible_network_cli_ssh_type 参数设置为 libssh(如下例所示)。

注意:此设置可以在单个任务级别进行,但前提是尚未建立与远程网络设备的连接。也就是说,如果第一个任务使用 paramiko,则 playbook 中的所有后续任务都必须使用 paramiko,即使在任何后续任务中指定了 libssh

排查 LibSSH 连接问题

要快速验证 libssh 传输是否正确设置,您可以使用 ansible-playbook 命令行并添加详细标志 (-vvvv) 运行以下 playbook。在运行之前,请确保 inventory 文件已正确设置。

此示例 playbook 使用 cisco.ios 集合,并且必须首先从 Ansible Galaxy 或 Ansible Automation Platform 安装到您的 Ansible 控制节点上。

- hosts: "changeme"
  gather_facts: no
  connection: ansible.netcommon.network_cli
  vars:
    ansible_network_os: cisco.ios.ios
    ansible_user: "changeme"
    ansible_password: "changeme"
    ansible_network_cli_ssh_type: libssh
  tasks:
  - name: run show version command
    ansible.netcommon.cli_command:
      command: show version

  - name: run show interface command
    ansible.netcommon.cli_command:
       command: show interfaces

https://gist.github.com/ganeshrn/78149adca85c809b69ed1b5f5262844c

在输出详细日志中,您应该会看到控制台上显示的“ssh 类型设置为 libssh”行,这确认配置已正确设置。

后续步骤和资源

  • 通过将配置设置为使用 ansible-pylibssh 库开始测试您的 Ansible 网络 playbook。
  • 有关使用 ansible-pylibssh 库相对于 paramiko 库对现有 playbook 进行性能分析的帮助。
  • 参与 ansible-pylibssh 项目 (https://github.com/ansible/pylibssh)









使用 Ansible 自动化 Helm

使用 Ansible 自动化 Helm

不断增长的业务需求推动了对更多自动化功能的需求,以支持快速、稳定和可靠地部署应用程序和支持基础设施。Kubernetes 和云原生技术也不例外。对于 Kubernetes 平台,Helm 是在任何集群上打包、配置和部署应用程序和服务的标准方法。

我们最近发布了 kubernetes.core 1.1,这是我们第一个面向大众使用的 Red Hat 认证内容集合版本。新引入的内容的一个重要部分是对自动化 Helm 操作的支持。在这篇博文中,我将向您展示一些在自动化中使用它的常见场景。

请注意,在 kubernetes.core 1.1 发布之前,其内容以 community.kubernetes 的形式发布。随着此内容成为 Red Hat 支持和认证内容,需要进行名称更改。我们正在 进行此转换

Helm 快速入门

Helm 是一款开源工具,用于在 Kubernetes 上打包和部署应用程序。它通常被称为 Kubernetes 包管理器。它被 Kubernetes 社区广泛采用,并且是云原生计算基金会 (CNCF) 毕业项目。

Helm 通过抽象许多复杂性来简化应用程序的部署。这使得更容易采用,并使团队能够提高生产力。

Helm 作为 Kubernetes 的专门包管理器而设计。它支持 Kubernetes 应用程序的安装、删除、升级、回滚和降级等操作。您可能知道,可以使用不同 Kubernetes 对象(如 Deployment、Services、ConfigMaps、PersistentVolumeClaims 等)的声明性资源文件来定义 Kubernetes 应用程序。分发和管理 Kubernetes 应用程序很困难。Helm 将所有 Kubernetes 资源文件打包成一种称为“Chart”的格式。Chart 可以被视为 Kubernetes 包。此打包格式包含有关资源文件、依赖项信息和元数据的信息。

使用 Ansible 自动化 Helm

您可以使用 Ansible 自动化 Kubernetes 基础设施。所有 Kubernetes 模块现在都位于名为 kubernetes.core 的 Kubernetes 集合中。此集合还包含用于自动化 Helm 及其相关功能的模块。

以下是 kubernetes.core 集合中包含的与 Helm 相关的模块列表:

  1. helm - 使用 Helm 二进制文件管理 K8S 包
  2. helm_info - 收集有关在集群内部署的 Helm 包的信息
  3. helm_plugin - 管理 Helm 插件
  4. helm_plugin_info - 收集有关 Helm 插件的信息
  5. helm_repository - 管理 Helm 存储库

Helm 模块利用 Ansible 控制器上安装的 Helm 二进制文件。这使得 helm 模块可以开箱即用,并且用户可以随时使用。与以前的 helm 模块不同,这些模块独立于任何第三方 Python 库。特别感谢 LucasBoisserie 的贡献。

让我们看看在一些常见场景中使用的这些模块。

场景 1 - 添加新的 Helm 存储库

为了安装 Helm 包,您需要在 Kubernetes 集群中添加 Helm 存储库。

现在让我们使用 helm_repository 模块添加一个 Helm 存储库

---
- hosts: localhost
  vars:
     helm_chart_url: "https://charts.bitnami.com/bitnami"
  tasks:
      - name: Add helm repo
        kubernetes.core.helm_repository:
            name: bitnami
            repo_url: "{{ helm_chart_url }}"

在这里,我们通过指定 URL 和名称来安装新的 Helm Chart 存储库。运行此 playbook 后,您将拥有在环境中安装的 Bitnami Chart 存储库。

# helm repo list
NAME     URL
stable     https://kubernetes-charts.storage.googleapis.com/
bitnami    https://charts.bitnami.com/bitnami

场景 2 - 安装 Helm Chart

现在,我们已配置了 Helm 存储库。现在让我们从 Bitnami 存储库安装 nginx chart。

---
- hosts: localhost
  tasks:
     - name: Install Nginx Chart
       kubernetes.core.helm:
           name: nginx-server
           namespace: testing
           chart_ref: bitnami/nginx

运行此 playbook 后,您可以在 testing 环境中看到 nginx-server 部署正在运行。

# kubectl -n testing get deploy
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
nginx-server      1/1     1            1           48s

场景 3 - 收集有关已安装的 Helm Chart 的信息

使用 helm_info 模块也可以轻松收集有关 Helm Chart 的信息。

---
- hosts: localhost
  tasks:
     - name: Gather information about nginx-server
       kubernetes.core.helm_info:
            name: nginx-server
            release_namespace: testing

运行此 playbook 将提供有关已安装 chart 的有价值信息,例如应用程序版本、chart 版本、修订版本、状态和给定 chart 的更新日期时间。

场景 4 - 安装 Helm 插件

Helm 允许您通过提供可插拔架构来增强其功能。这意味着用户可以编写插件来增强 Helm 的功能。有大量的 Helm 插件可用。用户可以根据其用例和需求安装这些插件。

现在让我们尝试安装名为 helm env 的 Helm 插件。此 Helm 插件允许用户查看 Helm 插件可用的环境变量。

---
- hosts: localhost
  tasks:
     - name: Install Helm Plugin
       kubernetes.core.helm_plugin:
           plugin_path: https://github.com/adamreese/helm-env
           state: present
           release_namespace: testing

场景 5 - 收集有关 Helm 插件的信息

用户可以从给定的 Kubernetes 集群中收集有关已安装 Helm 插件的信息。

---
- hosts: localhost
  tasks:
  - name: Gather Helm plugin info
    kubernetes.core.helm_plugin_info:
        release_namespace: testing
    register: r

  - name: Print plugin version
    debug:
    msg: "{{ ( r.plugin_list | selectattr('name', 'equalto', plugin_name) | list )[0].version }}"
    vars:
    plugin_name: "env"

这将输出与来自给定命名空间的插件相关的所有信息。用户可以指定特定的插件名称来收集其信息。

结论和下一步

就是这样。使用 kubernetes.core 中的 Helm 模块,您可以轻松地以可重复且可靠的方式自动化 Kubernetes 应用程序的管理。我们希望您尝试一下并告诉我们您的想法。请访问 Ansible Kubernetes IRC 频道

ansible-kubernetes 在 Freenode

提供您的宝贵反馈,或者如果您需要 kubernetes.core 集合的帮助。

在未来的文章中,我们将介绍 kubernetes.core 中其他新增功能,并介绍我们目前正在开发的 community.okd (OpenShift) 集合