我需要确保存在于所有服务器的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,
}
}
如果是common.yaml我使用:
sysctl_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_uses_pid = 1 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 \ n kernel.msgmax = 65536 \ n“ 我最终得到“Munging因课堂内容价值而失败:无法将Hash转换成字符串”
答案 0 :(得分:2)
有不同的方法可以解决这个问题。
就我个人而言,我认为将整个文件保留为YAML中的一个字符串是一个糟糕的选择,但syntax就是
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 -%>
或者更好的是,将它变为哈希
sysctl_settings:
net.ipv4.tcp_syncookies: 1
net.bridge.bridge-nf-call-ip6tables: 0
...
和
这样的模板# This file is managed by Puppet
<% scope.function_hiera("sysctl_settings", []).each do |key,val| -%>
<%= key %> = <%= val %>
<% end -%>
如果您使用hiera_hash
查找方法,则可以在整个层次结构中传播不同的值覆盖。
答案 1 :(得分:1)
使用模板和文件管理sysctl conf是一个糟糕的主意。
有许多应用程序可能需要进行更改,因此您不希望1个模块全部控制它们。
这是一种更好的方法:link
现在,您可以在单个模块中设置单个设置,或者让您的基类具有某些设置,并让您的数据库类(例如)配置其他设置,而无需重新定义整个文件。
答案 2 :(得分:1)
虽然您的方法可能不是最好的主意,而其他答案显示更好的方法:
你在每一行前面的空白区域,但第一行是在那里,因为你把它放在那里:
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"
。