使用[Ansible]的配置上下文,在NetBox中作为参数存储位置

首先

这是关于NetBox和Ansible协作功能介绍的第二篇文章。

唯一需要一种选项,将以下内容用中文进行本地化改写:

1. 查看第一篇文章请点击此处。

本次我们将使用NetBox的Config Context功能来获取Ansible的Inventory信息和参数。顺便提一句,我们使用的是Ansible 2.9.x和NetBox 3.0.x版本。

使用条件

要求.{txt|yml}

要从Ansible获取NetBox信息,需要使用netbox.netbox集合。
因此,在此之前,请使用以下命令安装集合和Python模块。

pip install pynetbox
ansible-galaxy collection install netbox.netbox

准备好NetBox的连接信息。

将服务器连接地址和 API Token 用于连接到 NetBox 的 NetBox 服务器的环境变量中定义,并准备执行 Ansible 的服务器。
可以通过 NetBox 用户配置文件中的 NetBox Token 进行创建。

export NETBOX_API=<NetBox IPアドレス or FQDN>
export NETBOX_TOKEN=<NetBox Token>

以动态清单的方式获取NetBox参数

动态库存文件创建

为了将NetBox设备信息作为动态清单获取,您需要创建清单文件。
插件可以使用NetBox,但根据最新文档,它已重定向到netbox.netbox.nb_inventory,因此将来可能会合并到这里。

---
plugin: netbox.netbox.nb_inventory
validate_certs: no # 証明書無視
group_names_raw: yes # 取得したときのグループ名prefixに「group_by」がつかないようにする
strict: yes # APIエラーなどがあれば、以降の処理を止める
device_query_filters:
  - has_primary_ip: yes # デバイス情報にprimary ipがないとインベントリとして読み込まない(primary ip=ansible_hostとなる)
group_by:
  - device_roles # device_roleをAnsibleのグループとする
config_context: yes # config_contextを読み込む
flatten_config_context: yes # config_contextをデバイスパラメータの第一階層にマージする
flatten_custom_fields: yes # カスタムフィールドデバイスパラメータの第一階層にマージする
flatten_local_context: yes # デバイスに設定されているlocal_contextをデバイスパラメータの第一階層にマージする

在v0.2.1(2020/5/20)之前,由于没有flatten_config_context选项,似乎需要使用compose指令将hoge设置为config_context.hoge,但是这个选项的出现使得灵活性大幅提高。

获取库存信息的测试

我们将使用ansible-inventory命令来确认从NetBox中如何获取数据。

ansible-inventory -i netbox_inventory.yml -y
all:
  children:
    center_router:
      hosts:
        rt-center:
          ansible_become: true
          ansible_become_method: enable
          ansible_connection: ansible.netcommon.network_cli
          ansible_host: x.x.x.x
          ansible_network_os: cisco.ios.ios
          device_roles:
          - center_router
          device_types:
          - csr
          is_virtual: false
          local_context_data:
          - null
          locations: []
          manufacturers:
          - cisco
          ospf:
          - interface:
              name: GigabitEthernet2
              ospf_cost: 10
              shutdown: false
            route:
              nexthop: x.x.x.x
              target: x.x.x.x/24
          platforms:
          - ios-xe
          primary_ip4: x.x.x.x
          regions: []
          services: []
          sites:
          - center
          status:
            label: Active
            value: active
          tags: []
          - secondary
    ungrouped: {}

只需执行Playbook并将上述文件作为清单,NetBox将自动从中获取清单信息并进行使用。

通过Config Context进行参数定义。

在先前的库存获取中,我认为可能有ospf和ansible_network_os,但这不是NetBox自动创建的。(如果将来能够自动创建将会很高兴…)

因此,需要使用Config Context功能在NetBox上由用户进行定义。

将Config Context分配给以下对象,该对象将以JSON格式应用于与其绑定的设备。

分配给的对象如下所示(截至版本3.0.x)。

    • Regions

Site Groups

Sites
Device Types

Roles
Platforms
Cluster Groups

Clusters

Tenant Groups
Tenants

Tags

另外,还有一个优先级概念,即使参数发生了冲突,也会优先合并具有较高优先级值的项。

通用参数定义

可以使用类似ansible_connection的参数来连接到设备的Ansible,需要将此参数应用于所有适用的设备类型。 在这种情况下,可以像以下图片所示的方式:”对于所有Platform为ios-xe的设备,定义Cisco的连接信息”。

image.png

随着情况的变化而改变的参数定义

然后,我们还可以利用之前介绍的优先级值来灵活地进行参数更改,即使在临时改变参数的情况下,也无需改变Config Context的参数。

作为一个例子,我想介绍一下在OSPF配置中,如果需要进行临时路由变更的情况下,如何进行Config Context设置。

在事前准备工作中,创建了用于指示路径更改的标签,然后创建了以下两个配置上下文。

    • 通常状態のConfig Context

Priority: 1000

Assignments: 対象ルータのDevice Role

フェイルオーバー時のConfig Context

Priority: 2000

Assignments: 対象ルータのDevice Roleと経路変更タグ

通过这样做,只需为目标设备添加或删除路径更改标签,即可更改参数。

通常情况下的OSPF配置

image.png

更改OSPF设置时的路径调整

image.png

当Config Context具有标有路径更改标记时的结果。

screencapture-54-168-175-45-dcim-devices-4-config-context-2022-01-17-21_30_09.png

获取NetBox数据除设备信息之外的内容

我认为在Playbook中有时会需要获取NetBox信息而非设备信息。

在这种情况下,可以假定API的URL和TOKEN已经被注册到环境变量中,通过使用netbox.netbox.nb_lookup插件可以获取到。

作为示例,您可以在下面的Playbook中获取admin用户的用户ID。

・・・
  tasks:
    - name: パラメータに必要な情報を取得
      set_fact:
        admin_user_id: |
          {{
              query('netbox.netbox.nb_lookup',
                'users',
                api_filter='name=admin',
                validate_certs=false)
              [0].value.id
          }}

最后

配置上下文是一个简单但非常强大的功能。尽管本次未进行介绍,但可以将其与本地上下文和自定义字段进行合并使用,以便灵活管理参数。

然而,由于NetBox无法灵活地设置用户的浏览权限,因此最好不要使用Config Context来管理诸如密码等机密信息。

NetBox在过去提供了一个用于保存Secret信息的机制,名为Secrets。但在某个时点(可能是v2.10.4),它已从标准配置中移除,而成为一个提供额外功能的插件。

另外,我們建議你使用Hashicorp Vault,因為官方文件也推薦使用它,且插件開發非常活躍。所以考慮使用這個會比較好。

请看以下链接

    • https://netbox.readthedocs.io/en/stable/models/extras/configcontext/

 

    • https://docs.ansible.com/ansible/latest/collections/netbox/netbox/nb_inventory_inventory.html

 

    • https://docs.ansible.com/ansible/latest/collections/netbox/netbox/nb_lookup_lookup.html

 

    • https://zaki-hmkc.hatenablog.com/entry/2021/01/29/002540

 

    https://tekunabe.hatenablog.jp/entry/2019/12/21/ansible_netbox_inventory
广告
将在 10 秒后关闭
bannerAds