Ansible yaml 到 xml

Ansible yaml to xml

我正在尝试使用 yaml 剧本创建 xml 文件。 XML 应该是这样的:

<accessControl>
  <ipRanges>
    <ipRange>
      <ip>
        <int>00</int>
        <int>00</int>
        <int>00</int>
        <int>000</int>
      </ip>
      <mask>
        <int>255</int>
        <int>255</int>
        <int>255</int>
        <int>0</int>
      </mask>
    </ipRange>
    <null/>
  </ipRanges>
</accessControl>

我不知道如何创建提供多个相同标签 (< int >) 的 ansible 任务。我正在寻找类似循环的东西还是有其他方法?

编辑: 即我有 XML 这样的:

<accessControl>
  <ipRanges>
    <ipRange>
    </ipRange>
    <null/>
  </ipRanges>
</accessControl>

并且我需要在标签中添加IP和MASK来实现:

<accessControl>
  <ipRanges>
    <ipRange>
      <ip>
        <int>127</int>
        <int>0</int>
        <int>0</int>
        <int>1</int>
      </ip>
      <mask>
        <int>255</int>
        <int>255</int>
        <int>255</int>
        <int>0</int>
      </mask>
    </ipRange>
    <null/>
  </ipRanges>
</accessControl>

我可以在列表、字典、元组中提供 IP 和掩码 - 没关系。 为了这个问题,我们可以这样说:['127.0.0.1', '255.255.255.0']

例如给定数据

ip: ['127.0.0.1', '255.255.255.0']

模板

shell> cat test.xml.j2
<accessControl>
  <ipRanges>
    <ipRange>
      <ip>
{% for item in ip %}
{% if loop.index is odd %}
{% for i in item.split('.') %}
        <int>{{ i }}</int>
{% endfor %}
{% endif %}
{% endfor %}
      </ip>
      <mask>
{% for item in ip %}
{% if loop.index is even %}
{% for i in item.split('.') %}
        <int>{{ i }}</int>
{% endfor %}
{% endif %}
{% endfor %}
      </mask>
    </ipRange>
    <null/>
  </ipRanges>
</accessControl>

和任务

    - template:
        src: test.xml.j2
        dest: test.xml

给予

shell> cat test.xml
<accessControl>
  <ipRanges>
    <ipRange>
      <ip>
        <int>127</int>
        <int>0</int>
        <int>0</int>
        <int>1</int>
      </ip>
      <mask>
        <int>255</int>
        <int>255</int>
        <int>255</int>
        <int>0</int>
      </mask>
    </ipRange>
    <null/>
  </ipRanges>
</accessControl>

可以使用slice notation instead of even/odd索引测试

      <ip>
{% for item in ip[0::2] %}
{% for i in item.split('.') %}
        <int>{{ i }}</int>
{% endfor %}
{% endfor %}
      </ip>
      <mask>
{% for item in ip[1::2] %}
{% for i in item.split('.') %}
        <int>{{ i }}</int>
{% endfor %}
{% endfor %}
      </mask>