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

深入了解 Ansible VScode 扩展

深入了解 Ansible VScode 扩展

作为 Red Hat Ansible Automation Platform 一部分的 Ansible 持续发展和成熟。最近的增强功能包括 Ansible 内容集合、自动化执行环境以及使用插件和模块的越来越多的集成列表。现在比以往任何时候都更重要的是,新的和有经验的内容创建者都可以访问有助于他们更快地编写更好内容的工具。新创建的 Ansible Devtools 计划专注于开发和增强诸如ansible-navigatorAnsible VScode 扩展ansible-lint等工具,以帮助简化 Ansible 自动化内容创建者的体验。在本博文中,我们将深入探讨 Ansible VSCode 扩展,概述其工作原理以及安装后使其正常工作所需的初始设置。

演变

Ansible VSCode 扩展最初是Tomasz Maciążek的 VSCode 扩展的分支。分支后,服务器端和客户端代码被解耦到各自独立的存储库中,以便允许服务器端和客户端独立发布。

  1. Ansible 语言服务器
  2. Ansible VSCode 扩展 

Ansible 语言服务器作为节点模块在npm 存储库上发布,允许其他支持语言服务器协议的编辑器重用它,而 VSCode 扩展客户端则在市场上发布,并具有许多其他功能。

Tomasz 继续成为 Ansible 扩展的核心贡献者,我们想感谢他以及所有其他社区成员为帮助使扩展在每个新版本中都更适合 Ansible 内容创建者所做的贡献。

语言服务器协议 (LSP) 简介

Ansible 语言服务器实现了语言服务器协议 (LSP),这是一种开放的、基于JSON-RPC的协议,用于在源代码编辑器、集成开发环境 (IDE) 和提供特定于编程语言的功能的服务器之间进行通信。该协议的目标是允许独立于任何给定的编辑器或 IDE 实现和分发编程语言支持。

LSP diagram

来源:https://vscode.js.cn/api/language-extensions/language-server-extension-guide

从上图可以看出,语言服务器协议允许单个语言服务器实现被多个代码编辑器或 IDE 重用,从而避免了像没有 LSP 的情况下那样为每个编辑器重复语言相关支持的需要。语言服务器作为单独的进程运行,开发工具(如 VSCode)使用 JSON-RPC 通过语言协议与服务器通信。有关更多详细信息,请参阅语言服务器规范

Ansible 语言服务器

Ansible language server diagram

Ansible 语言服务器提供以下功能:

  • 代码补全
  • 悬停(将鼠标悬停在关键字上显示关键字描述)
  • 转到定义(对于模块)
  • 诊断等等

它为开发工具(客户端)发送的 JSON-RPC 请求提供服务。语言服务器运行 Ansible 命令(如 ansible-config、ansible-playbook 等)以支持这些功能,因此需要在本地或自动化执行环境中安装 Ansible软件包ansible-core。此外,如果安装并启用(默认情况下),语言服务器将依赖于ansible-lint来提供诊断信息。在使用自动化执行环境运行时,应包含 ansible-core 和可选的 ansible-lint。

扩展安装

在 VSCode 扩展选项卡中,搜索并安装**Ansible VS Code 扩展**。

注意:

  • 首次安装扩展时,“运行时状态”为“尚未激活”,这表示扩展尚未运行。只有在编辑器中打开文件并且为该文件识别的语言为“**Ansible**”后,状态才会变为激活。
  • 对于 Windows 用户,扩展程序与 WSL2 兼容,而不是在原生 Windows 上。

Ansible 扩展设置

Ansible 扩展支持多个配置选项,例如,更改 Ansible、ansible-lint、python 解释器等的可执行文件路径。还有一个选项可以启用自动化执行环境,用户可以选择容器引擎、镜像名称、拉取策略等。要查看和更改 VSCode 窗口中的配置选项,请转到**代码 -> 首选项 -> 设置**,并在“搜索设置”框中键入“**ansible**”,如下面的快照所示。

vscode extension screenshot

可以为给定的用户或工作区设置首选项,并根据环境,也为远程类型和工作区文件夹设置首选项。用户范围内的设置将全局应用于打开的任何 VSCode 实例。工作区范围的设置将存储在您的工作区内,并且仅在打开当前工作区时应用。有关更多信息,请参阅 VSCode 文档此处。或者,对于工作区设置,您还可以通过编辑工作区根文件夹内的**.vscode/settings.json**文件来提供 Ansible 设置,如下所示。

vscode extension screenshot

激活和使用 Ansible 扩展

如上所述,vscode-ansible扩展依赖于作为后台进程运行的ansible-language-server来为 Ansible Playbook 和任务文件提供功能,例如自动完成、悬停、诊断、转到等。该扩展还依赖于 Red Hat 的vscode-yaml扩展来提供其他相关文件的自动完成和诊断信息,例如 Ansible 变量文件、ansible-navigator 设置文件、ansible-galaxy 需求和元数据文件、ansible-lint 配置文件和其他 YAML 文件。该扩展使用文件模式匹配将文件与 YAML 语言关联。有关vscode-yaml扩展使用的文件模式和关联的架构文件的详细信息,请阅读更多此处

在设置了此上下文后,您现在可以继续在 VSCode 窗口中打开 Ansible 项目的根目录。该文件夹将成为您工作区的根目录,在后台执行 Ansible 命令时,Ansible 语言服务器也将将其视为当前工作目录。如果您尝试在未先设置工作区的情况下打开 Ansible 文件,则插件可能无法正确确定上下文(例如 CWD)。

在 VSCode 窗口中打开 Ansible 文件后,它可能无法被正确识别为**Ansible**语言类型,如下面的快照所示。很可能,该文件将被识别为“**YAML**”语言,因为 Ansible 文件的扩展名要么是“**yaml**”,要么是“**yml**”,并且安装vscode-ansible扩展程序,反过来会安装vscode-yaml扩展程序。

vscode extension screenshot

将光标悬停在右下角识别的语言(在本例中为 YAML)上,您将看到“选择语言模式”。通过单击识别的语言名称(YAML),它将打开一个下拉菜单;在选项卡中键入“**Ansible**”,然后选择它。执行此操作后,您会注意到该文件识别的语言已更改为“**Ansible**”,如下面的快照所示。

vscode extension screenshot

当文件语言首次被识别为 Ansible 时,**vscode-ansible**扩展将被激活,并且扩展将后台运行**ansible-language-server**进程,该进程在您键入和/或将鼠标悬停在文件内时提供自动完成、悬停和诊断信息。诊断信息将在**问题**选项卡中提供。如果已安装并启用,语言服务器默认情况下将运行**ansible-lint**以生成打开文件的诊断信息。如果未安装**ansible-lint**,则服务器将运行**ansible-playbook --syntax-check**来生成诊断信息。

您可以通过单击“**代码 -> 首选项 -> 设置**”并在搜索框中键入“**文件关联**”来设置文件关联设置,而不是为每个文件更改语言。添加一个项目以将扩展名与语言类型关联,如下面的快照所示。

vscode extension screenshot

有关文件关联的更多信息,请参阅此处的文档。

使用自动化执行环境

要查看扩展支持的自动化执行环境,您可以转到设置(代码 -> 首选项 -> 设置)并键入“**ansible.execution environment**”。

vscode extension screenshot

启用执行环境 (EE) 后,扩展程序默认会拉取 "quay.io/ansible/creator-ee:latest" 镜像(如果本地不存在)。可以通过为 "ansible.executionEnvironment.image" 设置提供目标值来更改镜像的值。EE 拉取成功后,Ansible 扩展程序会将 EE 内的插件文档复制到本地缓存文件夹,并将其用于提供自动完成、悬停和跳转功能。由于 "creator-ee" 镜像捆绑了 "ansible-lint",因此 Ansible 扩展程序和 ansible-language-server 会将整个工作区挂载到 EE 中,并根据设置运行 "ansible-lint" 或 "ansible-playbook ---syntax-check" 以在编辑器中提供诊断信息。

vscode extension screenshot

注意:

  • 如果启用执行环境后自动完成和其他功能无法正常工作,可以通过打开命令面板("查看 -> 命令面板")并执行 "开发者:重新加载窗口" 命令来重新加载 VS Code,此操作也会重启后台运行的 "ansible-language-server" 进程。
  • 如果扩展程序无法按预期工作,可以按照此处所示的调试步骤进行操作。如果仍然无法解决问题,请在此处提交问题。 

自动完成现在将为给定执行环境镜像名称中包含的插件提供建议。

vscode extension screenshot

“触发建议”键取决于键盘快捷键。要查看关联的键,请转到 代码 -> 首选项 -> 键盘快捷方式

vscode extension screenshot

Ansible Playbook 运行入口点

扩展程序还提供了一个选项,可以使用 "ansible-navigator run" 或 "ansible-playbook" 命令从扩展程序内运行 Ansible Playbook,如下面的快照所示。

vscode extension screenshot