我们想听取您的意见!请帮助我们洞察 Ansible 生态系统的现状。
参与 2024 年 Ansible 项目调查

使用 OSPFV2 资源模块入门

使用 OSPFV2 资源模块入门

随着现代企业网络规模和复杂性的不断增长,简化网络管理的需求变得更加迫切。Ansible 2.9 中引入了资源模块,为用户提供了一种简化网络管理的方法,特别是在跨多个不同产品供应商的情况下。

过去,我们已经介绍了用于 VLAN 管理和 ACLs 的资源模块。然而,简化网络管理并不局限于比较局部的网络设置:开放最短路径优先 (OSPFv2) 是一种用于在单个自治系统 (AS) 中分发 IP 路由信息的协议。它用于较大的网络设置,正如 维基百科页面所述

OSPF 是大型企业网络中广泛使用的 IGP。IS-IS 是另一种基于 LSR 的协议,在大型服务提供商网络中更为常见。

手动管理网络设备的 OSPFv2 可能是一项非常困难且乏味的任务,而且更常见的是需要谨慎执行,因为手动过程更容易出现人为错误。

这篇博文将介绍 VyOS 网络平台的 OSPFV2 资源模块。我们将介绍几个示例,并描述每个状态参数的用例以及我们如何在现实场景中使用它们。

OSPFv2 资源模块示例:Vyos

OSPFv2 资源模块的目标是确保配置在整个基础架构中以更少的精力一致地应用。它简化了管理,并使扩展变得更快、更容易,而无需担心幕后运行的网络平台的实际实施细节。

2019 年 10 月,作为 Red Hat Ansible Engine 2.9 的一部分,Ansible 网络自动化团队引入了资源模块的概念,以使那些在生产环境中自动化各种网络平台的人更容易、更一致地进行网络自动化。

Ansible 内容是指 Ansible 剧本、模块、模块实用程序和插件。基本上所有用户用来创建 Ansible 的 Ansible 工具,以及 OSPFv2 资源模块都是 Ansible 内容集合的一部分。

让我们更详细地了解 OSPFv2 资源模块的工作原理。例如,我们选择 vyos_ ospfv2 资源模块。在本博文中,我们将使用版本 1.1.8(氦)的 VyOS 路由器来执行所有特定于配置管理的操作。此外,为了更好地展示模块的效果,我们将从一些 已配置的 OSPF 版本 2 特定属性 开始。有关详细信息,请查看链接的列表。

访问和使用 VyOS 集合

要下载 VyOS 集合,请参考自动化中心(完全支持,需要 Red Hat Ansible Automation Platform 订阅)或 Ansible Galaxy(上游社区支持)

在我们开始之前,让我们快速解释一下命名网络资源模块背后的原理。注意,对于配置 OSPFV2 路由的资源模块,新添加的模块将根据 IP 地址类型命名。这样做是为了使那些使用现有网络模块的人不会让他们的 Ansible 剧本停止工作,并有足够的时间迁移到新的网络自动化模块。

以下支持的平台也提供了用于配置 OSPFv2 的模块

OSPFV2 资源模块提供了与用户在 VyOS 设备上手动配置时相同的级别功能,并具有 Ansible 的所有优势,以及 Ansible 事实收集和资源模块方法的额外优势,该方法与网络专业人员的日常工作更加一致。

用例:OSPFv2 配置更改

使用收集的状态 - 构建 Ansible 库存

资源模块允许用户读取现有网络配置并将其转换为结构化数据模型。state: gathered 等同于为此特定资源收集 Ansible 事实。此示例将读取现有网络配置并将其存储为平面文件。

以下是一个使用 state: gathered 并将结果存储为 YAML 到 host_vars 的 Ansible 剧本示例。如果您不熟悉 Ansible 库存并想了解 group_vars 和 host_vars,请参考 此处的文档。

---
- name: convert configured OSPFV2 resource to structured data
  hosts: vyos
  vars:
    inventory_dir: "lab_inventory"
    inventory_hostname: "vyos"
  gather_facts: false
  tasks:

  - name: Use the OSPFV2 resource module to gather the current config
    vyos.vyos.vyos_ospfv2:
      state: gathered
    register: ospfv2

  - name: Create inventory directory
    file:
      path: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}"
      state: directory

  - name: Write the OSPFV2 configuration to a file
    copy:
      content: "{{ {'ospfv2': ospfv2['gathered']} | to_nice_yaml }}"
      dest: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}/ospfv2.yaml"

使用 ansible-playbook 命令执行 Ansible 剧本

$ ansible-playbook example.yml

这是从棕色字段配置中的读取/收集操作创建的数据结构

$ cat nw_inventory/host_vars/vyos/ospfv2.yaml
ospfv2:
  areas:
  - area_id: '2'
    area_type:
      normal: true
    authentication: plaintext-password
    shortcut: enable
  - area_id: '4'
    area_type:
      stub:
        default_cost: 20
        set: true

您可以在 state: gathered 参考 gist 中查看此示例的完整详细输出列表。

使用合并状态 - 推送配置更改

合并状态将获取您的 Ansible 配置数据(即 Ansible 变量)并将它们合并到网络设备的运行配置中。这不会影响 Ansible 配置数据中未指定的现有配置。让我们通过一个示例来演示。

我们将修改在第一个示例中创建的平面文件,其中包含 要合并的配置

以下是最重要的部分

areas:
 - area_id: '2'
   area_type:
     normal: true
   authentication: "plaintext-password"
   shortcut: 'enable'
 - area_id: '3'
   area_type:
     nssa:
       set: true

现在让我们创建一个 Ansible 剧本,将此新配置合并到网络设备的运行配置中

---
- name: Merged state play
  hosts: vyos
  gather_facts: false
  tasks:
    - name: Merge OSPFV2 config with device existing OSPFV2 config
      vyos.vyos.vyos_ospfv2:
        state: merged
        config: "{{ ospfv2 }}"

使用 ansible-playbook 命令执行 Ansible 剧本

$ ansible-playbook merged.yml

并且,一旦我们运行相应的合并操作,所有提供的参数都将在 VyOS 路由器上配置,Ansible changed=True.

请注意合并操作后的网络配置

vyos@vyos:~$ show configuration commands | grep ospf
set protocols ospf area 2 area-type 'normal'
set protocols ospf area 2 authentication 'plaintext-password'
set protocols ospf area 2 shortcut 'enable'
set protocols ospf area 3 area-type 'nssa'
set protocols ospf area 4 area-type stub default-cost '20'

请注意,此列表仅显示了一些重点内容;完整的列表在 合并的 gist 中提供。

让我们看看通过此操作发生了哪些变化:如果我们查看设备输出,有一些观察结果

  • 具有 area_id '3' 的属性区域已添加到 OSPF 区域列表中。
  • 为 OSPF 配置了 redistribute 和参数属性。
  • 如果已配置了具有区域的 OSPF,并且用户想要更新该特定区域的任何参数,那么用户还可以使用合并状态来更新 OSPFv2 下的区域。

在第二次运行时,相应的合并操作将再次运行,Ansible 的幂等性特性就会发挥作用。如果没有变化,操作运行结果为 changed=False,这向用户确认操作中提供的配置已经在 IOS 设备上配置好了。

使用替换状态 - 替换配置

如果用户想要使用提供的 OSPFv2 配置完全重新配置 VyOS 设备的预配置 OSPFv2,那么资源模块的 replaced 状态就会发挥作用。

替换操作的范围取决于各个进程。在 VyOS 的情况下,只支持一个进程。因此,替换状态的行为类似于覆盖状态。因此,在 VyOS 模块中不需要专门的覆盖状态。其他支持多个 OSPFv2 进程的网络平台确实具有覆盖状态操作。

使用覆盖状态,用户可以使用用户提供的 OSPFv2 配置覆盖所有 OSPFv2 资源属性。由于此资源模块状态会覆盖资源模块的所有预先存在的属性,因此应谨慎使用覆盖状态,因为 OSPFv2 配置非常重要;如果所有配置被错误地替换为操作输入配置,可能会给网络管理员造成不必要的麻烦。

在这种情况下,已经在 VyOS 设备上配置了具有 'n' 个区域的 OSPF,现在用户想要用一组新的区域更新区域列表,并丢弃所有已配置的 OSPF 区域。在这种情况下,资源模块的替换状态将是一个理想的选择,顾名思义,替换状态将用用户作为输入提供的新的区域集替换现有的 OSPF 区域列表。

如果用户尝试配置任何不在设备上预先配置的新的 OSPFv2 区域/属性,它将作为合并状态起作用,并且 vyos_ospfv2 模块将尝试在替换操作中配置用户作为输入提供的 OSPF 区域。

我们将修改在第一个示例中创建的平面文件

areas:
 - area_id: '2'
   area_type:
     normal: true
   authentication: "plaintext-password"
   shortcut: 'enable'
 - area_id: '4'
   area_type:
     stub:
      default_cost: 20

如果您想了解更多详细信息,请查看 完整的输入配置结构

同样,我们创建一个 Ansible 剧本,将此新配置合并到网络设备的运行配置中

---
- name: Replaced state play
  hosts: vyos
  gather_facts: false
  tasks:
    - name: Replace OSPFV2 config with device existing OSPFV2 config
      vyos.vyos.vyos_ospfv2:
        state: replaced
        config: "{{ ospfv2 }}"

一旦我们运行相应的替换操作,所有提供的参数都将覆盖 VyOS 路由器上所有现有的 OSPFv2 资源特定配置,Ansible changed=True

替换操作后的网络设备配置

vyos@vyos:~$ show configuration commands | grep ospf
set protocols ospf area 2 area-type 'normal'
set protocols ospf area 2 authentication 'plaintext-password'
set protocols ospf area 2 shortcut 'enable'
set protocols ospf area 4 area-type stub default-cost '20'
set protocols ospf area 4 network '192.0.2.0/24'

查看 相应的 gist 以了解更多详细信息。

如果我们深入研究上面的输出,我们会注意到以下变化

  • 替换会否定所有预先存在的 OSPFv2 资源特定属性,并删除不在替换操作中的配置。在上面的示例中,ospfv2 区域 ID 3 已被删除。
  • 对于预先存在且也在操作中的 OSPFv2 配置,vyos_ospfv2 替换状态将尝试删除/否定所有预先存在的 OSPFv2 配置,然后配置操作中提到的新 OSPFv2 配置。
  • 对于任何不存在的 OSPFv2 特定属性,替换状态将以与合并状态相同的方式配置 OSPFv2。在上面的示例中,为 OSPFv2 区域 ID 4 配置了一个新的网络地址。

使用上述操作的第二次运行,没有报告任何更改,这满足了 Ansible 的幂等性。

使用删除状态 - 删除配置

既然我们已经讨论了如何使用 vyos_ospfv2 资源模块的合并状态和替换状态在 VyOS 设备上配置 OSPFv2 特定属性,现在该讨论如何删除预配置的 OSPFv2 属性以及删除操作状态对用户提供的粒度级别了。

一次性删除所有 OSPFV2 配置会导致从 VyOS 设备中删除所有预先配置的 OSPFV2 特定属性。但话说回来,这是一个非常关键的删除操作,如果没有谨慎使用,它有能力删除所有预先配置的 OSPFV2,并可能导致生产环境中的路由器没有任何预先配置的 OSPFV2 属性

让我们创建一个 Ansible Playbook 将此新配置合并到网络设备的运行配置中

---
- name: Deleted state play
  hosts: vyos
  gather_facts: false
  tasks:
    - name: Delete ALL OSPFV2 config
      vyos.vyos.vyos_ospfv2:
        state: deleted

执行 playbook 后,网络设备配置发生了变化

vyos@vyos:~$ show configuration commands | grep ospf
vyos@vyos:~$

请务必查看 更改值的完整列表。如果我们简要分析上面的输出,我们可以看到所有 ospfv2 资源特定的配置都已从网络配置中删除。

使用 state rendered - 开发和离线工作

Ansible 将任务中提供的配置渲染成设备原生格式(例如,VyOS CLI)。Ansible 在结果中的 rendered 键中返回此渲染后的配置。请注意,此状态不会与网络设备通信,可以在离线情况下使用。

要渲染配置,请修改在第一个场景中创建的 YAML 文件。例如,如果这是 vyos_ospfv2 模块,您只需添加几个属性来表明我们再次更改了数据模型。

areas:
 - area_id: '2'
   area_type:
     normal: true
   authentication: "plaintext-password"

查看 相应渲染后的 gist 中的完整列表。

我们创建一个 playbook 来执行此操作

---
- name: Rendered state play
  hosts: vyos
  gather_facts: false
  tasks:
    - name: Render the provided configuration
      vyos.vyos.vyos_ospfv2:
        config: "{{ ospfv2 }}"
        state: rendered

这会产生以下输出

"rendered": [
       "set protocols ospf log-adjacency-changes 'detail'",
       "set protocols ospf max-metric router-lsa administrative",
       "set protocols ospf max-metric router-lsa on-shutdown 10",

查看 相应 gist 以获取更多详细信息。

如果我们深入分析上面的输出,我们可以看到没有任何变化;渲染甚至不需要与实际网络设备建立连接。

使用 state parsed - 开发和离线工作

Ansible 将运行配置选项中的配置解析成 Ansible 结构化数据,并将结果放在 parsed 键中。请注意,此操作不会从网络设备收集配置,因此此状态可以在离线情况下使用。

作为要解析的配置,我们使用设备原生格式的配置

set protocols ospf area 2 area-type 'normal'
set protocols ospf area 2 authentication 'plaintext-password'
set protocols ospf area 2 shortcut 'enable'
set protocols ospf area 4 area-type stub default-cost '20'
set protocols ospf area 4 network '192.0.2.0/24'
set protocols ospf area 4 range 192.0.3.0/24 cost '10'

应用此配置的 playbook 是

---
- name: Parsed state play
  hosts: vyos
  gather_facts: false
  tasks:
    - name: Parse the provided OSPFV2 configuration
      vyos.vyos.vyos_ospfv2:
        running_config:
           "set protocols ospf area 2 area-type 'normal'
            set protocols ospf area 2 authentication 'plaintext-password'
            set protocols ospf area 2 shortcut 'enable'
        state: parsed

执行 playbook 会生成以下输出

"parsed": {
        "areas": [
            {
                "area_id": "2",
                "area_type": {
                    "normal": true
                },
                "authentication": "plaintext-password",
                "shortcut": "enable"
             }

                ]
            }
...

如果我们深入分析上面的输出,我们可以看到没有任何变化,解析操作甚至不需要与实际网络设备建立连接。

注意:解析的输入将作为 running_config 键的值提供。

结论和后续步骤

如上所示,借助 OSPFV2 资源模块,可以极大地简化资源特定配置。用户无需过多关注每个平台的 OSPFV2 实现细节,只需输入实际数据即可。通过使用合并、替换和覆盖参数,我们为网络工程师提供了更大的灵活性,以便他们能够逐步采用自动化。其他操作(如收集、渲染和解析)使事实和这些任务中管理的数据能够得到更好的、更友好的处理。




针对 Chocolatey 的 Ansible 认证内容集合

针对 Chocolatey 的 Ansible 认证内容集合

持续保持 Windows 环境的更新和安全性是一场持久战。使用 Red Hat Ansible Automation Platform 和 Chocolatey,您可以轻松地保持软件更新,并迅速应对数十、数百或数千个节点的错误修复、安全问题和零日漏洞。

我们将带您完成三个简单的步骤,向您展示使用 Chocolatey 和 Ansible 部署和更新软件是多么简单。

开始之前:Windows 先决条件

Ansible 默认使用 Winrm 与 Windows 计算机通信。因此,我们需要确保通过在远程 Windows 计算机上运行 Enable-PSRemoting 来启用它。

为了生产使用,我们建议启用 WinRM 的 HTTPS

下面显示的代码示例都使用用户“ansible”作为默认用户。如果您使用其他用户名,请确保更改它!

步骤 1:配置 Ansible 使用 Chocolatey。

我们需要安装 Chocolatey 模块,以便 Ansible 可以使用它。Chocolatey Ansible 内容集合称为 chocolatey:chocolatey,由 Chocolatey 团队维护。要在 Ansible 服务器上安装集合(因此也安装 win_chocolatey 模块),请运行

ansible-galaxy collection install chocolatey.chocolatey

就这么简单!Ansible 现在可以使用集合中的模块与 Chocolatey 协同工作了。

步骤 2:在远程计算机上安装软件

现在我们已经安装了 win_chocolatey 模块,我们可以继续在远程计算机上安装或管理软件了。

让我们创建一个名为 install_notepadplusplus.yml 的文件,内容如下

---
- hosts: all
  gather_facts: false

  vars_prompt:
    - name: password
      prompt: "Enter the password for the node"

  vars:
      ansible_user: ansible
      ansible_password: "{{ password }}"
      ansible_connection: winrm
      ansible_winrm_transport: ntlm
      ansible_winrm_server_cert_validation: ignore

  tasks:
      - name: Install Notepad++ version 7.8
        win_chocolatey:
          name: notepadplusplus
          version: 7.8

运行 ansible-playbook install_notepadplusplus.yaml -i <ip address>,(注意 IP 地址后面的逗号),在远程计算机上安装 Notepad++。请注意,在本示例中我们没有安装最新版本,因为我们将在下一步中更新到最新版本。

安装完成后,打开 Notepad++ 并按 F1,确保我们安装了请求的版本。

步骤 3:在远程计算机上更新软件

为了确保始终在计算机上安装最新版本的软件,您可以使用 Chocolatey 升级它们。我们将升级到 Notepad++ 的最新版本。

创建一个名为 upgrade_notepadplusplus.yml 的文件,内容如下

---
- hosts: all
  gather_facts: false

  vars_prompt:
    - name: password
      prompt: "Enter the password for the node"

  vars:
    ansible_user: ansible
    ansible_password: "{{ password }}"
    ansible_connection: winrm
    ansible_winrm_transport: ntlm
    ansible_winrm_server_cert_validation: ignore

  tasks:
    - name: Install latest Notepad++
      win_chocolatey:
        name: notepadplusplus
        state: latest

运行 ansible-playbook upgrade_notepadplusplus.yaml -i <ip address>,(注意 IP 地址后面的逗号),在远程计算机上更新(或安装)最新的 Notepad++。安装完成后,打开 Notepad++ 并按 F1,确保我们安装了最新版本。

后续步骤

虽然我们在这篇博文中只处理了一台远程计算机,但 Ansible 允许您将此操作复制到数十、数百甚至数千台远程计算机上。

现在您已经安装了 Ansible Chocolatey 模块,您就可以在计算机上安装、卸载、更新和管理软件包了。Chocolatey Ansible 内容集合中的其他模块使您能够管理 Chocolatey 本身的配置、功能和来源。您可以在 Ansible Galaxy Chocolatey 集合页面 上找到更多信息。

Chocolatey 为组织提供了一种 推荐的架构,其中包括设置内部存储库。为了加快这一过程,有一个 快速部署环境,它可以让您在约两个小时内启动并运行内部存储库(其中已加载了有用的软件包)、用于自动化的 Jenkins 以及用于报告的 Chocolatey 中央管理。

对于 Windows 上的软件包管理,Chocolatey 是首选的软件包管理器。它与 Ansible 协同工作,您可以使用它来更新和管理 Windows 计算机,就像使用 Linux 一样。




使用 Molecule 和 Podman 开发和测试 Ansible 角色 - 第 1 部分

使用 Molecule 和 Podman 开发和测试 Ansible 角色 - 第 1 部分

Red Hat Ansible Automation Platform 的优势之一是,描述自动化的语言不仅可以被少数专门的专家阅读,而且几乎可以被 IT 生态系统中的任何人都阅读。这意味着所有 IT 专业人员都可以参与自动化,从而实现跨团队协作,真正将自动化作为一种文化在组织内部推广。由于有如此多的人参与自动化,因此深入测试自动化内容至关重要。因此,当您开发新的 Ansible 内容(如 playbook、角色和集合)时,最好在将它们用于自动化生产基础设施之前在测试环境中测试这些内容。测试可以确保自动化按设计工作,并避免出现令人不快的意外情况。

测试自动化内容通常是一个挑战,因为它需要部署特定的测试基础设施以及设置测试条件以确保测试的相关性。Molecule 是一个完整的测试框架,可以帮助您开发和测试 Ansible 角色,从而使您能够专注于内容而不是管理测试基础设施。

根据其官方 文档,Molecule 是一个

"旨在帮助开发和测试 Ansible 角色的项目。它提倡一种方法,这种方法会导致开发一致的角色,这些角色编写良好、易于理解和维护。"

Molecule 允许您使用多个实例测试角色,确保它在操作系统和虚拟化环境的不同组合中正常工作。如果没有它,您将不得不单独配置和维护测试环境。您还必须配置与这些实例的连接,并确保它们在每次测试之前都干净且准备就绪。Molecule 以自动和可重复的方式为您管理这些方面。

在本系列文章的两部分中,我们将使用 Molecule 开发和测试一个新的 Ansible 角色。第一篇文章将指导您完成安装和配置 Molecule 的步骤。在第 2 部分中,我们将使用 Molecule 来帮助角色开发。

如果此角色是集合的一部分,请使用此方法来开发和“单元”测试此角色。在以后的文章中,我们将看到如何使用 Molecule 在集合中运行集成测试。

Molecule 使用驱动程序通过不同的技术配置测试实例,包括 Linux 容器、虚拟机和云提供商。默认情况下,它预装了三个驱动程序:Docker 和 Podman 驱动程序用于管理容器,以及 Delegated 驱动程序,允许您自定义集成。其他提供商的驱动程序可以通过开源社区获得。

在本文中,我们将使用 Podman 驱动程序使用 Linux 容器开发和测试一个新的角色。Podman 是一个轻量级 Linux 容器引擎,它不需要运行守护程序,并允许在“无根”模式下执行容器,以提高安全性。

通过将 Molecule 与 Podman 驱动程序结合使用,我们将从头开始开发和测试一个新的 Ansible 角色。这个基本角色部署了由 Apache Web 服务器支持的 Web 应用程序。它必须在 Red Hat Enterprise Linux (RHEL) 8 或 Ubuntu 20.04 操作系统上运行。

此示例展示了一个常见场景,其中角色预计将在不同版本的操作系统上运行。使用 Podman 和 Linux 容器允许我们创建多个实例,以使用所需特定版本测试角色。由于容器很轻量级,因此它们还允许我们在开发角色时快速迭代其功能。在这种情况下,使用容器测试角色是适用的,因为角色只配置正在运行的 Linux 实例。要测试其他配置场景或云基础设施,我们可以使用委托驱动程序或社区提供的其他适当驱动程序。

您需要什么?

要遵循本教程,请使用运行 Linux、Python 3 和 Podman 的物理机或虚拟机。在本示例中,我们运行的是 RHEL 8.2。您还需要将 Podman 配置为运行无根容器。Podman 的安装超出了本文档的范围,因此,有关更多信息,请参考官方 文档。要将 Podman 安装到 RHEL 8 上,您还可以查看 RHEL 8 容器文档

入门

Molecule 可用作 Python 包,因此可以通过 pip 安装。第一步,我们为 Molecule 安装创建一个专门的 Python 环境,并在其中安装它

$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"

请注意,我们使用“lint”选项安装了 Molecule。通过使用此选项,pip 还安装了“yamllint”和“ansible-lint”工具,这些工具允许您使用 Molecule 对角色执行静态代码分析,确保它符合 Ansible 编码标准。

安装会从互联网下载所有依赖项,包括 Ansible。验证已安装的版本

$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6

接下来,让我们使用“molecule”命令初始化一个新的 Ansible 角色。

初始化新的 Ansible 角色

一般来说,在开发新的 Ansible 角色时,您可以通过运行“ansible-galaxy role init”命令来初始化它。在本例中,请改用“molecule”来初始化新的角色。通过这样做,您将拥有与“ansible-galaxy”命令提供的相同角色结构,以及运行 Molecule 测试所需的简单样板代码。

默认情况下,Molecule 使用 Docker 驱动程序来执行测试。由于我们希望使用“podman”执行测试,因此我们需要在使用“molecule”初始化角色时使用选项--driver-name=podman指定驱动程序名称。 

切换回“molecule-blog”目录,并使用此命令初始化新的角色“mywebapp”: 

$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.

Molecule 在名为“mywebapp”的目录中为您的新角色创建了结构。切换到此目录并检查 Molecule 创建的内容

$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

10 directories, 12 files

Molecule 在“molecule”子目录下包含其配置文件。在初始化新的角色时,Molecule 会添加一个名为“default”的单个场景。稍后,您可以添加更多场景来测试不同的条件。在本教程中,我们将使用“default”场景。

验证文件molecule/default/molecule.yml中的基本配置

$ cat molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible

根据我们的要求,此文件为测试指定了 Podman 驱动程序。它还使用容器映像docker.io/pycontribs/centos:7定义了默认平台“instance”,您将在稍后更改它。

与 Molecule v2 不同,Molecule v3 默认情况下不会指定 linter。使用您喜欢的编辑器打开配置文件molecule/default/molecule.yml,以在末尾包含 lint 配置

$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .

保存并关闭配置文件。从项目根目录运行“molecule lint”以对整个项目进行 lint 检查

$ molecule lint

此命令会返回一些错误,因为文件“meta/main.yml”缺少一些必需的值。通过编辑文件“meta/main.yml”并添加“author”、“company”、“license”、“platforms”,并删除末尾的空行来解决这些问题。不带注释 - 为了简洁起见 - “meta/main.yaml”看起来像这样

$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app
  company: Red Hat

  license: MIT

  min_ansible_version: 2.9

  platforms:
  - name: rhel
    versions:
    - 8
  - name: ubuntu
    versions:
    - 20.04

  galaxy_tags: []

dependencies: []

现在重新对项目进行 lint 检查,并验证这一次没有错误。

$ molecule lint
--> Test matrix

└── default
    ├── dependency
    └── lint

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint .

角色已初始化,基本分子配置已到位。接下来,让我们设置测试实例。

设置实例

默认情况下,Molecule 使用“Centos:7”映像定义了一个名为“instance”的单个实例。根据我们的要求,我们希望确保我们的角色适用于 RHEL 8 和 Ubuntu 20.04。此外,因为此角色将 Apache Web 服务器作为系统服务启动,因此我们需要使用启用“systemd”的容器映像。

Red Hat 为 RHEL 8 提供了一个官方 通用基本映像,它启用了“systemd”: 

  • registry.access.redhat.com/ubi8/ubi-init

对于 Ubuntu,没有官方的启用“systemd”的映像,因此我们将使用 Ansible 开源社区的 Jeff Geerling 维护的映像

  • geerlingguy/docker-ubuntu2004-ansible

要启用“systemd”实例,请修改“molecule/default/molecule.yml”配置文件,删除“centos:7”实例,并添加两个新实例。

$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .

使用这些参数,我们将为每个实例挂载临时文件系统“/run”和“/tmp”,以及“cgroup”卷。我们还启用了“SYS_ADMIN”功能,因为它们是运行具有 Systemd 的容器所必需的。

此外,如果您在启用了 SELinux 的 RHEL 8 机器上遵循本教程 - 因为它应该启用 - 您需要将“container_manage_cgroup”布尔值设置为 true 以允许容器运行 Systemd。有关更多详细信息,请参见 RHEL 8 文档

sudo setsebool -P container_manage_cgroup 1

Molecule 使用 Ansible Playbook 来配置这些实例。通过修改“molecule/default/molecule.yml”配置文件中的“provisioner”字典来修改并添加配置参数。它接受 Ansible 配置文件“ansible.cfg”中提供的相同配置选项。例如,通过添加“defaults”部分来更新配置程序配置。将 Python 解释器设置为“auto_silent”以防止出现警告。启用“profile_tasks”、“timer”和“yaml”回调插件以在 playbook 输出中输出性能分析信息。然后,添加“ssh_connection”部分,并禁用 SSH 管道,因为它不适用于 Podman

provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false

保存配置文件,并从角色根目录运行“molecule create”来创建实例

$ molecule create

Molecule 运行配置 playbook 并创建两个实例。您可以通过运行“molecule list”来检查这些实例

$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false

您还可以验证这两个容器是否在 Podman 中运行

$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8

在开发角色时,Molecule 会使用正在运行的实例来测试它。如果测试失败,或者错误导致不可逆转的更改,需要您重新开始,请随时通过运行“molecule destroy”来删除这些实例,并使用“molecule create”重新创建它们。




Bullhorn #8

Ansible Bullhorn banner

The Bullhorn

Ansible 开发者社区的新闻通讯

欢迎使用The Bullhorn,这是我们面向 Ansible 开发者社区的新闻通讯。如果您有任何问题或想要分享的内容,请通过 [email protected] 与我们联系,或在 GitHub 问题中发表评论。
 

ANSIBLE 2.10.0 ALPHA 9 现已提供

Ansible 社区团队于 8 月 14 日宣布了 Ansible 2.10.0 Alpha 9 的可用性。此新的 Ansible 包应该是 Ansible 2.9 的直接替代品;您目前使用的角色和 playbook 应该能够与 ansible-2.10.0 alpha9 配合使用。有关如何下载、测试和报告问题的更多信息,请阅读 Toshio Kuratomi 向 ansible-devel 邮件列表发布的公告
 

ANSIBLE-BASE 2.10.0 现已正式发布

Ansible Base 团队于 8 月 13 日宣布了 ansible-base 2.10.0 的正式发布。此 ansible-base 包仅包含 Ansible 执行引擎、相关工具(例如 ansible-galaxy、ansible-test)以及一小部分内置插件,并且也与更大的 Ansible 发行版捆绑在一起。有关如何下载、测试和报告问题的更多信息,请阅读 Rick Elrod 向 ansible-devel 邮件列表发布的公告
 

ANSIBLE 2.9.12 和 2.8.14 已发布

Ansible Core 团队于 8 月 10 日宣布了 Ansible 2.9.12 和 Ansible 2.8.14 的可用性,两者都是维护版本。请 点击此链接 阅读 Rick Elrod 向 ansible-devel 邮件列表发送的电子邮件,以获取有关新增功能、安装说明以及完整变更日志链接的详细信息。
 

新的/更新的社区集合

Ansible Podman 集合 最近已更新,其中包含新的 Podman 模块:podman_volume 用于管理主机上的 Podman 容器卷,podman_podpodman_pod_info - 用于管理 Podman pod。PodmanBuildah 连接插件现在支持非 root 用户连接。所有模块和插件都支持 Podman v1 和 v2 版本。已修复 podman_container 模块的幂等性的一些错误。您可以在 此处 找到更新的文档。

Red Hat 自动化实践社区创建了一个用于 AWX 和 Tower 配置 的 Galaxy 集合。目标是允许用户将所有 AWX/Tower 对象定义为代码。如果您管理大规模、复杂的 AWX 或 Tower 实例,那么值得查看一下。

最新版本的 IBM z/OS 核心模块集的 beta 版发布更新,其中包括在 Ansible Galaxy 中新增的三个 z/OS 核心模块:zos_mvs_rawzos_lineinfilezos_copy

Zabbix 和 Grafana 的集合现在都已发布到 1.0.0 版,社区在 8 月 16 日周末新发布!它们都已发布到 Ansible Galaxy:Grafana 集合Zabbix 集合
 

集合提案

YANG 和 NETCONF 是与供应商无关的 IETF 标准,主要用于网络设备管理。提案 此处链接 说明了 community.yang 集合中的 Ansible 插件如何简化使用结构化数据管理支持 YANG 和 NETCONF 的设备。这些插件将提供最大的灵活性和简单易用的方法(与 YANG 变体无关)。欢迎社区提出评论/建议/反馈。
 

ANSIBLE-LINT 4.3.0 发布,支持 ANSIBLE 2.10

ansible-lint 社区很高兴地 宣布 ansible-lint 4.3.0 发布。自 v4.2.0.1 以来,此版本包含超过 330 次提交,这些提交是在过去 6 个月中完成的。
 

ANSIBLE 社区统计数据更新

在举办了两次虚拟贡献者峰会(因此进行了两次调查)之后,我们可以开始查看它们提供的数据。Greg 计划在下次峰会后发布一篇更长的文章,分析趋势等,但目前,以下是人们对 7 月峰会的感受——非常积极!


 

来自 ANSIBLE 社区的內容

 

ANSIBLE 社区团队正在招聘

Ansible 社区团队正在招聘工程师,帮助为 Ansible 贡献者提供入职培训。有关更多信息,请参阅以下职位描述  

ANSIBLEFEST 2020 虚拟体验

今年的 AnsibleFest 将采用虚拟体验形式!在 这篇博文 中查看有关该活动的最新详细信息,并 在此 注册。我们还将在 AnsibleFest 期间举办 Ansible 贡献者峰会。更多详细信息将很快发布!
 

ANSIBLE 虚拟聚会

下个月 Ansible 社区将举办以下虚拟聚会
  • Ansible 明尼阿波利斯:使用 Ansible Tower 和集合增强 Cisco ACI 自动化
    • 周四,8 月 20 日 · 中部时间下午 6:30
       
  • Ansible 多伦多 2020 年 8 月(虚拟)
    • 周二,8 月 25 日 · 东部时间中午 12:00
       
  • Ansible 纽约:利用 Ansible 和 Pureport 实现多云网络
    • 周二,8 月 25 日 · 东部时间下午 6:00
       
  • Ansible 伦敦 [虚拟] 聚会 – 9 月 10 日
    • 周四,9 月 10 日 · 格林尼治标准时间下午 5:45
 
注意:对于这些虚拟聚会,参与链接将在您回复参加后可见。如果您对主题感兴趣,无论身在何处,只要时区和语言适合您,就可以参加!
 

反馈

您有任何想要咨询的问题或希望解决的问题吗?请发送电子邮件至 [email protected]

 

 




在 Ansible Tower 中使用来自集合的清单插件

在 Ansible Tower 中使用来自集合的清单插件

许多 IT 环境变得越来越复杂。对于自动化解决方案而言,始终拥有有关哪些节点存在以及需要自动化的最新信息比以往任何时候都更加重要。为了应对这一挑战,Red Hat Ansible Automation Platform 使用 清单:受管节点列表。

最简单的形式,清单可以是静态文件。在开始使用 Ansible 时,这非常理想,但随着自动化的扩展,静态清单文件将不再足够。

  1. 如果发生更改,例如工作负载启动或拆除,我们如何更新和维护所有受管节点的列表?
  2. 我们如何对基础设施进行分类,以便在使用 Ansible 进行自动化时,更具选择性地针对我们要自动化的受管节点?

这两个问题的答案是使用 动态清单:一个脚本或插件,它将转到真实来源并发现需要管理的节点。它还会通过将节点放入组中来自动对节点进行分类,这些组可用于在使用 Ansible 进行自动化时,更具选择性地针对设备。

清单插件 允许 Ansible 用户使用外部平台来动态发现目标主机,并将这些平台用作 Ansible 清单的真实来源。常见的真实来源包括 AWS EC2、Google GCP 和 Microsoft Azure,但 Ansible 还提供了许多其他清单插件。

Ansible Tower 附带 一些开箱即用的清单插件。这些包括前面提到的云示例,以及 VMware vCenter、Red Hat OpenStack Platform 和 Red Hat Satellite。要使用这些清单插件,需要添加可以查询源平台的凭据。之后,这些清单插件可用作 Ansible Tower 中清单的来源。

还有其他清单插件可用,这些插件没有随 Ansible Tower 一起提供,而是由 Ansible 社区编写。随着向 Red Hat Ansible Content Collections 的迁移,这些清单插件已被打包为相应集合的一部分。

在本示例中,我们正在查看 ServiceNow 清单插件。ServiceNow 是一个非常流行的 IT 服务管理平台,客户经常使用 ServiceNow CMDB 来存储其所有设备的详细信息。CMDB 可以为自动化提供额外的上下文。例如,服务器所有者、服务级别(生产/非生产)以及修补和维护窗口。他们的 Ansible 清单插件可用于查询 ServiceNow CMDB,并且作为 可在 Galaxy 上获得的 servicenow.servicenow 集合 的一部分提供。

Git 存储库

要在 Ansible Tower 中使用来自集合的清单插件,我们需要从项目中获取它。Ansible Tower 中的项目是源代码控制存储库(如 git 存储库)的集成。在 Ansible Tower 中,项目用于提取 Ansible Playbook,但也用于提取变量和清单。

我的源代码控制存储库的内容非常简单

├── collections
│   └── requirements.yml
└── servicenow.yml

servicenow.yml 文件包含清单插件的详细信息。在本例中,我们指定了我们要使用的 ServiceNow CMDB 中的正确表格。我们还选择了要作为 host_vars 添加的字段以及有关我们希望它创建的组的一些信息。

$ cat servicenow.yml
plugin: servicenow.servicenow.now
table: cmdb_ci_linux_server
fields: [ip_address,fqdn,host_name,sys_class_name,name,os]
keyed_groups:
  - key: sn_sys_class_name | lower
    prefix: ''
    separator: ''
  - key: sn_os | lower
    prefix: ''
    separator: ''

请注意,此处没有定义我们要连接到的 ServiceNow 实例的详细信息或任何凭据。这些将在稍后的 Ansible Tower 中配置。

需要 collections/requirements.yml 文件,以便 Ansible Tower 可以下载集合,从而下载清单插件。否则,我们将不得不手动在所有 Ansible Tower 节点上安装和维护集合。

$ cat collections/requirements.yml
---
collections:

- name: servicenow.servicenow

将此配置推送到源代码控制存储库后,我们可以在 Ansible Tower 中创建引用该存储库的项目。以下是将 Ansible Tower 链接到我的 github 存储库的示例。请注意 SCM URL。如果存储库是私有的,我们可以选择指定凭据,还可以指定要从中提取的特定分支、标签或提交。

plugin blog image one

创建 ServiceNow 凭据

如前所述,我们的存储库中的配置不包含用于 ServiceNow 的凭据,也不包含要与之通信的 ServiceNow 实例的定义。因此,我们将在 Ansible Tower 中创建凭据来定义这些值。查看 ServiceNow 清单插件的文档,我们可以看到可以设置许多环境变量来定义连接详细信息。例如

= username
        The ServiceNow user account, it should have rights to read cmdb_ci_server (default), or table specified by SN_TABLE

        set_via:
        env:
        - name: SN_USERNAME

在本例中,如果设置了 SN_USERNAME 环境变量,则清单插件将使用它作为用户帐户连接到 ServiceNow。

我们需要设置的其他变量是 - SN_INSTANCESN_PASSWORD

然而,在 Ansible Tower 中,没有用于 ServiceNow 的凭据类型,我们无法输入这些详细信息。幸运的是,对于此类用例,Ansible Tower 允许我们定义 自定义凭据类型

在我们的案例中,ServiceNow 自定义凭据的输入配置如下:

fields:
  - id: SN_USERNAME
    type: string
    label: Username
  - id: SN_PASSWORD
    type: string
    label: Password
    secret: true
  - id: SN_INSTANCE
    type: string
    label: Snow Instance
required:
  - SN_USERNAME
  - SN_PASSWORD
  - SN_INSTANCE

凭据将以相同名称的环境变量的形式公开。这在注入器配置中描述。

env:
  SN_INSTANCE: '{{ SN_INSTANCE }}'
  SN_PASSWORD: '{{ SN_PASSWORD }}'
  SN_USERNAME: '{{ SN_USERNAME }}'

定义了自定义凭据类型后,我们现在可以添加 ServiceNow 凭据,并设置实例、用户名和密码,如下所示:

plugin blog image two

创建库存

最后一步是在 Ansible Tower 中创建库存。我们需要一个名称 - 这里为 ServiceNow:

plugin blog image three

创建库存后,我们现在可以将源附加到它。这里,我们指定之前创建的项目,并在源代码控制库中输入库存 YAML 文件的路径 - 在这种情况下,即项目根目录下的 servicenow.yml。我们还需要关联我们的 ServiceNow 凭据。

plugin blog image four

为了测试设置,我们可以尝试与源同步。按下“全部同步”按钮就可以做到。如果一切配置正确,主机应该被导入到库存中。

plugin blog image 5

注意我们请求的组也被创建了。

总结

在本示例中,我们展示了如何在 Ansible Tower 中使用来自 Collections 的库存插件,并使用 ServiceNow 库存插件。我们还安全地定义了用于对 ServiceNow 实例进行身份验证的凭据。从项目中获取库存插件并不仅仅局限于第三方或自定义插件:这也是修改某些内置库存插件行为的有效方法。这些功能使 Ansible 自动化平台能够无缝集成到现有工具中,同时自动执行日益复杂的 IT 环境。