![Puppet:是否可以使用 file_line 类型删除多行?](https://linux22.com/image/671776/Puppet%EF%BC%9A%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20file_line%20%E7%B1%BB%E5%9E%8B%E5%88%A0%E9%99%A4%E5%A4%9A%E8%A1%8C%EF%BC%9F.png)
在我工作的公司过去,有人在中配置了许多别名和导出/etc/profile
。
从那时起,我们就实现了 Puppet,并且有一个管理应用程序用户导出和别名的模块。
新的模块实际上非常简单......它确保名为的文件application_env.sh
驻留在其中/etc/profile.d/
,并且基本上它是配置相关导出和别名的文件。
我被赋予了一项任务,以确保这些导出和别名仅来自文件application_env.sh
,而不是来自/etc/profile
。
所以我打算做的是添加到 application_env 的清单中,它目前看起来像这样:
class appuser-env {
file{ "/etc/profile.d/appuser-env.sh":
ensure => "present",
content => template("appuser-env/appuser-env.sh.erb"),
mode => "774",
require => Class["facts"],
}
}
另一种类型如下:
file_line{ "remove_old_exports_aliases":
ensure => absent,
line => ['export ANT_HOME_1_7_0=/appdir/org/apache/ant/1.7.0', 'export ANT_HOME=$ANT_HOME_1_7_0', 'export PATH=$ANT_HOME/bin:$PATH', 'export JAVA_HOME_1_6_0=/appdir/com/sun/jdk', 'export JAVA_HOME=$JAVA_HOME_1_6_0', 'export PATH=$JAVA_HOME/bin:$PATH','export ENVIRONMENT_TYPE=prod','export CVS_RSH=${CVS_RSH-ssh}# change default from rsh to ssh for cvs command','export TOMCAT_HOME_6_0_29=/appdir/org/apache/tomcat/6.0.29','export TOMCAT_HOME=$TOMCAT_HOME_6_0_29','export PATH=$PATH:$TOMCAT_HOME/bin','export VOLDEMORT_HOME=/appdir/voldemort-0.80.1/config/test_config3','export LOCATION=nyc'],
path => '/etc/profile',
}
但我puppet agent -t
在相关机器上运行时,出现以下错误:
[root@server4 # puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for server4.company.com
Info: Applying configuration version '1448374061'
Error: /Stage[main]/appuser-env/File_line[remove_old_exports_aliases]: Could not evaluate: private method `chomp' called for #<Array:0x7fba5a3ead20>
Notice: Finished catalog run in 16.90 seconds
[root@server4 ]#
知道这个错误意味着什么或如何正确解决吗?
答案1
使用多个file_line
资源,每个资源删除一行:
# for all "file_line" resources .
File_line {
ensure => absent,
path => '/etc/profile',
}
file_line {
'remove_old_exports_aliases':
line => 'export ANT_HOME_1_7_0=/appdir/org/apache/ant/1.7.0';
'remove aliases':
line => 'export ANT_HOME=$ANT_HOME_1_7_0';
}
答案2
尝试这个
file {
--
----}
file_line{ "remove_old_exports_aliases":
ensure => absent,
line => ['export ANT_HOME_1_7_0=/appdir/org/apache/ant/1.7.0'],
path => '/etc/profile',
}->file_line{ "remove aliases":
ensure => absent,
line => ['export ANT_HOME=$ANT_HOME_1_7_0'],
path => '/etc/profile',
}
尝试一下是否可以将其放入循环中。
答案3
与其尝试确保从中删除行/etc/profile
(对于任何高级功能来说,该file_line
资源确实非常糟糕),不如将 的内容/etc/profile
作为一个整体进行管理。这样,您就能准确地知道其中的内容,并且描述系统所需的最终状态,而不是除了您明确尝试删除的几行之外,对其中的内容一无所知。