xml - Ansible yaml 到 xml

标签 xml ansible yaml

我正在尝试使用 yaml playbook 创建 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而不是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>

关于xml - Ansible yaml 到 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70418925/

相关文章:

xml - 为什么 Clearcase Explorer 不能比较我的 XML 文件?

java - 如何诊断 Android 的问题?

netbeans - YAML 标签上的 "We had this mapping values are not allowed here"

go - 加载具有不同结构项列表的YAML文件

c++ - 如何在 opencv 中访问 yml 文件的元素?

c# - XElement => 在运行时添加子节点

xml - 如何将 XML 显示为 HTML 表格

Ansible:在一项任务中并行执行 delegate_to 循环

ansible - 如何阻止 Ansible 在主目录中创建 .retry 文件?

ansible - 以干净的 Ansible 格式显示调试输出