Xml 为什么Augeas Puppet资源类型需要3个defnode参数?

Xml 为什么Augeas Puppet资源类型需要3个defnode参数?,xml,puppet,augeas,Xml,Puppet,Augeas,我正在尝试使用Puppet中的augeas资源类型在xml配置文件中添加或更新用户,清单如下: augeas { "nexus_user_newadmin": lens => "Xml.lns", incl => "security.xml", root => "/usr/local/nexus/conf", changes => [ "defnode user /files/security.xml/se

我正在尝试使用Puppet中的augeas资源类型在xml配置文件中添加或更新用户,清单如下:

  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'",
    ],
  }
Main/Augeas[nexus_user_newadmin]: Could not evaluate: missing string argument 3 for defnode
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>
从puppet使用defnode命令时,似乎需要3个强制参数,但从augtool使用时,只有2个和1个可选参数


如何在Puppet中的augeas实现中克服这些限制?

有几个问题

首先,虽然defnode在augtool中接受可选的第三个参数值,但在Ruby/Puppet中该参数是必需的。但是,您可以将其设置为空字符串

其次,Puppet解析$user变量,因为您使用双引号,所以Augeas不会接收到它,因为它是空的。必须使用单引号或转义美元符号。通常,除非需要展开变量,否则建议在Puppet中使用单引号

第三,最好使用incl和lens而不是root。您也将受益于Puppet中的自动上下文:

augeas{'nexus_user_newadmin': lens=>Xml.lns, incl=>“/usr/local/nexus/conf/security.xml”, 变化=>[ “defnode用户安全性/users/user[id/text=newadmin]”, '设置$user/id/text newadmin', '设置$user/firstName/text first name', '设置$user/lastName/text lastName', '设置$user/password/text passhere', “将$user/status/text设置为活动状态”, '设置$user/email/texttest@domain.com', ], }
这里有几个问题

首先,虽然defnode在augtool中接受可选的第三个参数值,但在Ruby/Puppet中该参数是必需的。但是,您可以将其设置为空字符串

其次,Puppet解析$user变量,因为您使用双引号,所以Augeas不会接收到它,因为它是空的。必须使用单引号或转义美元符号。通常,除非需要展开变量,否则建议在Puppet中使用单引号

第三,最好使用incl和lens而不是root。您也将受益于Puppet中的自动上下文:

augeas{'nexus_user_newadmin': lens=>Xml.lns, incl=>“/usr/local/nexus/conf/security.xml”, 变化=>[ “defnode用户安全性/users/user[id/text=newadmin]”, '设置$user/id/text newadmin', '设置$user/firstName/text first name', '设置$user/lastName/text lastName', '设置$user/password/text passhere', “将$user/status/text设置为活动状态”, '设置$user/email/texttest@domain.com', ], }
看起来每次运行清单时都会创建一个新的用户节。如何避免这种情况?我的意思是,更新已经存在的用户,或者添加一个新的用户,如果它不存在的话。至少对我来说不是这样。是否确实正确复制了代码(尤其是引号)?看起来每次运行清单时都会创建一个新的用户节。如何避免这种情况?我的意思是,更新已经存在的用户,或者添加一个新的用户,如果它不存在的话。至少对我来说不是这样。是否确实正确复制了代码,尤其是引号?