【问题标题】:Ansible yaml to xmlAnsible yaml 到 xml
【发布时间】:2022-01-21 21:35:25
【问题描述】:

我正在尝试使用 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>

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

编辑: IE 我有这样的 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']

【问题讨论】:

  • 这个要求非常适合templates -- 特别是结合模板模块呈现的 Jinja (.j2) 文件。
  • 数据从何而来?您想要“创建 XML 文件”。输入是什么?如果您不edit 提出问题并提供minimal reproducible example,您的问题将被关闭。
  • 现在好了。删除 cmets。

标签: xml ansible yaml


【解决方案1】:

例如,给定数据

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2021-11-05
    • 2018-12-06
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多