牛角号 #15
牛角号 第 15 期,2020 年 12 月 2 日
欢迎阅读牛角号,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送邮件至 [email protected],或在以下 GitHub 问题 中发表评论。
牛角号 第 15 期,2020 年 12 月 2 日
欢迎阅读牛角号,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送邮件至 [email protected],或在以下 GitHub 问题 中发表评论。
随着 Red Hat Ansible Automation Platform 随着不断增长的客户群而扩展其影响范围,安全性仍然是组织整体战略的重要方面。Red Hat 定期审查和增强基础代码库,以遵循更好的安全实践。作为此工作的一部分,我们通过一个新开发的 Ansible SSH 连接插件引入了 FIPS 140-2 就绪 启用功能,该插件使用 libssh 库。
由于大多数网络设备不支持或对本地执行第三方软件的功能有限,因此与 Linux 主机不同,Ansible 网络模块不会复制到远程主机;相反,它们在控制节点本身上运行。因此,Ansible 网络无法使用与 Linux 主机一起使用的典型 Ansible SSH 连接插件。此外,由于这种行为,底层 SSH 子系统的性能至关重要。新的 LibSSH 连接插件不仅支持 FIPS 就绪,而且还旨在 比现有的 Paramiko SSH 子系统性能更高。
ansible.netcommon 集合(特别是 ansible.netcommon.network_cli
)提供的顶级 network_cli
连接插件提供到网络设备的基于 SSH 的连接。它依次调用 ansible.builtin.paramiko_ssh
连接插件,该插件依赖于 paramiko python 库来初始化控制节点和远程主机之间的会话。之后,它创建一个伪终端 (PTY) 以将命令从控制节点发送到网络设备并接收响应。
替换 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.netcommon
集合版本 1.0.0 中,添加了 ansible.netcommon.network_cli
连接插件中的一个新配置参数,该参数允许将 ssh_type
设置为 libssh
或 paramiko
。
如果配置参数的值设置为 libssh
,它将使用 ansible.netcommon.libssh
连接插件,该插件依次使用支持 FIPS 就绪的 ansible-pylibssh
python 库。如果该值设置为 paramiko
,它将继续使用依赖于 paramiko
python 库的默认 ansible.builtin.paramiko
连接插件。
同样,默认值设置为 paramiko
,但将来计划将其更改为 libssh
。
为了利用 LibSSH 插件,您必须首先通过以下命令从 PyPI 安装 ansible-pylibssh
python 库
pip install ansible-pylibssh
注意
LibSSH
库及其依赖项捆绑为 特定于平台的轮子,这些轮子在运行时不依赖于任何操作系统级库。ansible-pylibssh
库的独立 RPM 和 DEB 软件包,这些软件包可以使用众所周知的 Linux 软件包管理器进行安装。这些软件包将在控制节点上安装所需的系统 libssh
版本及其依赖项。仅供参考,Red Hat Enterprise Linux 8.1 及更高版本包含正确的 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 传输是否正确设置,您可以使用 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”行,这确认配置已正确设置。
牛角号 第 14 期,2020 年 11 月 18 日
欢迎阅读牛角号,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送邮件至 [email protected],或在以下 GitHub 问题 中发表评论。
牛角号 第 13 期,2020 年 11 月 4 日
欢迎阅读牛角号,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送邮件至 [email protected],或在以下 GitHub 问题 中发表评论。
不断增长的业务需求推动了对更多自动化功能的需求,以支持快速、稳定和可靠地部署应用程序和支持基础设施。Kubernetes 和云原生技术也不例外。对于 Kubernetes 平台,Helm 是在任何集群上打包、配置和部署应用程序和服务的标准方法。
我们最近发布了 kubernetes.core 1.1,这是我们第一个面向大众使用的 Red Hat 认证内容集合版本。新引入的内容的一个重要部分是对自动化 Helm 操作的支持。在这篇博文中,我将向您展示一些在自动化中使用它的常见场景。
请注意,在 kubernetes.core 1.1 发布之前,其内容以 community.kubernetes 的形式发布。随着此内容成为 Red Hat 支持和认证内容,需要进行名称更改。我们正在 进行此转换。
Helm 是一款开源工具,用于在 Kubernetes 上打包和部署应用程序。它通常被称为 Kubernetes 包管理器。它被 Kubernetes 社区广泛采用,并且是云原生计算基金会 (CNCF) 毕业项目。
Helm 通过抽象许多复杂性来简化应用程序的部署。这使得更容易采用,并使团队能够提高生产力。
Helm 作为 Kubernetes 的专门包管理器而设计。它支持 Kubernetes 应用程序的安装、删除、升级、回滚和降级等操作。您可能知道,可以使用不同 Kubernetes 对象(如 Deployment、Services、ConfigMaps、PersistentVolumeClaims 等)的声明性资源文件来定义 Kubernetes 应用程序。分发和管理 Kubernetes 应用程序很困难。Helm 将所有 Kubernetes 资源文件打包成一种称为“Chart”的格式。Chart 可以被视为 Kubernetes 包。此打包格式包含有关资源文件、依赖项信息和元数据的信息。
您可以使用 Ansible 自动化 Kubernetes 基础设施。所有 Kubernetes 模块现在都位于名为 kubernetes.core 的 Kubernetes 集合中。此集合还包含用于自动化 Helm 及其相关功能的模块。
以下是 kubernetes.core 集合中包含的与 Helm 相关的模块列表:
Helm 模块利用 Ansible 控制器上安装的 Helm 二进制文件。这使得 helm 模块可以开箱即用,并且用户可以随时使用。与以前的 helm 模块不同,这些模块独立于任何第三方 Python 库。特别感谢 LucasBoisserie 的贡献。
让我们看看在一些常见场景中使用的这些模块。
为了安装 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
现在,我们已配置了 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
使用 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 的更新日期时间。
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
用户可以从给定的 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 频道
提供您的宝贵反馈,或者如果您需要 kubernetes.core 集合的帮助。
在未来的文章中,我们将介绍 kubernetes.core 中其他新增功能,并介绍我们目前正在开发的 community.okd (OpenShift) 集合。