运行您的第一个命令和剧本

使用这个快速教程将您学到的概念付诸实践。安装 Ansible,手动执行网络配置命令,使用 Ansible 执行相同的命令,然后创建一个剧本,以便您可以随时在多个网络设备上执行该命令。

先决条件

在完成本教程之前,您需要

  • 已安装 Ansible 2.10(或更高版本)

  • 一个或多个与 Ansible 兼容的网络设备

  • 基本的 Linux 命令行知识

  • 网络交换机和路由器配置的基本知识

安装 Ansible

使用您首选的方法安装 Ansible。请参阅 安装 Ansible。然后返回本教程。

确认 Ansible 的版本(必须为 >= 2.10)

ansible --version

建立到受管节点的手动连接

要确认您的凭据,请手动连接到网络设备并检索其配置。将示例用户和设备名称替换为您真实的凭据。例如,对于 VyOS 路由器

ssh [email protected]
show config
exit

此手动连接还建立了网络设备的真实性,并将它的 RSA 密钥指纹添加到您的已知主机列表中。(如果您之前已连接到该设备,则您已建立了它的真实性。)

运行您的第一个网络 Ansible 命令

您可以使用单个简化的 Ansible 命令检索其配置,而不是手动连接并运行网络设备上的命令

ansible all -i vyos.example.net, -c ansible.netcommon.network_cli -u my_vyos_user -k -m vyos.vyos.vyos_facts -e ansible_network_os=vyos.vyos.vyos
此命令中的标志设置了七个值
  • 应将命令应用到的主机组(在本例中为所有主机)

  • 清单(-i,要定位的设备或设备 - 不带尾随逗号 -i 指向清单文件)

  • 连接方法(-c,连接和执行 ansible 的方法)

  • 用户(-u,SSH 连接的用户名)

  • SSH 连接方法(-k,请提示输入密码)

  • 模块(-m,要运行的 Ansible 模块,使用完全限定的集合名称 (FQCN))

  • 额外的变量(-e,在本例中,设置网络操作系统值)

注意:如果您将 ssh-agent 与 ssh 密钥一起使用,则 Ansible 会自动加载它们。您可以省略 -k 标志。

注意

如果您在虚拟环境中运行 Ansible,您还需要添加变量 ansible_python_interpreter=/path/to/venv/bin/python

创建并运行您的第一个网络 Ansible 剧本

如果您想每天运行此命令,则可以将其保存在剧本中,并使用 ansible-playbook 而不是 ansible 来运行它。剧本可以存储您在命令行中使用标志提供的许多参数,从而减少在命令行中键入的内容。为此,您需要两个文件 - 一个剧本和一个清单文件。

  1. 下载 first_playbook.yml,其内容如下所示

---

- name: Network Getting Started First Playbook
  connection: ansible.netcommon.network_cli
  gather_facts: false
  hosts: all
  tasks:

    - name: Get config for VyOS devices
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the config
      debug:
        msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

剧本设置了上面命令行中七个值中的三个:组(hosts: all)、连接方法(connection: ansible.netcommon.network_cli)和模块(在每个任务中)。通过在剧本中设置这些值,您可以在命令行中省略它们。剧本还添加了第二个任务以显示配置输出。当模块在剧本中运行时,输出将保存在内存中以供将来任务使用,而不是写入控制台。此处的调试任务允许您在 shell 中查看结果。

  1. 使用以下命令运行剧本

ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook.yml

剧本包含一个包含两个任务的剧目,应生成如下输出

$ ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook.yml

PLAY [Network Getting Started First Playbook]
***************************************************************************************************************************

TASK [Get config for VyOS devices]
***************************************************************************************************************************
ok: [vyos.example.net]

TASK [Display the config]
***************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "The hostname is vyos and the OS is VyOS 1.1.8"
}
  1. 现在您可以检索设备配置了,请尝试使用 Ansible 更新它。下载 first_playbook_ext.yml,它是第一个剧本的扩展版本

---

- name: Network Getting Started First Playbook Extended
  connection: ansible.netcommon.network_cli
  gather_facts: false
  hosts: all
  tasks:

    - name: Get config for VyOS devices
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the config
      debug:
        msg: "The hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

    - name: Update the hostname
      vyos.vyos.vyos_config:
        backup: yes
        lines:
          - set system host-name vyos-changed

    - name: Get changed config for VyOS devices
      vyos.vyos.vyos_facts:
        gather_subset: all

    - name: Display the changed config
      debug:
        msg: "The new hostname is {{ ansible_net_hostname }} and the OS is {{ ansible_net_version }}"

扩展的第一个剧本在一个剧目中包含五个任务。使用与上面相同的命令运行它。输出显示了 Ansible 对配置所做的更改

$ ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook_ext.yml

PLAY [Network Getting Started First Playbook Extended]
************************************************************************************************************************************

TASK [Get config for VyOS devices]
**********************************************************************************************************************************
ok: [vyos.example.net]

TASK [Display the config]
*************************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "The hostname is vyos and the OS is VyOS 1.1.8"
}

TASK [Update the hostname]
*************************************************************************************************************************************
changed: [vyos.example.net]

TASK [Get changed config for VyOS devices]
*************************************************************************************************************************************
ok: [vyos.example.net]

TASK [Display the changed config]
*************************************************************************************************************************************
ok: [vyos.example.net] => {
    "msg": "The new hostname is vyos-changed and the OS is VyOS 1.1.8"
}

PLAY RECAP
************************************************************************************************************************************
vyos.example.net           : ok=5    changed=1    unreachable=0    failed=0

从网络设备收集信息

gather_facts 关键字现在支持以标准化的键/值对收集网络设备信息。您可以将这些网络信息馈送到进一步的任务中以管理网络设备。

您还可以将新的 gather_network_resources 参数与网络 *_facts 模块(例如 arista.eos.eos_facts)一起使用,以仅返回设备配置的一个子集,如下所示。

- hosts: arista
  gather_facts: True
  gather_subset: interfaces
  module_defaults:
    arista.eos.eos_facts:
      gather_network_resources: interfaces

剧本返回以下接口信息

"network_resources": {
      "interfaces": [
          {
              "description": "test-interface",
              "enabled": true,
              "mtu": "512",
              "name": "Ethernet1"
          },
          {
              "enabled": true,
              "mtu": "3000",
              "name": "Ethernet2"
          },
          {
              "enabled": true,
              "name": "Ethernet3"
          },
          {
              "enabled": true,
              "name": "Ethernet4"
          },
          {
              "enabled": true,
              "name": "Ethernet5"
          },
          {
              "enabled": true,
              "name": "Ethernet6"
          },
      ]
  }

请注意,gather_network_resources 将所有受支持资源(接口、bgp、ospf 等)的配置数据呈现为信息,而 gather_subset 主要用于获取操作数据。

您可以存储这些信息并直接在另一个任务中使用它们,例如使用 eos_interfaces 资源模块。