运行你的第一个命令和Playbook

利用本快速教程学习并应用你所学到的概念。安装 Ansible,手动执行网络配置命令,使用 Ansible 执行相同的命令,然后创建一个 Playbook,以便你可以随时在多个网络设备上执行该命令。

先决条件

在开始本教程之前,你需要:

  • 安装 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 Playbook

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

  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 }}"

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

  1. 使用以下命令运行 Playbook:

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

Playbook 包含一个包含两个任务的 Play,应该会生成如下输出:

$ 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,这是第一个 Playbook 的扩展版本。

---

- 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 }}"

扩展的第一个 Playbook 在一个 Play 中包含五个任务。使用上面相同的命令运行它。输出显示 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

Playbook 返回以下接口事实信息:

"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 资源模块。