I’ve a pattern that I want to apply and I’m wondering what the best practice might be for this. I have a situation where I apply a number of roles to a host and each have a number of facts or variables that I’d like to use in a final role, typically to generate a unified config for the host.
Say I’m applying a number of roles say a, b, c that are all distinct, but each exposes a set of metrics in a uniform way. As each gets played, I’d like to add facts about the metrics for the role in such a way that I can iterate over them in a final role d to generate some aggregate config to expose all the metrics.
I have a number of situations that I’d like to apply this pattern so if there is a standard way to do this I’d love to hear it.
If not, I have been mulling over extending the set_fact module to allow something like the following
Say each role could add a dictionary of values to an aggregate collection, aggregated_facts, so that in d I could do
{% for addedFactsForRole in aggregated_facts %}
// processing facts for key addedFactsForRole.key
{% for addedFact in addedFactsForRole.facts %}
// process addedFact.name
// process addedFact.value
{% endfor %}
{% endfor %}
I have used group variables to do something similar, but this tends to get crufty as it means replicating the data in every site that I use the role and I like to be able to have very generic roles that I can reuse in different sites. If the list could dynamically built like this it would be arguably more cohesive as now I could define all of the data for the role, within the role, and still have the ability to override it at the site level with group vars.
I’m thinking the task definition might look something like this.
name: Add metrics to metrics aggregate
add_fact: group=host_metrics key=$role_key fact=$item
with_items: $list_of_metrics
In the case above the list_of_metrics could be a list of single entries or a list of json blobs. I don’t want to go re-inventing the wheel, this seems like a common enough scenario so I’m very curious how folks tackle it, before I go about putting this together.
Thanks in advance,
Steve.