3
  • 我正在寻找一个通用的解决方案,所以 sysctl.conf 只是一个例子。

我有几行配置需要确保存在于我所有服务器的 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:“内容”:“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 failed for value in class content: can't convert Hash into String”

4

3 回答 3

3

有不同的方法可以解决这个问题。

就我个人而言,我认为将整个文件作为一个字符串保存在 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 -%>

或者更好的是,让它成为一个哈希

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这样做的好处是,如果您改用查找方法,您可以在整个层次结构中传播不同的值覆盖。

于 2014-06-13T21:05:31.853 回答
1

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

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

这是一种更好的方法:link

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

于 2014-06-14T00:09:10.647 回答
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"

于 2014-06-15T08:01:25.537 回答