112 lines
3.6 KiB
Python
Executable File
112 lines
3.6 KiB
Python
Executable File
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
debops-defaults: aggregate all defaults from Ansible roles into one stream
|
|
"""
|
|
# Copyright (C) 2014-2015 Hartmut Goebel <h.goebel@crazy-compilers.com>
|
|
# Part of the DebOps - https://debops.org/
|
|
|
|
# This program is free software; you can redistribute
|
|
# it and/or modify it under the terms of the
|
|
# GNU General Public License as published by the Free
|
|
# Software Foundation; either version 3 of the License,
|
|
# or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will
|
|
# be useful, but WITHOUT ANY WARRANTY; without even the
|
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
# PARTICULAR PURPOSE. See the GNU General Public
|
|
# License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General
|
|
# Public License along with this program; if not,
|
|
# write to the Free Software Foundation, Inc., 59
|
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# An on-line copy of the GNU General Public License can
|
|
# be downloaded from the FSF web page at:
|
|
# https://www.gnu.org/copyleft/gpl.html
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import sys
|
|
import codecs
|
|
import subprocess
|
|
import glob
|
|
import argparse
|
|
import errno
|
|
|
|
reload(sys)
|
|
sys.setdefaultencoding('utf-8')
|
|
|
|
from debops import *
|
|
from debops.cmds import *
|
|
|
|
__author__ = "Hartmut Goebel <h.goebel@crazy-compilers.com>"
|
|
__copyright__ = "Copyright 2014-2015 by Hartmut Goebel <h.goebel@crazy-compilers.com>"
|
|
__licence__ = "GNU General Public License version 3 (GPL v3) or later"
|
|
|
|
def cat(filename, outstream):
|
|
try:
|
|
fh = codecs.open(filename, encoding=sys.getdefaultencoding())
|
|
except IOError, e:
|
|
# This should only happen if the user listed a unknown role.
|
|
outstream.write('%s: %s\n' % (e.strerror, e.filename))
|
|
return
|
|
try:
|
|
# Read input file as Unicode object and pass it to outstream.
|
|
outstream.write(fh.read())
|
|
finally:
|
|
fh.close()
|
|
|
|
def aggregate_defaults(playbooks_path, role_list, outstream):
|
|
# Aggregate role/defaults/main.yml files from all roles into one stream
|
|
roles_path = os.path.normpath(os.path.join(playbooks_path, '..', 'roles'))
|
|
if role_list:
|
|
for role in role_list:
|
|
if not '.' in role:
|
|
role = ROLE_PREFIX + '.' + role
|
|
fn = os.path.join(roles_path, role, 'defaults', 'main.yml')
|
|
cat(fn, outstream=outstream)
|
|
else:
|
|
for fn in glob.glob(os.path.join(roles_path,
|
|
'*', 'defaults', 'main.yml')):
|
|
cat(fn, outstream=outstream)
|
|
|
|
# ---- DebOps environment setup ----
|
|
|
|
def main(role_list):
|
|
project_root = find_debops_project(required=False)
|
|
config = read_config(project_root)
|
|
playbooks_path = find_playbookpath(config, project_root, required=True)
|
|
|
|
# Make sure required commands are present
|
|
require_commands('view')
|
|
|
|
if sys.stdout.isatty():
|
|
# if script is run as standalone, redirect to view
|
|
view = subprocess.Popen(['view', '+set ft=yaml', '-'],
|
|
stdin=subprocess.PIPE)
|
|
try:
|
|
aggregate_defaults(playbooks_path, role_list, view.stdin)
|
|
except IOError, e:
|
|
if e.errno not in (errno.EPIPE, errno.EINVAL):
|
|
# "Invalid pipe" or "Invalid argument"
|
|
raise
|
|
finally:
|
|
view.communicate()
|
|
else:
|
|
# else, send everything to stdout
|
|
aggregate_defaults(playbooks_path, role_list, sys.stdout)
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('role', nargs='*')
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
main(args.role)
|
|
except KeyboardInterrupt:
|
|
raise SystemExit('... aborted')
|