Puppet 木偶:如何解决;文件“U行”;多匹配模式
我正在尝试使用puppet更改配置文件 这是我要更改的test.txt文件: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 =>
[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',
}