puppet-prod/site/profiles/templates/helpers/node_lookup.erb
Ben Vincent 7cf2e78cea feat: add sort and count to node_lookup
- add -C option to count number of identical records
- sort responses from node_lookup
2024-06-01 12:09:53 +10:00

77 lines
2.6 KiB
Plaintext

#!/usr/bin/env <%= @venv_path %>/bin/python
import requests
import sys
import argparse
import json
import os
def build_query(node=None, fact_name=None, match=None, show_role=False):
query_filters = []
if node:
query_filters.append(["=", "certname", node])
if fact_name:
query_filters.append(["=", "name", fact_name])
elif show_role:
query_filters.append(["=", "name", "enc_role"])
if match:
query_filters.append(["~", "value", match])
if not query_filters:
return '["=", "name", "enc_role"]'
else:
return json.dumps(["and"] + query_filters)
def query_puppetdb(query):
url = 'http://puppetdbapi.service.consul:8080/pdb/query/v4/facts'
response = requests.get(url, params={'query': query})
process_response(response)
def process_response(response, count_only=False):
if response.status_code == 200:
try:
response_data = response.json()
except ValueError:
print("Error decoding JSON response")
return
if count_only:
fact_counter = Counter(fact['value'] for fact in response_data)
for fact_value, count in fact_counter.items():
print(f"{fact_value}: {count}")
else:
facts = [f"{fact['certname']} {fact['value']}" for fact in response_data]
facts.sort()
for fact in facts:
print(fact)
else:
print(f"Error querying PuppetDB: HTTP {response.status_code}")
print("Response content:", response.text)
def parse_stdin():
for line in sys.stdin:
yield line.split()[0]
def main():
parser = argparse.ArgumentParser(description="Query PuppetDB for nodes.")
parser.add_argument("-n", "--node", help="Node name or partial match")
parser.add_argument("-R", "--role", action="store_true", help="Show the role for matched hosts")
parser.add_argument("-F", "--fact", help="Specify a fact name")
parser.add_argument("-m", "--match", help="Simple pattern match for the value")
parser.add_argument("-C", "--count", action="store_true", help="Show count of rows with the same fact")
args = parser.parse_args()
if not args.node and not sys.stdin.isatty():
for node in parse_stdin():
args.node = node
query = build_query(node=args.node, fact_name=args.fact, match=args.match, show_role=args.role)
query_puppetdb(query)
else:
query = build_query(node=args.node, fact_name=args.fact, match=args.match, show_role=args.role)
query_puppetdb(query)
if __name__ == "__main__":
main()