Merge pull request #6242 from chrismeyersfsu/implement-6203

associate insights machine id w/ host on fact scan
This commit is contained in:
Chris Meyers
2017-05-16 10:27:45 -04:00
committed by GitHub
6 changed files with 98 additions and 3 deletions

View File

@@ -1179,8 +1179,8 @@ class HostSerializer(BaseSerializerWithVariables):
model = Host model = Host
fields = ('*', 'inventory', 'enabled', 'instance_id', 'variables', fields = ('*', 'inventory', 'enabled', 'instance_id', 'variables',
'has_active_failures', 'has_inventory_sources', 'last_job', 'has_active_failures', 'has_inventory_sources', 'last_job',
'last_job_host_summary') 'last_job_host_summary', 'insights_system_id')
read_only_fields = ('last_job', 'last_job_host_summary') read_only_fields = ('last_job', 'last_job_host_summary', 'insights_system_id',)
def build_relational_field(self, field_name, relation_info): def build_relational_field(self, field_name, relation_info):
field_class, field_kwargs = super(HostSerializer, self).build_relational_field(field_name, relation_info) field_class, field_kwargs = super(HostSerializer, self).build_relational_field(field_name, relation_info)

View File

@@ -12,6 +12,7 @@ from kombu.mixins import ConsumerMixin
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
from django.db import IntegrityError
# AWX # AWX
from awx.main.models.jobs import Job from awx.main.models.jobs import Job
@@ -120,6 +121,14 @@ class FactBrokerWorker(ConsumerMixin):
ret = self._do_fact_scan_create_update(host_obj, module_name, facts, self.timestamp) ret = self._do_fact_scan_create_update(host_obj, module_name, facts, self.timestamp)
if job.store_facts is True: if job.store_facts is True:
if module_name == 'insights':
system_id = facts.get('system_id', None)
host_obj.insights_system_id = system_id
try:
host_obj.save()
except IntegrityError:
host_obj.insights_system_id = None
logger.warn('Inisghts system_id %s not assigned to host %s because it already exists.' % (system_id, host_obj.pk))
self._do_gather_facts_update(host_obj, module_name, facts, self.timestamp) self._do_gather_facts_update(host_obj, module_name, facts, self.timestamp)
message.ack() message.ack()

View File

@@ -236,4 +236,15 @@ class Migration(migrations.Migration):
migrations.DeleteModel( migrations.DeleteModel(
name='Permission', name='Permission',
), ),
# Insights
migrations.AddField(
model_name='host',
name='insights_system_id',
field=models.TextField(default=None, help_text='Red Hat Insights host unique identifier.', null=True, db_index=True, blank=True),
),
migrations.AlterUniqueTogether(
name='host',
unique_together=set([('insights_system_id', 'inventory'), ('name', 'inventory')]),
),
] ]

View File

@@ -353,7 +353,7 @@ class Host(CommonModelNameNotUnique):
class Meta: class Meta:
app_label = 'main' app_label = 'main'
unique_together = (("name", "inventory"),) # FIXME: Add ('instance_id', 'inventory') after migration. unique_together = (("name", "inventory"), ("insights_system_id", "inventory"),) # FIXME: Add ('instance_id', 'inventory') after migration.
ordering = ('name',) ordering = ('name',)
inventory = models.ForeignKey( inventory = models.ForeignKey(
@@ -414,6 +414,13 @@ class Host(CommonModelNameNotUnique):
default={}, default={},
help_text=_('Arbitrary JSON structure of most recent ansible_facts, per-host.'), help_text=_('Arbitrary JSON structure of most recent ansible_facts, per-host.'),
) )
insights_system_id = models.TextField(
blank=True,
default=None,
null=True,
db_index=True,
help_text=_('Red Hat Insights host unique identifier.'),
)
objects = HostManager() objects = HostManager()

View File

@@ -17,6 +17,9 @@
get_checksum: '{{ scan_use_checksum }}' get_checksum: '{{ scan_use_checksum }}'
recursive: '{{ scan_use_recursive }}' recursive: '{{ scan_use_recursive }}'
when: scan_file_paths is defined and ansible_os_family != "Windows" when: scan_file_paths is defined and ansible_os_family != "Windows"
- name: "Scan Insights for Machine ID (Unix/Linux)"
scan_insights:
when: ansible_os_family != "Windows"
- name: "Scan packages (Windows)" - name: "Scan packages (Windows)"
win_scan_packages: win_scan_packages:

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env python
from ansible.module_utils.basic import * # noqa
import uuid
DOCUMENTATION = '''
---
module: scan_insights
short_description: Return insights UUID as fact data
description:
- Inspects the /etc/redhat-access-insights/machine-id file for insights uuid and returns the found UUID as fact data
version_added: "2.3"
options:
requirements: [ ]
author: Chris Meyers
'''
EXAMPLES = '''
# Example fact output:
# host | success >> {
# "ansible_facts": {
# "insights": {
# "system_id": "4da7d1f8-14f3-4cdc-acd5-a3465a41f25d"
# }, ... }
'''
INSIGHTS_SYSTEM_ID_FILE='/etc/redhat-access-insights/machine-id'
def get_system_uuid(filname):
system_uuid = None
try:
f = open(INSIGHTS_SYSTEM_ID_FILE, "r")
except IOError:
return None
else:
try:
data = f.readline()
system_uuid = str(uuid.UUID(data))
except (IOError, ValueError):
pass
finally:
f.close()
return system_uuid
def main():
module = AnsibleModule(
argument_spec = dict()
)
system_uuid = get_system_uuid(INSIGHTS_SYSTEM_ID_FILE)
results = {
'ansible_facts': {
'insights': {
'system_id': system_uuid
}
}
}
module.exit_json(**results)
main()