; inventory.ini, generated from ansible/roles/genconfig/templates/inventory.ini.j2
; ** DO NOT EDIT THIS FILE MANUALLY! **
; Edit the Pod Config (or Scenario) and rerun `make config` to regenerate it

{% macro group_template(groupname) %}
{% if inventory_groups[groupname] %}
{% for g_key, g_val in inventory_groups[groupname].iteritems() %}
{{ g_key }}{% if g_val %} {% for key, val in g_val.iteritems() %}{{ key ~ "=" ~ val }}{% endfor %}{% endif %}
{% endfor %}
{% endif %}
{% endmacro %}

[config]
{{ group_template('config') }}

[build]
{{ group_template('build') }}

[head]
{{ group_template('head') }}

[compute]
{{ group_template('compute') }}

