【问题标题】:How to create separated XML nodes with "set" in Puppet using Augeas?如何使用 Augeas 在 Puppet 中使用“set”创建分离的 XML 节点?
【发布时间】:2013-09-04 00:55:19
【问题描述】:

我正在使用适用于 Puppet 3.2 的 Augeas 工具,并且我正在尝试创建一个 XML 文件。我希望能够将多个具有相同名称的字段添加到我的 XML 文档中。例如,我想将 node2/location2 与 node1/location1 分开,方法是将其放在自己的“节点”字段中。这是我的代码:

    augeas { "update template":
        lens    => "Xml.lns",
        require => File["${buildpath}/tempfile.xml"],
        incl => "${buildpath}/tempfile.xml",
        changes => [
            "set member/acceptors[#attribute]/node[#attribute]/nodeIdentity[#attribute]/#text node2",
            "set member/acceptors/node/nodeLocation[#attribute]/#text location2",
            "set member/acceptors/node/nodeIdentity[#attribute]/#text node1",
            "set member/acceptors/node/nodeLocation[#attribute]/#text location1"
        ],
   }

这是我得到的 XML 输出:

    <member>
        <acceptors>
            <node>
                <nodeIdentity>node2</nodeIdentity>
                <nodeLocation>location2</nodeLocation>
                <nodeIdentity>node1</nodeIdentity>
                <nodeLocation>location1</nodeLocation>
            </node>
        </acceptors>
    </member>

这是我想要的输出:

    <member>
        <acceptors>
            <node>
                <nodeIdentity>node2</nodeIdentity>
                <nodeLocation>location2</nodeLocation>
            </node>
            <node>
                <nodeIdentity>node1</nodeIdentity>
                <nodeLocation>location1</nodeLocation>
            </node>
        </acceptors>
    </member>

我尝试将 [#attribute] 添加到 node1 行,如下所示:

     "set member/acceptors/node[#attribute]/nodeIdentity[#attribute]/#text node1",

但是“node1”没有被输出。有什么建议吗?

【问题讨论】:

  • 我遇到过这个问题,我认为augeas 不支持多个数组[] 在一个set 中。
  • 哦,真的吗?这太糟糕了。有没有一个简单的替代方法来实现这一点?
  • 恐怕没有简单的解决方案。您必须使用模板并填写必要的属性...
  • 那我只做模板!谢谢:)

标签: xml set puppet augeas


【解决方案1】:

您需要指定要使用 XPath 表达式影响的 node。在您的情况下,您可以通过以下方式编写幂等更改:

augeas { "update template":
     lens    => "Xml.lns",
     require => File["${buildpath}/tempfile.xml"],
     incl    => "${buildpath}/tempfile.xml",
     changes => [
         "set member/acceptors/node[nodeIdentity/#text='node2']/nodeIdentity/#text node2",
         "set member/acceptors/node[nodeIdentity/#text='node2']/nodeLocation/#text location2",
         "set member/acceptors/node[nodeIdentity/#text='node1']/nodeIdentity/#text node1",
         "set member/acceptors/node[nodeIdentity/#text='node1']/nodeLocation/#text location1"
     ],
}

没有必要(我认为)过滤#attribute 子节点的存在,更不用说您不创建它们,因此您的更改不会是幂等的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2014-02-15
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多