我们想听听你的意见!帮助我们深入了解 Ansible 生态系统的现状。
参加 Ansible 项目 2024 年调查

使用 GitHub Actions 进行 Ansible 代码静态分析

使用 GitHub Actions 进行 Ansible 代码静态分析

想要在每次 Pull Request 时触发对 Ansible 部署进行代码静态分析吗?

在本篇博文中,我将向您展示如何在 Ansible 代码流水线中添加一些很棒的自动化功能。 

CI/CD 目前是开发人员的热门话题。运维团队可以使用 GitHub Actions 开始进行一些自动化的代码静态分析。如果您使用 GitHub,您可以在不同的阶段对您的剧本进行代码静态分析,包括 git 推送或拉取请求。

如果您遵循良好的 git 工作流实践,并且有一个审批委员会审查拉取请求,这种类型的自动化测试可以节省您大量时间,并保持您的 Ansible 代码简洁干净。

什么是 Ansible 代码静态分析工具?

Ansible 代码静态分析工具是一个开源项目,它可以对您的 Ansible 代码进行静态分析。该工具的文档指出,它检查剧本以查找可能需要改进的实践和行为。它可以使用 pip 安装,并手动在剧本上运行,或者在预提交钩子中设置,并在您尝试从 CLI 提交到仓库时运行。

该项目可以在 GitHub 上的 Ansible 组织下找到。

什么是 GitHub Actions?

来自 GitHub 的文档:GitHub Actions 使您能够创建自定义工作流来自动化项目的软件开发生命周期流程。工作流是可配置的自动化流程,由一个或多个作业组成。您必须创建一个 YAML 文件来定义您的工作流配置。您可以配置工作流,以便在 GitHub 上发生特定活动时、在预定的时间运行,或者在 GitHub 外部发生事件时运行。

可以在 GitHub 的 Actions Marketplace 中找到 Ansible 代码静态分析工具操作。

示例仓库

让我向您展示一个示例,说明它将是什么样子。这里我有一个包含 Ansible 剧本的仓库。

https://github.com/colin-mccarthy/ansible_lint_demo

我尝试提交一个拉取请求以添加一个新的剧本。Ansible 代码静态分析工具操作启动,最终检测到一个问题,并返回了一个失败消息。

为什么失败了?

我可以在仓库的 Actions 部分查看构建日志。看起来我在其中一项任务中有一些尾随空白,并且正在与空字符串进行比较。

image one

我会收到电子邮件通知吗?

我也收到了电子邮件通知,让我知道它失败了。

image two

设置它

要使用该操作,只需在 .github/workflows/ 目录中创建一个 Ansible Lint.yml(或选择自定义 *.yml 名称)。

image three

所以,这里是最酷的部分,您可以在各种事件上运行该操作!这意味着每次有人提交 PR 或进行推送时,该操作都将被触发,并且一个容器将启动并运行 Ansible 代码静态分析工具对您的仓库进行分析。您可以使用 on: parameter 来定义哪些事件将触发该操作。

on: [push, pull_request]

预提交钩子

我想更深入地探讨代码静态分析,并介绍预提交钩子。

预提交钩子是在您的机器上本地运行的小脚本,它们可以帮助在提交代码进行代码审查之前识别问题。在谈到 Ansible 代码静态分析工具操作时,在您提交拉取请求之前对代码进行静态分析将非常有用。这将确保您始终通过测试。GitHub 操作将仅作为保护共享仓库的最后一步。如果您使用预提交钩子,您理论上永远不会让 GitHub 操作测试失败。

示例

image four

https://pre-commit.git.js.cn

为了在我的 MacBook 上设置它,我只需执行 pip 安装。

pip install pre-commit

要在您的仓库上设置它,请确保您…​

pre-commit install

要将 Ansible 代码静态分析工具与 pre-commit 一起使用,只需将以下内容添加到您本地仓库的 .pre-commit-config.yaml 文件中。确保将 rev: 更改为 Ansible 代码静态分析工具的 git 提交 SHA 或包含 hooks.yaml 的标签。

image five

Markdown 徽章

设置操作后,Github 会给您一段 markdown 代码片段,您可以将其添加到 README.md 中,以显示仓库的代码静态分析状态。一个用于您的仓库的徽章,用于显示它是否通过了代码静态分析测试。

image six

删除尾随空白并修复所有问题后,我的 PR 显示“所有检查已通过”,我的徽章显示已通过。

image seven

image eight

总结

在代码更改上强制执行代码静态分析可以建立对您的代码遵循最佳实践的信任。希望您能尝试使用 GitHub Actions 或预提交钩子将一些代码静态分析添加到您的 Ansible 仓库中。设置此操作非常有趣,我特别喜欢提供的徽章。




号角 #1

Ansible Bullhorn banner

号角

面向 Ansible 开发者社区的新闻简报

欢迎来到号角,这是我们面向 Ansible 开发者社区的新闻简报。Ansible 目前正在发生很多变化,因此我们认为现在是一个开始发布新闻简报的好时机,帮助大家了解最新动态。

目前,我们可能每隔几周就会发布一个新版本。如果您想在该新闻简报中看到讨论的任何特定主题,请通过 [email protected] 联系我们。


关于 Ansible 2.10 的更新

如果您一直在关注 Ansible 2.10 的开发,您就会知道我们正在将 GitHub 上 ansible/ansible 仓库中的大部分代码拆分到新的集合中。我们在 2019 年 7 月的几篇博文中讨论了这种更改背后的理由 [1] [2]。

对于最终用户来说,没什么大的变化。Ansible 2.10 将包含 Ansible 2.9 中存在的所有模块和插件,并且为 Ansible 2.9 编写的剧本通常应该在 Ansible 2.10 中运行。执行“pip install ansible”的用户应该获得相同的体验。我们预计将有一个较长的测试周期,以帮助确保 2.9 和 2.10 之间的兼容性。

不过,在幕后,开发人员需要了解一些事情: 
  • 内容迁移。在 3 月份,Ansible Core 开发团队冻结了 ansible/ansible 的开发树,并将大部分模块迁移到以下仓库之一

    • community.general 集合,它将成为 Ansible 中发布的大多数社区编写和社区支持的内容的新家,它构建自单个 community.general 仓库 [3],它将遵循与 Ansible 以前遵循的流程基本相同的开发流程;

    • 一组更具体的社区集合,包括: 

      • community.networking 集合 [4],它提供各种社区编写和社区支持的网络模块;

      • community.crypto 集合 [5],一个包含相关加密模块的集合,拥有一个活跃的工作组;

      • community.grafana 集合 [6],一个包含用于管理 Grafana 的模块的集合;

      • 以及由 Ansible 社区成员管理的各种其他集合;

    • 合作伙伴集合,由 Ansible 合作伙伴编写、维护和支持,可以在此处找到当前列表 [7]。

  • 新的 ansible-base 项目。一些模块保留在 ansible/ansible 仓库中,它现在是 ansible-base 项目的所在地。Ansible-base 是 Ansible 本身的核心引擎,加上由 Red Hat 维护的一小部分关键模块和库。ansible-base 项目是 Ansible 做所有事情的核心,Red Hat 的 Ansible 团队将继续专注于以高水平的质量和稳定性维护它。除了与 Ansible 一起打包外,Ansible-base 现在也将独立于 Ansible 发布,并且也将与 Red Hat Ansible 自动化平台一起发布。我们当前的目标发布日期为 ansible-base 2.10,即 2020 年 7 月底。请在此处关注我们发布 ansible-base 2.10 的进度 [8]。

  • Ansible 2.10 构建工具。由于 Ansible 2.10 将由单独的集合组成,因此我们正在开发构建工具,这些工具将把这些集合组装成一个单独的 pip 可交付成果。该构建代码的初始版本可以在这里找到 [9],我们预计在未来几天内将发布我们的第一个 Ansible 2.10 alpha 版本。请关注号角、Ansible 开发者邮件列表和其他地方的公告。 

  • GitHub 重定向工作。现在,Ansible 的大部分源代码已经迁移,潜在贡献者可能并不总是清楚应该在何处提交问题或 PR。我们将开发工作流程工具,以将贡献者引导到新的内容位置。我们还将开发工具,以便贡献者可以轻松地重新提交现有 PR 或问题到新的仓库中。请在此处关注我们 GitHub 重定向工作的状态 [10]。

我们现在还处于这个过程的早期阶段,但我们已经取得了很大进展。假设一切按计划进行,我们应该有望在 2020 年 10 月的 AnsibleFest 发布 Ansible 2.10,或者可能更早。

您可以在这里 [11] 和这里 [12] 跟踪 Ansible 2.10 的发布进度。
 

ANSIBLE 贡献者峰会 

3 月 29 日,我们举办了首次全虚拟 Ansible 贡献者峰会。该活动最初计划与瑞典哥德堡的 FOSS North 联合举办,但 COVID-19 改变了我们的计划。 

尽管无法亲自见面,但贡献者峰会仍然取得了成功,有近 50 名贡献者参加了当天的活动。您可以查看直播活动的视频 [13],以及详细的摘要 [14] 和相应的 IRC 会话的完整日志 [15]。 

3 月 30 日,我们继贡献者峰会之后举办了一场虚拟黑客马拉松,继续跟进讨论的许多问题。黑客马拉松的摘要 [16] 和完整日志 [17] 也已提供。 

将来,我们预计每季度举办一次这样的虚拟贡献者峰会,这意味着下一次活动应该在 2020 年 6 月底前后举行。我们将轮换这些会议的开始时间,以便它们更容易被全球各地的人们访问。 
 

社区指标亮点:集合增长 

随着 Ansible 社区的不断发展,我们越来越依赖指标来跟踪我们朝着目标的进展。 

我们关注的重点领域之一是集合贡献者。随着我们转向集合,我们希望确保我们的贡献者能够成功地进行过渡。我们有一个仪表板可以显示每个集合从其在 ansible/ansible 中的原始开发中恢复动量的进度。以下是一个仪表板的示例: 

您可以在此处查看完整的仪表板 [18]。 


反馈 

您有任何想问的问题或想看到的问题吗?请发送电子邮件到 [email protected]

如果您认识的人可能需要阅读此简报,请随时转发给他们。




Ansible 和 Check Point 入门

Ansible 和 Check Point 入门

现代基础设施的规模和复杂性要求您不仅能够为系统定义安全策略,还能够以编程方式应用该策略,或者对外部事件做出反应时进行更改。  因此,适当的自动化工具是必要的构建块,使您能够以快速、简单和一致的方式应用适当的操作。

Check Point 提供了一个经过认证的 Ansible 内容集合模块,帮助组织自动化其响应和补救实践,并采用 DevOps 模型以提高运营效率来加速应用程序部署。这些模块基于 Check Point 安全管理 API,也位于 Ansible Galaxy 中,在 Check Point 管理服务器的 上游版本集合 中。 

操作流程与 API 相同,与 Check Point 安全管理 GUI SmartConsole 相同, 登录 > 获取会话 > 进行更改 > 发布 > 注销。 

安全专业人员可以利用这些模块来自动化各种任务,以识别、搜索和响应安全事件。  此外,与作为 Ansible 安全自动化的其他模块相结合,可以将现有的 Check Point 基础设施集成到涉及多种安全技术的协同流程中。  

DevOps 专业人员可以在自动化工作流中使用相同的模块来支持物理和虚拟化下一代防火墙的部署和维护。

为了更好地了解如何使用这些新模块,我将提供一些基于安全自动化社区项目中的代码的示例,该项目位于 Ansible 安全自动化 示例 Play GH 存储库 中。  集成正常工作和运行的先决条件是 Check Point R80 版本受到此集成的支持,因为应用了此 热修复

Ansible Check Point 模块

cp_mgmt_* 模块已随 Ansible 2.9 发布。它们目前可以在 文档 的“最新”分支中找到。

有相当多的模块可用于管理 Check Point 设备,在 Check Point Mgmt 集合中,它们被分为两类

  • cp_mgmt_*:所有这些模块都使用上述 API 在 Check Point 设备上 发布 API 对象。
  • cp_mgmt_*_facts:所有事实模块都使用相同的 API 从 Check Point 设备获取事实。

例如,如果我们查看专门用于主机对象的模块,则它以以下方式体现

  • cp_mgmt_host - 管理 Check Point 设备上的主机对象,包括创建、更新和删除对象。
  • cp_mgmt_host_facts - 获取 Check Point 设备上的主机对象事实。

还有总共九个 checkpoint_* 模块,它们是在 Ansible 2.8 中引入的,但这些模块已弃用,建议您使用在 Ansible 2.9 中引入的最新 cp_mgmt_* 模块,除非需要。

cp_mgmt_* 模块示例:如何执行主机配置

以下是如何使用 cp_mgmt_host 模块配置 主机 的示例

---
- hosts: check_point
  connection: httpapi
  tasks:
    - name: Create host object
      cp_mgmt_host:
        color: dark green
        ipv4_address: 192.0.2.2
        name: New CP_MGMT Host 1
        state: present
        auto_publish_session: true

当模块参数 auto_publish_session 设置为 True 时,您将使 Ansible 运行以立即在您的 Check Point 设备上生效。  然后,您必须 发布 更改,这就是 auto_publish_session 的作用。  请注意,默认情况下,auto_publish_session 的值为 False。如果用户希望在 任务 级别发布更改,则可以使用此模块参数。

但是,如果我们希望在 play 运行结束时,在运行 “n” 个任务后发布更改,我们只需在 play 结束时运行可用的 cp_mgmt_publish 模块,所有完成的更改都会在您的 Check Point 设备上生效。

要运行 playbook,请使用 ansible-playbook 命令

Checkpoint blog one

要检查这是否已按预期有效地更改了 Check Point 配置,请登录到 Check Point SmartConsole,然后在 网络对象 -> 主机 下查看,我们将看到列出的新主机

checkpoint blog two

模块可以保持状态(如果适用),因此当我们重新运行 playbook 时,它不会显示“已更改”,而是显示 OK,而不会对 Check Point 设备进行任何更改。这也被称为 幂等性(另请参见 Ansible 文档)。

checkpoint blog three

示例:如何收集主机事实

Check Point 事实 模块允许我们查询不同的 Check Point 对象,例如网络、地址、DNS 域、主机记录等等。

让我们看一下专注于获取有关通过上一个示例 playbook 配置的 主机 信息的 Ansible Playbook 代码段

---
- hosts: check_point
  connection: httpapi
  tasks:
    - name: collect-host facts
      cp_mgmt_host_facts:
        name: New CP_MGMT Host 1
      register: cp_host
    - name: display host facts
      debug:
        msg: "{{ cp_host }}"

使用 ansible-playbook 命令运行 playbook,如下所示

checkpoint blog four

Play 输出:与查询主机名 “New CP_MGMT Host 1” 相关的所有主机事实

上面的 playbook 演示了如何查询 Check Point 以收集有关对象(在本例中为主机)的特定信息。然后可以通过 Ansible play 使用这些事实,并允许设备或设备组充当可能正在发生变化的信息的单一事实来源。要详细了解 Ansible 变量、事实和 set_fact 模块,请参阅 Ansible 变量文档

如何在响应和补救场景中使用 Check Point 模块

Ansible 安全自动化支持 SOC 或安全团队在其响应和补救活动中使用的多种安全技术之间的互操作性。 

为了帮助安全专业人员将 Ansible 作为安全通用自动化语言,我们编写了一些角色,可以立即使用这些角色来加速这些场景中的工作效率。

这些角色的一个示例是 acl_manager,它可以用来自动化任务,例如在支持的技术(如 Check Point NGFW)上阻止和取消阻止 IP 和 URL。 

如何使用 acl_manager 角色在 Check Point 中阻止 IP

---
- hosts: checkpoint
  connection: httpapi
  tasks: 
   - include_role:
       name: acl_manager
       tasks_from: blacklist_ip
     vars:
       source_ip: 192.0.2.2
       destination_ip: 192.0.2.12
       ansible_network_os: checkpoint

角色可以用来抽象常见的安全任务,以无缝地支持特定用例,而无需深入了解底层模块功能。

Check Point 管理 API 和其他 Check Point API 在 Check Point API 参考 中定义。




将现有内容迁移到专用的 Ansible 集合

将现有内容迁移到专用的 Ansible 集合

今天,我们将演示如何将现有 Ansible 内容(模块和插件)的一部分迁移到专用的 Ansible 集合。我们将使用用于管理 DigitalOcean 资源的模块作为示例,以便您可以按照说明进行操作并测试您的开发设置。但首先,让我们先解决一个大问题:为什么要这样做? 

Ansible 瘦身

在 2020 年 3 月下旬,Ansible 的主要开发分支丢失了几乎所有的模块和插件。它们去了哪里?其中许多模块已移至 ansible-collections GitHub 组织。更具体地说,绝大多数模块都位于 community.general GitHub 存储库中,该存储库是它们临时的“家”(有关更多信息,请参阅 社区概览 README)。 

最终目标是让尽可能多的内容在 community.general Ansible 集合中被一个负责的开发人员团队“采用”,并转移到一个专门的上游位置,并拥有一个专门的 Galaxy 命名空间。 迁移到新位置的 Ansible 集合的维护者可以根据需要设置开发和发布流程,(几乎)不受 community.general 集合要求的限制。有关 Ansible 内容交付的未来,请参阅 官方博客文章Steampunk 视角,以及 AnsibleFest 讨论,了解 Ansible 集合。 

话不多说,让我们动手创建一个全新的 DigitalOcean Ansible 集合。

迁移过程

我们选择将 DigitalOcean 相关内容进行迁移,主要有三个原因:

  1. 它包含足够多的内容,迁移并非易事(我们将在迁移过程中使用一些自制工具)。
  2. DigitalOcean 模块使用标准功能,例如文档片段和实用程序 Python 包,这意味着仅仅将模块复制过来是不够的。
  3. 它目前是 community.general Ansible 集合的一部分。

编辑 (2020-09-23): DigitalOcean 模块已于 2020 年 7 月迁移到 community.digitalocean 集合,因此上面列表中的最后一个要点不再有效。但我认为,这次迁移证实了我们对示例的选择是正确的。

因此,内容迁移是一个多步骤过程,这并不奇怪。我们需要创建一个工作目录,将 community.general Ansible 集合克隆到其中,并创建一个空的目的地集合。但在我们进行任何操作之前,必须确定这个新的 Ansible 集合的名称。

众所周知,计算机科学中最难的两件事是:缓存失效、命名和 off-by-one 错误;) 幸运的是,在我们的案例中,找到一个合适的名称相对容易:因为我们正在迁移所有用于处理 DigitalOcean 云平台的模块,所以我们将将其命名为 digital_ocean.digital_ocean

$ mkdir -p ~/work/ansible_collections
$ cd ~/work/ansible_collections
$ mkdir community
$ git clone --depth 1 --branch 0.2.0 \
    https://github.com/ansible-collections/community.general.git \
    community/general
$ ansible-galaxy collection init digital_ocean.digital_ocean
$ cd digital_ocean/digital_ocean

目录就绪后,我们可以开始将内容复制到新的 Ansible 集合中。但我们不会仅仅将模块迁移过来,我们还将利用这次机会重命名模块。 

与 DigitalOcean 相关的模块名称都以 digital_ocean_ 为前缀,因为在 Ansible 2.8 之前,所有模块都位于同一个全局命名空间中。现在我们将其迁移到一个单独的命名空间,可以安全地去掉该前缀。我们可以手动执行此操作,但编写几行 Bash 代码会更快,而且更令人满意: 

$ source=../../community/general
$ mkdir -p plugins/modules
$ for m in $(find $source/plugins/modules/ -name 'digital_ocean_*.py' -type f)
> do
>   new_name=$(basename $m | sed 's/digital_ocean_//')
>   echo "  Copying $(basename $m) -> $new_name"
>   cp $m plugins/modules/$new_name
> done

接下来,我们需要复制模块使用的实用程序 Python 文件。我们可以通过搜索 module_utils 导入来获取所有此类模块的列表。

$ grep -h "ansible_collections.community.general.plugins.module_utils." \
    plugins/modules/*.py | sort | uniq

我们需要迁移一个 Python 文件,然后修复导入语句,这很容易自动化。

$ mkdir plugins/module_utils
$ cp ../../community/general/plugins/module_utils/digital_ocean.py \
    plugins/module_utils/
$ sed -i -e 's/ansible_collections.community.general.plugins/./' \
    plugins/modules/*.py

最后需要修复的是文档。因为我们在迁移过程中重命名了模块,所以需要从模块的 DOCUMENTATION 块中去掉 digital_ocean_ 前缀:digital_ocean_${module_name} 部分。我们还需要调整 EXAMPLES 部分,并用完全限定的名称替换旧的模块名称。再次使用 sed。

$ sed -i -r \
    -e 's/module: +digital_ocean_([^ ]+)/module: 1/' \
    -e 's/digital_ocean_([^ ]+):/digital_ocean.digital_ocean.1:/' \
    plugins/modules/*.py

我们还需要复制模块使用的所有文档片段。我们可以通过在模块中搜索 community.general. 字符串来识别它们: 

$ grep -h -- "- community.general." plugins/modules/*.py | sort | uniq

现在,我们必须重复对实用程序文件执行的步骤:复制文档片段文件并更新引用。同样,因为我们的片段现在拥有自己的专用命名空间,所以可以将其重命名为更具意义的名称。由于我们的文档片段包含通用参数的定义,所以我们将将其命名为 common。我们保证这是我们使用 sed 和正则表达式进行的最后一次修复。;)

$ mkdir plugins/doc_fragments
$ cp ../../community/general/plugins/doc_fragments/digital_ocean.py \
    plugins/doc_fragments/common.py
$ sed -i -e 's/community.general.digital_ocean.documentation/digital_ocean.digital_ocean.common/' \
    plugins/modules/*.py

我们完成了。是时候给自己鼓掌并提交工作了。

$ git init && git add . && git commit -m "Initial commit"

如果您只对这次迁移的最终结果感兴趣,可以从 digital_ocean.digital_ocean GitHub 存储库下载。

体验新的集合

如果要测试新创建的 DigitalOcean Ansible 集合,需要告诉 Ansible 在哪里搜索它。可以通过设置 ANSIBLE_COLLECTIONS_PATHS 环境变量来指向工作目录。我们如何知道是否一切正常?我们将礼貌地要求 Ansible 为我们打印模块文档。 

$ export ANSIBLE_COLLECTIONS_PATHS=~/work
$ ansible-doc digital_ocean.digital_ocean.domain

如果一切按计划进行,最后一个命令将显示 domain 模块的文档。请注意,我们在最后一个命令中使用了 domain 模块的完全限定集合名称 (FQCN)。如果省略了命名空间和集合名称部分,Ansible 将无法找到我们的模块。

作为最终测试,我们还可以运行一个简单的剧本,例如:

---
- name: DigitalOcean test playbook
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Create a new droplet
      digital_ocean.digital_ocean.droplet:
        name: mydroplet
        oauth_token: OAUTH_TOKEN
        size: 2gb
        region: sfo1
        image: centos-8-x64
        wait_timeout: 500

当我们执行 ansible-playbook play.yaml 命令时,Ansible 会向我们发出警告,因为我们提供了无效的身份验证令牌。但我们不应该难过,因为错误消息证明我们的模块按预期工作。 

下一步

在今天的文章中,我们演示了内容迁移的初始步骤。但此列表尚未结束。如果我们认真维护此类 Ansible 集合,则需要为模块添加测试并设置 CI/CD 集成。 

这篇文章中我们没有涉及的另一个内容是,如何将新创建的 Ansible 集合推送到 Ansible Galaxy。我们之所以不这样做,不是因为发布集合特别困难,而是因为它太容易了。只需获得 digital_ocean 命名空间,然后运行以下两个命令:

$ ansible-galaxy collection build
$ ansible-galaxy collection publish \
    --api-key {galaxy API key here} \
    digital_ocean-digital_ocean-1.0.0.tar.gz

发布一个我们不打算维护的集合,是对 Ansible 社区的损害。质量重于数量。

如果您需要帮助将现有内容迁移到专门的 Ansible 集合中,并在长期内进行维护,请 联系我们的专家,他们将乐于为您提供帮助。

干杯! 




Ansible 集合实践

Ansible 集合实践

Ansible 集合已在我们的两篇博客文章“Ansible 内容集合入门”和“Ansible 内容交付的未来”中介绍。本质上,Ansible 自动化内容将使用集合打包机制进行交付。Ansible 内容是指 Ansible 剧本、模块、模块实用程序和插件。基本上是用户用来创建 Ansible 自动化的所有 Ansible 工具。内容分为两个存储库:

  1. Ansible Galaxy (https://galaxy.ansible.com)
  2. Automation Hub (https://cloud.redhat.com/ansible/automation-hub)

Ansible Galaxy 是用于共享 Ansible 集合的上游社区。任何社区用户都可以创建一个命名空间,并将内容与任何人共享。Automation Hub 的访问权限包含在 Red Hat Ansible Automation Platform 订阅中。Automation Hub 仅包含来自 Red Hat 及其合作伙伴的完全受支持和经过认证的内容。这使 Red Hat 客户更容易确定哪些内容是经过官方认证的,更重要的是,是受支持的内容。这包括来自 Arista、Cisco、Checkpoint、F5、IBM、Microsoft 和 NetApp 等合作伙伴的全部内容。

在本博文中,我们将介绍一个用例,其中用户想要使用来自 Automation Hub 的 Red Hat 认证集合,以及来自 Ansible Galaxy 的社区支持集合。

有不同的方法可以与 Ansible 集合和您的 Ansible 自动化进行交互:

  1. 安装到您的运行时环境或虚拟环境中
  2. 作为 SCM 树的一部分提供
  3. 使用需求文件

无论选择哪种方法,首先都需要找到、识别并获取要使用的 Ansible 集合。

Ansible 剧本存储库结构

以下是此 Ansible 集合演示的设置:

Ajay blog one

  • ansible.cfg 是 Ansible 配置文件。我将在下一节中详细介绍。
  • collections 是一个目录,存储 Ansible 剧本将使用的所有 Ansible 集合
  • inventory 是一个目录,包含一个名为 hosts 的清单文件
  • play.yaml 是我的 Ansible 剧本

对于我的示例,这是一个开发环境,我只想下载最新版本。我将使用一个 gitignore 文件来忽略下载的内容,并且只跟踪需求文件。

Ajay blog two

此 gitignore 文件有助于确保版本控制系统中的剧本存储库内容只跟踪剧本和相关文件。如果您想跟踪 SCM 中使用的 Ansible 集合,只需删除 Git 忽略 (例如,引言中的 2- 作为 SCM 树的一部分提供)。有关使用集合和文件夹结构的更深入了解,请参阅 文档

配置对 Automation Hub 和 Galaxy 的访问权限

要访问来自 Automation Hub 的认证内容,您需要先获取身份验证令牌。登录 https://cloud.redhat.com,然后导航到 https://cloud.redhat.com/ansible/automation-hub/token

Ajay blog three

单击 加载令牌 按钮将显示您的身份验证令牌。将此信息保存到某个位置,我们将在 ansible.cfg 文件中输入此信息。Ansible Galaxy 也具有用于身份验证的 API 令牌,可以通过登录后导航到 https://galaxy.ansible.com/me/preferences 来访问它。

Ajay blog five

单击 显示 API 密钥 按钮以显示您的 API 密钥。

配置 Ansible.cfg

我们在 Ansible 配置文件 (即 *ansible.cfg) 的 [galaxy] 部分下定义 Galaxy 服务器。* Ansible 配置文件是一个用于配置行为设置的 ini 格式文件。这包括更改返回值输出从 JSON 到 YAML 之类的设置。如果您不熟悉 Ansible 配置文件,请参阅 文档。请记住,Ansible 配置文件将按照以下顺序进行搜索:\

  1. ansible.cfg (在当前目录中)
  2. \~/.ansible.cfg (在当前主目录中)
  3. /etc/ansible/ansible.cfg 

现在应该将这些令牌添加到 ansible.cfg 文件中。下面显示了一个示例。建议使用多个 Galaxy 服务器时,将它们列在 server_list 中。列表应按优先级顺序排列,您的主要位置选择应排在首位,在本例中为 Automation Hub。

[defaults]
stdout_callback = yaml
inventory = inventory/hosts
collections_paths = ./collections

[galaxy]

server_list = automation_hub, release_galaxy

[galaxy_server.automation_hub]
url=https://cloud.redhat.com/api/automation-hub/
auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token
token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[galaxy_server.release_galaxy]
url=https://galaxy.ansible.com/
token=xxxxxxxxxxxxxxxxxxxxxx

请注意定义 Automation Hub 存储库和身份验证端点的 urlauth_url 密钥。另请注意,此文件定义了通过 collections_paths 参数 (例如,./collections) 下载集合的位置。有关 Ansible Galaxy 和 Automation Hub 配置的更多信息,请参阅 Galaxy 用户指南

使用需求文件

在本示例中,我将使用 requirements.yml 方法,该方法允许我从单个列表中安装所有集合。如果您熟悉在角色中使用 *requirements.yml* 文件,那么该文件在集合中非常相似。通过示例可以更好地理解这一点。

» cat collections/requirements.yml
collections:
  - name: junipernetworks.junos
    source: https://galaxy.ansible.com

  - name: f5networks.f5_modules
    source: https://cloud.redhat.com/api/automation-hub/

在这里,我们定义了测试剧本所需的 2 个集合。Juniper Networks 的 *junos* 集合将从 Ansible Galaxy 下载,而 F5 Networks 的 *f5_modules 集合* 将从 Automation Hub 下载。

安装集合

现在可以使用以下命令安装集合:

ansible-galaxy collection install -r collections/requirements.yml

在详细模式下运行此命令有助于我们查看正在访问的端点。

Ajay Blog seven

要测试这些新集合中模块的可用性,可以使用 *ansible-doc* 命令。

ansible-doc f5networks.f5_modules.bigip_device_info

我们的简单剧本将从 Juniper 和 F5 设备收集事实 (https://github.com/termlen0/collections_demo/blob/master/play.yaml)。我们可以通过从命令行运行来测试剧本。

Ajay blog eight

如果您不想每次都动态加载最新的集合内容,请注释掉或删除 requirements 文件。这意味着您可以通过手动将剧本所需的每个集合安装到正确的虚拟环境中来控制哪些 Ansible 集合可用。例如,要安装 F5 Networks 集合,您将执行以下命令。

ansible-galaxy collection install f5networks.f5_modules

另一种方法是在您的 SCM(源代码管理)中将所需集合与其他内容一起打包。这意味着您将在开发环境中同步集合,而不是 Ansible Tower 设备。

将来,我们将介绍一种围绕打包集合以及特定 Ansible 版本及其依赖项的更标准化的方法。

结论

Ansible 集合提供了一种有效地模块化和打包自动化内容的方法。Red Hat Automation Hub 托管经过认证的安全集合,这些集合经过 Red Hat 的验证和支持。Ansible Galaxy 托管社区贡献的集合。客户可以从这两个内容存储库访问集合。我认为集合是对 Ansible 采用的“内置电池”方法的超级加速器。它提升了构建自动化的细微差别,使用户能够即插即用由认证合作伙伴和社区构建的最新和最棒的自动化内容。