使用[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的连接信息”。

随着情况的变化而改变的参数定义
然后,我们还可以利用之前介绍的优先级值来灵活地进行参数更改,即使在临时改变参数的情况下,也无需改变Config Context的参数。
作为一个例子,我想介绍一下在OSPF配置中,如果需要进行临时路由变更的情况下,如何进行Config Context设置。
在事前准备工作中,创建了用于指示路径更改的标签,然后创建了以下两个配置上下文。
-
- 通常状態のConfig Context
Priority: 1000
Assignments: 対象ルータのDevice Role
フェイルオーバー時のConfig Context
Priority: 2000
Assignments: 対象ルータのDevice Roleと経路変更タグ
通过这样做,只需为目标设备添加或删除路径更改标签,即可更改参数。
通常情况下的OSPF配置

更改OSPF设置时的路径调整

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

获取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