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

nodeXPath 式で影響を与えたいものを指定する必要があります。あなたの場合、これを行うことでべき等の変更を書くことができます:

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 に答える