来自vars的ansible的jinja2模板

时间:2016-07-14 07:10:34

标签: templates ansible jinja2

我想在自动化中为配置文件添加新内容时尽可能简单,我想从vars文件中动态生成它,而不必在每次需要新行时调整模板

我们使用ruby,所以YAML正式配置。我在考虑这样的事情:

{% for variable,value in example.iteritems() %}
  {{ variable|lower() }}: "{{ value }}"
{% endfor %}

并且在vars文件中有类似的内容:

example:
  host: whatever
  pass: 123
  port: 577
  and so on

除非我需要添加另一个缩进图层,否则这没有任何问题。

example:
  host: whatever
  pass: 123
  port: 577
  domain:
    somevalue: bla.com
    othervalue: foo.com

而不是在配置中生成相同的结构,它将生成如下内容:

domain: "{u'somevalue': u'bla.com', u'othervalue': u'foo.com'}"

如何保留与vars文件相同的结构和内容?

感谢。

1 个答案:

答案 0 :(得分:0)

输入数据:

example:
    domain:
        othervalue: foo.com
        somevalue: bla.com
    host: whatever
    pass: 123
    port: 577

4个空格yaml template.j2:

example:{{ example | to_yaml(indent=2, default_flow_style=False) | comment(decoration='  ') }}

结果:

example:
  domain:
    othervalue: foo.com
    somevalue: bla.com
  host: whatever
  pass: 123
  port: 577

2个空格yaml template.j2:

public abstract class Builder<T extends A> {
  public T build(*?*){
    //compute args
    return create(args);
  }

  protected abstract T create(args);
}

public class B_Builder extends Builder<B> {
  @Override
  protected B create(args) {
    return new B(args);
  }
}

public class C_Builder extends Builder<C>{
  @Override
  protected C create(args) {
    return new C(args);
  }
}

结果:

public class BuilderA {
public static <T extends A> T of(Class<T> type, Object arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Constructor<T> constructor = type.getConstructor(arg.getClass());
    return constructor.newInstance(arg);
}
}

请注意,dict键的输出顺序可能与您的输入不同,但您不应该依赖它。