我正在进入Puppet并且喜欢它,但是我用一个小东西碰到了我的头,我肯定必须比我做的更容易。
我希望在用户的.bashrc
中取消注释这一行:
#force_color_prompt=yes
我一直在使用augeas做很多事情,但似乎这对此无效。
我注意到有一个file_line
资源可用于确保文件中存在一行,但我需要该行保留在同一位置。
我不希望用我自己的副本完全替换.bashrc
,尽管看到这种模式在Puppet中很受欢迎,但它对我来说没有意义,因为我不想维护我的升级之间的版本。
在sed中我用这个:
sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/g" ~/.bashrc
有什么想法吗?
答案 0 :(得分:6)
你可以使用grep将一个除外选项添加你的sed命令给一个exec。像这样(未经测试):
exec { 'force_color_prompt':
command => 'sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/g" .bashrc'
cwd => '/home/user',
shell => true,
unless => 'grep -Fxq "force_color_prompt=yes" .bashrc',
}
或者使用您提到的file_line资源(我相信Puppet Labs stdlib模块的一部分)添加未注释的行并保持注释行不受影响。
答案 1 :(得分:6)
根据我的经验,file_line将替换与正则表达式匹配的行。
为了得到force_color_prompt=yes
与#force_color_prompt=yes
,您可以:
file_line {
'color_prompt':
path => '/home/<youruser>/.bashrc',
match => 'force_color_prompt',
line => "force_color_prompt=yes",
}
重要的是,如果正则表达式匹配,则替换在位置发生,即。它会改变线条,而不是线条的位置。如果正则表达式不匹配,则该行将附加到文件的末尾。
这种体验与Puppet 3.1有关。
答案 2 :(得分:1)
shellvar已经可以取消注释行
shellvar { '.bashrc':
ensure => present,
target => "/home/${your_user}/.bashrc",
variable => 'force_color_prompt'
uncomment => true,
}
我认为这比使用exec和调用sed更清晰。
答案 3 :(得分:0)
虽然仅Augeas无法做到,但只要合并this PR,Augeasproviders的shellvar
提供商就能够做到这一点。