60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
|
#!/usr/bin/env python3
|
||
|
import argparse
|
||
|
import json
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
from leylines import db, SERVER_NODE_ID
|
||
|
|
||
|
|
||
|
XDG_CACHE_HOME = os.path.expanduser(os.environ.get("XDG_CACHE_HOME", "~/.cache"))
|
||
|
CACHE_DIR = os.path.join(XDG_CACHE_HOME, "leylines")
|
||
|
if not os.path.isdir(CACHE_DIR):
|
||
|
os.mkdir(CACHE_DIR, 0o700)
|
||
|
|
||
|
|
||
|
def get_ansible_config():
|
||
|
server_node = db.get_server_node()
|
||
|
nodes = [node for node in db.get_nodes() if node.ssh_key is not None]
|
||
|
|
||
|
for node in nodes:
|
||
|
nid = node.id
|
||
|
ssh_key = node.ssh_key
|
||
|
ssh_key_path = os.path.join(CACHE_DIR, f"{nid}.key")
|
||
|
if not os.path.isfile(ssh_key_path):
|
||
|
with open(ssh_key_path, "w") as f:
|
||
|
f.write(ssh_key)
|
||
|
|
||
|
return {
|
||
|
"leylines": {
|
||
|
"hosts": [node.name for node in nodes],
|
||
|
"vars": {
|
||
|
"ansible_ssh_user": "haskal",
|
||
|
"ansible_python_interpreter": "auto"
|
||
|
}
|
||
|
},
|
||
|
"_meta": {
|
||
|
"hostvars": {
|
||
|
node.name: {
|
||
|
"ansible_host": str(node.ip),
|
||
|
"ansible_ssh_private_key_file": os.path.join(CACHE_DIR, f"{node.id}.key"),
|
||
|
"leylines_resources":
|
||
|
" ".join([f"{res}=1" for res in db.get_node_resources(node.id)]),
|
||
|
"leylines_ip": str(node.ip),
|
||
|
"leylines_server_addr": str(server_node.ip),
|
||
|
"leylines_is_server": "yes" if node.id == server_node.id else "no"
|
||
|
} for node in nodes
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
parser = argparse.ArgumentParser(description="leylines ansible inventory plugin")
|
||
|
parser.add_argument("--list", action="store_true", help="List inventory")
|
||
|
args = parser.parse_args()
|
||
|
if args.list:
|
||
|
json.dump(get_ansible_config(), sys.stdout)
|
||
|
else:
|
||
|
raise Exception("no action specified")
|