15
15
16
16
from ansible .errors import AnsibleError
17
17
from ansible .plugins .lookup import LookupBase
18
+ from ansible .parsing .splitter import parse_kv
18
19
from ansible .utils .display import Display
19
20
20
21
import pynetbox
40
41
description:
41
42
- The URL to the Netbox instance to query
42
43
required: True
44
+ api_filter:
45
+ description:
46
+ - The api_filter to use.
47
+ required: False
43
48
token:
44
49
description:
45
50
- The API token created through Netbox
59
64
loop: "{{ query('netbox', 'devices',
60
65
api_endpoint='http://localhost/',
61
66
token='<redacted>') }}"
67
+
68
+ This example uses an API Filter
69
+
70
+ tasks:
71
+ # query a list of devices
72
+ - name: Obtain list of devices from Netbox
73
+ debug:
74
+ msg: >
75
+ "Device {{ item.value.display_name }} (ID: {{ item.key }}) was
76
+ manufactured by {{ item.value.device_type.manufacturer.name }}"
77
+ loop: "{{ query('netbox', 'devices',
78
+ api_endpoint='http://localhost/',
79
+ api_filter='role=management tag=Dell'),
80
+ token='<redacted>') }}"
62
81
"""
63
82
64
83
RETURN = """
@@ -161,6 +180,7 @@ def run(self, terms, variables=None, **kwargs):
161
180
netbox_api_token = kwargs .get ("token" )
162
181
netbox_api_endpoint = kwargs .get ("api_endpoint" )
163
182
netbox_private_key_file = kwargs .get ("key_file" )
183
+ netbox_api_filter = kwargs .get ("api_filter" )
164
184
165
185
if not isinstance (terms , list ):
166
186
terms = [terms ]
@@ -180,16 +200,32 @@ def run(self, terms, variables=None, **kwargs):
180
200
raise AnsibleError ("Unrecognised term %s. Check documentation" % term )
181
201
182
202
Display ().vvvv (
183
- u"Netbox lookup for %s to %s using token %s"
184
- % (term , netbox_api_endpoint , netbox_api_token )
203
+ u"Netbox lookup for %s to %s using token %s filter %s "
204
+ % (term , netbox_api_endpoint , netbox_api_token , netbox_api_filter )
185
205
)
186
- for res in endpoint .all ():
187
206
188
- Display ().vvvvv (pformat (dict (res )))
207
+ if netbox_api_filter :
208
+ filter = parse_kv (netbox_api_filter )
209
+
210
+ Display ().vvvv ("filter is %s" % filter )
211
+
212
+ for res in endpoint .filter (** filter ):
213
+
214
+ Display ().vvvvv (pformat (dict (res )))
215
+
216
+ key = dict (res )["id" ]
217
+ result = {key : dict (res )}
218
+
219
+ results .extend (self ._flatten_hash_to_list (result ))
220
+
221
+ else :
222
+ for res in endpoint .all ():
223
+
224
+ Display ().vvvvv (pformat (dict (res )))
189
225
190
- key = dict (res )["id" ]
191
- result = {key : dict (res )}
226
+ key = dict (res )["id" ]
227
+ result = {key : dict (res )}
192
228
193
- results .extend (self ._flatten_hash_to_list (result ))
229
+ results .extend (self ._flatten_hash_to_list (result ))
194
230
195
231
return results
0 commit comments