1

我正在使用适用于 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”没有被输出。有什么建议么?

4

1 回答 1

2

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

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子节点的存在,更不用说你没有创建它们,所以你的改变不会是幂等的。

于 2013-09-10T07:42:32.640 回答