Skip to content
This repository has been archived by the owner on Jun 29, 2022. It is now read-only.

Commit

Permalink
Merge 78f3f09 into 5d50ed3
Browse files Browse the repository at this point in the history
  • Loading branch information
noahl committed Jul 9, 2017
2 parents 5d50ed3 + 78f3f09 commit 63c78e3
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 29 deletions.
100 changes: 80 additions & 20 deletions library/spit_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

import csv
import os
import json
from ansible.module_utils.basic import AnsibleModule


Expand All @@ -29,26 +28,85 @@ def __init__(self, module):
self.module = module
self.name = module.params['name']
self.file_path = module.params['file_path']
self.vals = module.params['vals']
self.all_vars = module.params['all_vars']
self.desired_facts = module.params['desired_facts']

def write_to_csv(self):
"""Output report data to file in csv format"""
f_path = os.path.normpath(self.file_path)
with open(f_path, 'w') as write_file:
file_size = os.path.getsize(f_path)
vals = self.vals
fields = vals[0].keys()
fields.sort()
writer = csv.writer(write_file, delimiter=',')

# The results come in two parts. Results from the single
# Ansible module which includes all of Rho's Python modules
# appear in all_vars['res']. Other results appear as other
# keys in all_vars. To avoid printing extra Ansible
# information, we only output data that is known to come from
# Rho unless the user requests it via 'desired_facts':

# Keys that appear in 'res' objects
res_keys = set()
# Keys that appear in the top-level host vars
other_keys = set()

# Flatten the data and update res_keys and other_keys
flat_vars = {}
for host, data in self.all_vars.iteritems():
# Need to update the keys with every host's set in
# case some commands failed on some hosts but not
# others.
res_keys.update(data['res'].keys())

# flat_data is a dictionary in which all of the facts
# we want to output are keys, and their values are the
# corresponding values in the dict.
flat_data = data.copy()
del flat_data['res']
other_keys.update(flat_data.keys())

flat_data.update(data['res'])
flat_vars[host] = flat_data

# We know a key came from Rho if either it was in a 'res'
# attribute or it starts with 'rho'. If we don't know it's
# from Rho, we default to not printing it, because some
# Ansible keys contain information users probably wouldn't
# want to release accidentally (like the path to their SSH
# key). They can always override this by setting
# 'desired_facts'.
if self.desired_facts != ['default']:
keys = set(self.desired_facts)
else:
keys = res_keys
for key in list(other_keys):
if key.startswith('rho'):
keys.add(key)

# Filter the data to only what we want. This is not
# necessary just for writing the CSV, but we also output
# this information as an Ansible variable.
filtered_vars = {host:
{fact: value
for (fact, value) in flat_data.iteritems()
if fact in keys}
for host, flat_data in flat_vars.iteritems()}

normalized_path = os.path.normpath(self.file_path)
with open(normalized_path, 'w') as write_file:
# Construct the CSV writer
writer = csv.DictWriter(write_file, sorted(keys),
extrasaction='ignore', delimiter=',')

# Write a CSV header if necessary
file_size = os.path.getsize(normalized_path)
if file_size == 0:
writer.writerow(fields)
for data in vals:
sorted_keys = data.keys()
sorted_keys.sort()
sorted_values = []
for k in sorted_keys:
sorted_values.append(data[k])
writer.writerow(sorted_values)
writer.writeheader()

# Write the data
for data in filtered_vars.itervalues():
writer.writerow(data)

# Save the data for our results
# pylint: disable=attribute-defined-outside-init
self.filtered_vars = filtered_vars
self.keys = list(keys)


def main():
Expand All @@ -59,15 +117,17 @@ def main():
fields = {
"name": {"required": True, "type": "str"},
"file_path": {"required": True, "type": "str"},
"vals": {"required": True, "type": "list"}
"all_vars": {"required": True, "type": "dict"},
"desired_facts": {"required": True, "type": "list"}
}

module = AnsibleModule(argument_spec=fields)

results = Results(module=module)
results.write_to_csv()
vals = json.dumps(results.vals)
module.exit_json(changed=False, meta=vals)
module.exit_json(changed=False,
meta={'filtered_vars': results.filtered_vars,
'keys': results.keys})


if __name__ == '__main__':
Expand Down
3 changes: 3 additions & 0 deletions rho_playbook.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
hosts: all
roles:
- collect
- collect_brms_raw
- collect_fuse_raw
- collect_jboss_raw


- name: Write default facts first to a variable and then to csv locally
Expand Down
29 changes: 29 additions & 0 deletions roles/collect_brms_raw/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

---
# This will scan linux systems for JBoss BRMS or Drools Installations
- name: Gather brms.kie-api-ver
raw: find / -name kie-api* 2> /dev/null | sed 's/.*kie-api-//g' | sed 's/.jar.*//g' | sort -u
register: rho-kie-api-ver
ignore_errors: yes
- name: Gather brms.drools-core-ver
raw: find / -name drools-core* 2> /dev/null | sed 's/.*drools-core-//g' | sed 's/.jar.*//g' | sort -u
register: rho-drools-core-ver
ignore_errors: yes
- name: Gather brms.kie-war-ver
raw: OIFS="$IFS"; IFS=$'\n'; for war in $(find / -name kie*.war 2> /dev/null); do if [[ -d "$war" ]]; then cat "$war"/META-INF/MANIFEST.MF 2> /dev/null | grep Implementation-Version | sed "s/Implementation-Version://g" | sed "s/ //g" | sed 's/\r$//' | sort -u; else fgrep -irsal kie-api "$war" | egrep -o "[0-9]\.[0-9]\.[0-9].*-" | sed "s/-$//g" | sed 's/\r$//' | sort -u; fi; done; IFS="$OIFS"
register: rho-kie-war-ver
ignore_errors: yes
#- name: Gather brms.business-central-war-ver
# raw: OIFS="$IFS"; IFS=$'\n'; for war in $(find / -name kie*.war 2> /dev/null); do if [[ -d "$war" ]]; then cat "$war"/META-INF/MANIFEST.MF | grep Implementation-Version | sed "s/Implementation-Version://g" | sort -u; else fgrep -irsal kie-api "$war" | egrep -o "[0-9]\.[0-9]\.[0-9].*-" | sed "s/-$//g"; fi | sort -u; done; IFS="$OIFS"
# register: business-central-war-ver
# ignore_errors: yes
#- name: Gather jboss versions currently running
# raw: for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do ls -l ${proc_pid}/fd 2>/dev/null | grep "java"; done | grep "/modules/system/layers/base" | sed -n "s/.*\->//p" | sed -n 's/\/modules\/system\/layers\/base.*//p' | sort -u
# register: running_versions
# ignore_errors: yes
#- name: set facts
# ignore_errors: yes
# set_fact:
# res:
# {installed_versions: "{{ kie-api-ver.stdout }}; {{ runjar_ver.stdout }}", running_versions: "{{ running_versions.stdout }}", hostname: "{{ hostname.stdout }}", cpu_cores: "{{ cpu_cores.stdout }}"}

21 changes: 21 additions & 0 deletions roles/collect_fuse_raw/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

---
# This will scan linux systems for JBoss Fuse, ActiveMQ, CXF, Camel or Community Installations
- name: Gather activemq-ver
raw: FOUND=""; for jar in `find / -type f -name \*activemq-\*redhat\*.jar 2>/dev/null | sed -n 's/.*\(redhat-[0-9]\{6\}\).*/\1/p' | sort -u`; do if [ ! -z "${jar}" ]; then if [ ! -z "$FOUND" ]; then FOUND="$FOUND; $jar"; else FOUND=${jar}; fi; fi; done; echo ${FOUND}
register: rho-activemq-ver
ignore_errors: yes
- name: Gather camel-ver
raw: FOUND=""; for jar in `find / -type f -name \*camel-core\*redhat\*.jar 2>/dev/null | sed -n 's/.*\(redhat-[0-9]\{6\}\).*/\1/p' | sort -u`; do if [ ! -z "${jar}" ]; then if [ ! -z "$FOUND" ]; then FOUND="$FOUND; $jar"; else FOUND=${jar}; fi; fi; done; echo ${FOUND}
register: rho-camel-ver
ignore_errors: yes
- name: Gather cxf-ver
raw: FOUND=""; for jar in `find / -type f -name \*cxf-rt\*redhat\*.jar 2>/dev/null | sed -n 's/.*\(redhat-[0-9]\{6\}\).*/\1/p' | sort -u`; do if [ ! -z "${jar}" ]; then if [ ! -z "$FOUND" ]; then FOUND="$FOUND; $jar"; else FOUND=${jar}; fi; fi; done; echo ${FOUND}
register: rho-cxf-ver
ignore_errors: yes
#- name: set facts
# ignore_errors: yes
# set_fact:
# res:
# {installed_versions: "{{ kie-api-ver.stdout }}; {{ runjar_ver.stdout }}", running_versions: "{{ running_versions.stdout }}", hostname: "{{ hostname.stdout }}", cpu_cores: "{{ cpu_cores.stdout }}"}

45 changes: 45 additions & 0 deletions roles/collect_jboss_raw/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

---
# This will scan linux systems for JBoss EAP or Wildfly Installations
- name: Gather jboss-modules.jar versions
raw: FOUND=""; for jar in `find / -name 'jboss-modules.jar' 2>/dev/null | grep -v '\.installation/patches'`; do VERSION=$(java -jar ${jar} -version 2> /dev/null | grep version | sed 's/.*version\s//g'); inode=$(stat -c '%i' "${jar}"); fs=$(df -T "${jar}" | grep "/dev" | sed 's/ .*//'); ctime=$(stat ${jar} | grep 'Change' | grep -oP '[1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]'); if [ ! -z "${VERSION}" ]; then if [ ! -z "$FOUND" ]; then FOUND="$FOUND; $VERSION**$ctime"; else FOUND=${VERSION}'**'${ctime}; fi; fi; done; echo ${FOUND}
register: rho-jar_ver
ignore_errors: yes
- name: Gather run.jar versions
raw: FOUND=""; for jar in `find / -name 'run.jar' 2>/dev/null`; do VERSION=$(java -jar ${jar} --version 2> /dev/null | grep build | sed 's/.*[CS]V[NS]Tag.//g' | sed 's/\sdate.*//g'); inode=$(stat -c '%i' "${jar}"); fs=$(df -T "${jar}" | tail -1 | sed 's/ .*//'); ctime=$(stat ${jar} | grep 'Change' | grep -oP '[1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]'); if [ ! -z "${VERSION}" ]; then if [ ! -z "$FOUND" ]; then FOUND="$FOUND; $VERSION**${ctime}"; else FOUND=${VERSION}'**'${ctime}; fi; fi; done; echo ${FOUND};
register: rho-runjar_ver
ignore_errors: yes
- name: Gather jboss versions currently running
raw: for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do ls -l ${proc_pid}/fd 2>/dev/null | grep "java"; done | grep -e "/modules/system/layers/base\|/opt/rh/eap" | sed -n "s/.*\->//p" | sed -n 's/\/modules\/system\/layers\/base.*//p;s/.*\(\/opt\/rh\/eap[1-9]\).*/\1/p' | sort -u
register: rho-running_versions
ignore_errors: yes
- name: Gather hostname
raw: hostname
register: rho-hostname
ignore_errors: yes
- name: Gather cpu cores
raw: CPU_CORES=$(grep cpu.cores /proc/cpuinfo | sed 's/cpu.*:.\?//g' | sort -u); if [ -z "$CPU_CORES" ]; then CPU_CORES=$(grep processor /proc/cpuinfo | wc -l); fi; echo "$CPU_CORES" | sed 's/\s*//g'
register: rho-cpu_cores
ignore_errors: yes
- name: Gather date.anaconda_log
raw: ls --full-time /root/anaconda-ks.cfg 2> /dev/null | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
register: rho-date.anaconda_log
ignore_errors: yes
- name: Gather date.machine_id
raw: ls --full-time /etc/machine-id 2> /dev/null | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
register: rho-date.machine_id
ignore_errors: yes
- name: Gather date.filesystem_create
raw: fs_date=$(tune2fs -l $(mount | egrep '/ type' | grep -o '/dev.* on' | sed -e 's/\on//g') 2> /dev/null | grep 'Filesystem created' | sed 's/Filesystem created:\s*//g'); if [[ $fs_date ]]; then date +'%F' -d "$fs_date"; else echo "" ; fi
register: rho-date.filesystem_create
ignore_errors: yes
- name: Gather date.yum_history
raw: yum history 2> /dev/null | tail -n 4 | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}' | sed 's/$/; /'
register: rho-date.yum_history
ignore_errors: yes
#- name: set facts
# ignore_errors: yes
# set_fact:
# res:
# {installed_versions: "{{ jar_ver.stdout }}; {{ runjar_ver.stdout }}", running_versions: "{{ running_versions.stdout }}", hostname: "{{ hostname.stdout }}", cpu_cores: "{{ cpu_cores.stdout }}"}

11 changes: 2 additions & 9 deletions roles/write/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
---

- name: store facts from all hosts in a variable
set_fact: host_fact={{hostvars[item]["res"]}}
with_items: "{{groups.alpha}}"
register: host_facts

- name: parse variable into a list of dictionaries
set_fact: host_facts="{{ host_facts.results | map(attribute="ansible_facts.host_fact") | list }}"

- name: write the list to a csv
spit_results: name=spit file_path={{report_path}} vals={{host_facts}}
spit_results: name=spit file_path={{report_path}} all_vars={{hostvars}} desired_facts={{facts_to_collect}}
register: write_results

0 comments on commit 63c78e3

Please sign in to comment.