Puppet 如何使用Hiera使用file';s';内容';属性 我正在寻找一个通用的解决方案,所以sysctl.conf只是一个例子

Puppet 如何使用Hiera使用file';s';内容';属性 我正在寻找一个通用的解决方案,所以sysctl.conf只是一个例子,puppet,hiera,Puppet,Hiera,我有几行配置需要确保存在于所有服务器的sysctl.conf中: net.ipv4.tcp_syncookies = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 1519344680

我有几行配置需要确保存在于所有服务器的sysctl.conf中:

net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 1519344680
kernel.shmall = 4294967296
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 131072 16777216
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
sysctl.conf文件不需要文件中的前导空格。 我想将以上所有行填充到yaml文件中,以符合Craig Dunn的角色/配置文件方法

如果我尝试使用此格式:

`content: "kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net.core.rmem_default = 33554432\n net.core.wmem_default = 33554432\n"` 
结果文件的每一行(第一行除外)都在第0列中使用空白字符写入。我需要一个换行符,但我不想要前导空格

我正试图找到一种简单、易于复制的方法,在所有节点上复制配置文件,而不使用模板erb文件。我希望我所有的配置行都在一个yaml文件中

这是我的模块的init.pp:

class sysctl_conf   {
  $sysctl_lines = hiera('sysctl_conf')
    file { '/tmp/test.txt':
    content => $sysctl_lines,
    }
}
如果通用。yaml我使用:

sysctl_conf: “内容”:“net.ipv4.ip_forward=0\n net.ipv4.conf.default.rp_filter=1\n net.ipv4.conf.default.accept_source_route=0 kernel.sysrq=0 kernel.core.core__pid=1 net.ipv4.tcp_syncookies=1 net.bridge.nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge-nf-call-arptables=0 kernel-call-arptables=0 kernel.msgmnb=65536\n”
我以“对类内容中的值进行Munging失败:无法将哈希转换为字符串”而结束。

有不同的方法可以实现这一点

就个人而言,我认为在YAML中将整个文件作为一个字符串保存是一个糟糕的选择,但这样做的好处是

sysctl_content: |
      net.ipv4.tcp_syncookies = 1
      net.bridge.bridge-nf-call-ip6tables = 0
      ...
更好的选择是数组

sysctl_lines:
  - net.ipv4.tcp_syncookies=1
  - net.bridge.bridge-nf-call-ip6tables=0
然后使用模板将它们放入文件中,例如

# This file is managed by Puppet
<% scope.function_hiera("sysctl_lines", []).each do |line| -%>
<%= line %>
<% end -%>
还有一个模板,比如

# This file is managed by Puppet
<% scope.function_hiera("sysctl_settings", []).each do |key,val| -%>
<%= key %> = <%= val %>
<% end -%>
#此文件由Puppet管理
= 

这样做的好处是,如果使用
hiera\u hash
lookup方法,您可以在整个层次结构中传播不同的值覆盖。

使用模板和文件管理sysctl conf是一个糟糕的主意

有几十个应用程序可能需要进行更改,因此您不希望由一个模块来控制它们

这是一种更好的方法:


现在,您可以在各个模块中设置各个设置,或者让基类具有某些设置,并让数据库类(例如)配置其他设置,而无需重新定义整个文件。

尽管您的方法可能不是最好的方法,其他答案显示了更好的方法:

你在每行前面的空白处,但第一行在那里,因为你把它放在那里:

content: "kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net.core.rmem_default = 33554432\n net.core.wmem_default = 33554432\n"
您在每个
“\n”
之后都放了一个
。这就是问题所在。

将每个
“\n”
替换为
“\n”
任何您认为合适的组件。

如果通用。yaml我使用:sysctl\u conf:'content':”net.ipv4.ip_forward=0\n net.ipv4.conf.default.rp_filter=1\n net.ipv4.conf.default.accept_source_route=0 kernel.sysrq=0 kernel.core__-pid=1 net.ipv4.tcp_syncookies=1 net.bridge.nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge-nf-call-arptables=0 kernel-arptables=0 kernel.msgmnb=65536kernel.shmmax=1519344680\n kernel.shmall=4294967296\n net.core.rmem_max=33554432\n net.core.wmem_max=33554432\n net.core.rmem_default=33554432\n“现在我的init.pp中的逻辑都被破坏了:那么,你改变了什么?破坏了什么?类sysctl_conf{$sysctl_lines=hiera hash($sysctl_conf'){'/tmp/test.txt':内容=>template(“settings.erb”),}错误:无法从远程服务器检索目录:服务器上的错误400:nil:NilClass位于/etc/puppetlabs/puppet/manifests/site.pp:34节点vmtest2.lvs01.ederp.com上的未定义方法“empty”。警告:未在失败的目录上使用缓存错误:无法检索目录;跳过run我需要为此方法使用create_资源吗?我不了解我认为当你提到模板文件时,你的意思是在模板文件中存储数据是不好的。我倾向于同意。
content: "kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net.core.rmem_default = 33554432\n net.core.wmem_default = 33554432\n"