Puppet Augeas-не удается обновить значение в XML-узле, содержащем CDATA


У меня есть xml-документ, подобный этому:

<?xml version="1.0" encoding="UTF-8"?>
<example>
    <member name="dbsettings">
        <node name="username"><![CDATA[someusername]]></node>
        <node name="password"><![CDATA[mypassword]]></node>
    </member>
    <member name="sitesettings">
        <node name="title"><![CDATA[just a title]]></node>
    </member>
</example>

И я пытаюсь обновить эти настройки в puppet, используя следующую команду augeas:

set example/member[#attributes/name='dbsettings']/node[#attributes/name='username']/#text anotherusername

Я ожидаю, что он заменит все содержимое узла на "anotherusername" вместо этого он просто добавляет его, что приводит к:

<node name="username"><![CDATA[someusername]]>anotherusername</node>

Как я могу выбрать и обновить содержимое элемента CDATA с помощью augeas или удалить его, не удаляя сам узел? (реальный узел содержит больше атрибутов, которые я не хочу жестко кодировать в)

1 2

1 ответ:

Augtool может показать вам, как выглядит дерево на самом деле:

$ augtool -At "Xml incl /test.xml" -r .
augtool> set /augeas/context /files/test.xml
augtool> print example/member[#attribute/name='dbsettings']/node[#attribute/name='username']
/files/test.xml/example/member[1]/node[1]
/files/test.xml/example/member[1]/node[1]/#attribute
/files/test.xml/example/member[1]/node[1]/#attribute/name = "username"
/files/test.xml/example/member[1]/node[1]/#CDATA = "someusername"

Это показывает две вещи:

  • синтаксис атрибутов #attribute, без 's'
  • CDATA хранится в подузле #CDATA

Следовательно, ваша команда должна быть:

set example/member[#attribute/name='dbsettings']/node[#attribute/name='username']/#CDATA anotherusername