Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Puppet 木偶:如何解决;文件“U行”;多匹配模式_Puppet - Fatal编程技术网

Puppet 木偶:如何解决;文件“U行”;多匹配模式

Puppet 木偶:如何解决;文件“U行”;多匹配模式,puppet,Puppet,我正在尝试使用puppet更改配置文件 这是我要更改的test.txt文件: [default] #puppet=no abc=123 [nova] #puppet=no 我只想在[默认]选项卡上将“#puppet=no”更改为“puppet=yes”。 这是我的test.pp,有两个版本: file_line{"someline": path => '/root/openstack-puppet/computenode/nova/test.txt', match =>

我正在尝试使用puppet更改配置文件

这是我要更改的test.txt文件:

[default]
#puppet=no
abc=123

[nova]
#puppet=no
我只想在[默认]选项卡上将“#puppet=no”更改为“puppet=yes”

这是我的test.pp,有两个版本:

file_line{"someline":
   path => '/root/openstack-puppet/computenode/nova/test.txt',
   match => '[default]\n#puppet',
   line => 'puppet=ok'
}
这一个未能找到匹配模式,所以它只是在文件末尾添加“puppet=ok”

file_line{"someline":
   path => '/root/openstack-puppet/computenode/nova/test.txt',
   match => '#puppet',
   line => 'puppet=ok'
}
由于多匹配模式问题,此操作失败

我也尝试了Augeas,但找不到如何使用Augeas取消注释

谁来帮我解决这个问题

=========================================================================

我运行以下代码:

file_line { 'someline':
  path     => '/root/openstack-puppet/computenode/nova/test.txt',
  after    => '\[default\]',
  multiple => 'false',
  match    => '#puppet',
  line     => 'puppet=ok',
}
但当我使用“puppet apply”运行时,仍然会出现相同的错误:

Error: More than one line in file '/root/openstack-puppet/computenode/nova/test.txt' matches pattern '#puppet'
Error: /Stage[main]/Main/File_line[someline]/ensure: change from absent to present failed: More than one line in file '/root/openstack-puppet/computenode/nova/test.txt' matches pattern '#puppet'
我认为在定义了“匹配”属性时,不能应用“after”属性。

当我删除'match'属性时,它会工作,但它不会替换原始字符串('puppet=no')

它只是在[default]之后添加了新行,如下所示:

[default]
puppet=ok
#puppet=no
abc=123
dedd=0


[nova]
#puppet=no
因此问题仍然存在,如何删除(或替换)字符串“#puppet=no”
只有在[default]选项卡上,

后的
属性才能为您解决此问题。利用您的第二个资源并清理一些资源,我们有:

file_line { 'someline':
  path     => '/root/openstack-puppet/computenode/nova/test.txt',
  match    => '#puppet',
  line     => 'puppet=ok'
  after    => '[default]',
  multiple => false,
}
请注意,我还添加了
multiple
属性,以防止更改的不仅仅是要更改的行

您的第一个资源出现问题的原因有三个。首先,
file\u line
要求您的
line
属性与
match
属性进行成功的regexp匹配,这在您的情况下是不正确的。其次,将
[default]
放在
匹配
属性中意味着,如果资源在编写过程中成功,那么
[default]
将从文件中删除。第三,您需要在regexp中转义
[]
,因此如果您想走这条路线(并且由于前面给出的两个原因您没有这样做),它看起来就像
\[default\]

您好,您可以尝试一下

include stdlib
file_line{"someline":
   ensure => 'present',
   after => 'default',
   multiple => false,
   path => '/root/openstack-puppet/computenode/nova/test.txt',
   line => 'puppet=ok',
}

该文件看起来适合ini文件格式,因此更好的解决方案是使用inifile资源类型


谢谢你帮助我!!然而,我认为仍然存在一些问题。。。您的代码出现了一些错误。。。我在我的问题上添加了这些问题。请检查。@BlakStar根据您上面的编辑,我发现您对我的答案感到困惑,需要进一步了解这些属性在
文件中的作用。请参考位于的文档。快速修复方法是使用我上面提供的资源。没有理由在
属性之后的
中以文本字符串转义
[]
。您的代码(我刚刚添加了“,”at'line”属性,因为它会产生语法错误)仍然会产生与我在问题中添加的相同的错误(多重匹配)。我检查了此文档上的文件行属性:。Docs说“after”只是表示将在哪里添加“line”,所以我认为它不会影响“match”属性。因此,我猜您的代码也会因为这个原因出现多重匹配错误。@BlakStar希望您能找到使用我的答案的方法,然后从我的答案和文档中了解它是如何工作的。祝你好运@BlakStar在这里是正确的,
之后的
仅用于插入行的位置,而不是
匹配行的位置。因此,我认为上述答案是不正确的,因为它将与
#puppet
行在
[default]
块之外或之前匹配。如果在两个块中使用
multiple=>false
将该行划分为两个块,则还会收到一条错误消息,说明该行已匹配多次,即使是在
之后。这是有道理的,因为默认情况下,
之后的
也不会保护您在另一个块中重击该选项。正则表达式解析不理解ini,您将需要类似于
augeas
的东西,而不是
file\u line
,除了省略任何解释之外,这与现有的、经过投票表决的、五年前的答案有何意义的不同?
ini_setting { "sample setting":
  ensure  => present,
  path    => '/root/openstack-puppet/computenode/nova/test.txt',
  section => 'default',
  setting => 'puppet',
  value   => 'yes',
}