Почему типу ресурса Augeas Puppet нужно 3 аргумента для defnode?

Я пытаюсь добавить или обновить пользователя в XML-файле конфигурации, используя тип ресурса augeas в Puppet, вот манифест:

  augeas { "nexus_user_newadmin":
    lens    => "Xml.lns",
    incl    => "security.xml",
    root    => "/usr/local/nexus/conf",
    changes => [
      "defnode user /files/security.xml/security/users/user[id/#text='newadmin']",
      "set $user/id/#text 'newadmin'",
      "set $user/firstName/#text 'first name'",
      "set $user/lastName/#text 'last name'",
      "set $user/password/#text 'passhere'",
      "set $user/status/#text 'active'",
      "set $user/email/#text 'test@domain.com'",
    ],
  }

XML-файл выглядит так:

<?xml version="1.0"?>
<security>
          <users>
            ...
            <user>
              <id>deployment</id>
              <firstName>Deployment</firstName>
              <lastName>User</lastName>
              <password>somepasshere</password>
              <status>active</status>
              <email>changeme1@yourcompany.com</email>
            </user>
          </users>
</security>

Я получаю сообщение об ошибке при запуске манифеста:

Main/Augeas[nexus_user_newadmin]: Could not evaluate: missing string argument 3 for defnode

Похоже, что команде defnode необходимо 3 обязательных аргумента при использовании из puppet, но только 2 (и 1 необязательный) при использовании из augtool. ( см. мой оригинальный пост)

Как я могу преодолеть эти ограничения в реализации augeas в Puppet?

1 ответ

Решение

Там есть несколько вопросов.

Во-первых, пока defnode принимает необязательный третий аргумент (значение) в augtoolэтот аргумент является обязательным в Ruby/Puppet. Однако вы можете установить его в пустую строку.

Во-вторых, $user Переменная обрабатывается Puppet, потому что вы используете двойные кавычки, поэтому Augeas не получает ее (она пуста). Вы должны либо использовать одинарные кавычки, либо избегать знака доллара. В общем, рекомендуется использовать одинарные кавычки в Puppet, если вам не нужны переменные для раскрытия.

В-третьих, будет лучше использовать incl а также lens скорее, чем root, Вы выиграете от автоматического context в марионетке тоже

augeas { 'nexus_user_newadmin':
  lens    => 'Xml.lns',
  incl    => '/usr/local/nexus/conf/security.xml',
  changes => [
    'defnode user security/users/user[id/#text="newadmin"] ""',
    'set $user/id/#text "newadmin"',
    'set $user/firstName/#text "first name"',
    'set $user/lastName/#text "last name"',
    'set $user/password/#text "passhere"',
    'set $user/status/#text "active"',
    'set $user/email/#text "test@domain.com"',
  ],
}
Другие вопросы по тегам