7

我正在进入 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

有任何想法吗?

4

4 回答 4

7

您可以使用 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 模块的一部分)添加未注释的行并保持注释行不变。

于 2012-08-08T01:35:58.057 回答
6

根据我的经验, file_line 将替换与正则表达式匹配的行。

所以要获得force_color_prompt=yesvs.#force_color_prompt=yes你可以:

file_line {
    'color_prompt':
        path        => '/home/<youruser>/.bashrc',
        match       => 'force_color_prompt',
        line        => "force_color_prompt=yes",
}

重要的是,如果正则表达式匹配,则替换发生适当的位置,即。它会改变线,而不是线的位置。但是,如果正则表达式不匹配,则该行将附加到文件的末尾。

这种体验适用于 Puppet 3.1。

参考:https ://forge.puppetlabs.com/puppetlabs/stdlib

于 2013-07-08T18:14:15.547 回答
1

shellvar已经可以取消注释

shellvar { '.bashrc':
  ensure    => present,
  target    => "/home/${your_user}/.bashrc",
  variable => 'force_color_prompt'
  uncomment => true,
}

我认为这比使用 exec 和调用 sed 要干净得多。

于 2015-05-07T08:14:22.087 回答
0

虽然仅 Augeas 无法做到这一点shellvar,但只要合并此 PR ,来自 Augeasproviders 的提供者就可以做到。

于 2014-01-06T20:40:20.887 回答