有没有办法使用 Puppet 将一行(或者更好是几行)新文本添加到文件的第一行? (显然只让它做一次)
背景是,我正在管理文件中的某些行,但我想在文件顶部添加一次性注释,以便该文件的清晰部分被“管理”。
我认为您无法使用标准的木偶资源(例如 file_line 或 augeas)来做到这一点。你可以做的是使用 exec fx [edited]:
$file = /somefile,
$text = 'some text'
) {
exec { "add ${text} to ${file}":
command => "sed -i '1s/^/${text}\\n/' '${file}'",
unless => "grep '${text}' '${file}'",
path => ['/bin'],
}
}
请参阅如何在 Bash 中将文本添加到文件的开头?了解使用 bash 的其他示例。
[原始发布语法] 该示例根据 [anonymous] 的建议进行了更新,以支持文件名中的空格和双转义新行。下面保留原始语法以供参考,因为我还没有测试换行符的双重转义。
$file = /somefile,
$text = 'some text'
) {
exec { "add ${text} to ${file}":
command => "sed -i '1s/^/${text}\n/' ${file}",
unless => "grep '${text}' ${file}",
path => ['bin'],
}
}
我使用了
concat
模块,效果非常好。基本上,您声明文件并使用 concat::fragment
创建包含新内容和原始内容的文件。我还使用自定义事实来获取文件的原始文本,以便能够连接两者:
concat { '/somefile':
owner => 'root',
group => 'root',
mode => '0644'
}
concat::fragment { '/somefile':
target => '/somefile',
content => 'This is new text\n',
order => '01'
}
concat::fragment { '/somefile':
target => '/somefile',
content => $facts['original_text'],
order => '02'
}
创建自定义事实:
Facter.add('original_text') do
confine kernel: 'Linux'
setcode do
Facter::Core::Execution.execute('cat /somefile')
end
end
这是简化的答案,不包括查找文件的原始用户并检查
/somefile
是否存在以及新文本是否已在文件中。