为什么Augeas Puppet资源类型的defnode需要3个参数? [英] Why does Augeas Puppet resource type need 3 arguments for defnode?

查看:119
本文介绍了为什么Augeas Puppet资源类型的defnode需要3个参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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'",
    ],
  }

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

当从puppet中使用时,命令defnode似乎需要3个必需参数,而从augtool中使用时,仅需要2个(和1个可选参数). (请参阅我的原始帖子)

如何克服Puppet中Augeas实施中的这些限制?

解决方案

那里有几个问题.

首先,虽然defnodeaugtool中采用了可选的第三个参数(一个值),但在Ruby/Puppet中此参数是必需的.但是,您可以将其设置为空字符串.

第二,Puppet解析了$user变量,因为您使用的是双引号,因此Augeas不会收到它(它是空的).您必须使用单引号或转义美元符号.通常,除非需要扩展变量,否则建议在Puppet中使用单引号.

第三,最好使用incllens而不是root.您也将受益于Puppet中的自动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"',
  ],
}
 

I'm trying to add or update a user in an xml config file using augeas resource type in Puppet, here the manifest:

  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'",
    ],
  }

The xml file looks like :

<?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>

I get the error following when I run the manifest:

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

It looks like the command defnode needs 3 mandatory arguments when used from puppet, but only 2 (and 1 optional) when used from augtool. (see my original post)

How can I overcome this limitations in augeas implementation in Puppet ?

解决方案

There's several issues there.

First, while defnode takes an optional third argument (a value) in augtool, this argument is mandatory in Ruby/Puppet. You can however set it to an empty string.

Second, the $user variable is parsed by Puppet because you're using double quotes, so Augeas doesn't receive it (it's empty). You must either use single quotes or escape the dollar sign. In general, it is recommended to use single quotes in Puppet unless you need variables to be expanded.

Third, it'll be better to use incl and lens rather than root. You will benefit from an automatic context in Puppet, too:

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"',
  ],
}

这篇关于为什么Augeas Puppet资源类型的defnode需要3个参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆