; 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') }}

