如何使用 Hiera 使用文件的"content"属性构造配置文件?


  • 我正在寻找一个通用的解决方案,所以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 = 65536n kernel.msgmax = 65536n kernel.shmmax = 1519344680n kernel.shmall = 4294967296n net.core.rmem_max = 33554432n net.core.wmem_max = 33554432n net.core.rmem_default = 33554432n net.core.wmem_default = 33554432n"` 

生成的文件在第0列中除了第一行以外的每一行都使用一个空白字符。我需要一个换行符,但我不想要前导空格。

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

这是我的模块的init.pp:

class sysctl_conf   {
  $sysctl_lines = hiera('sysctl_conf')
    file { '/tmp/test.txt':
    content => $sysctl_lines,
    }
}

如果在公共.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-n f-call-iptables=0 net.bridge.nf-call-arpables=0 kernell.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 -%>

或者更好的是,让它成为一个散列

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查找方法,则可以在整个层次结构中分布不同的值覆盖。

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

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

这是一个更好的方法:链接

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

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

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

content: "kernel.msgmnb = 65536n kernel.msgmax = 65536n kernel.shmmax = 1519344680n kernel.shmall = 4294967296n net.core.rmem_max = 33554432n net.core.wmem_max = 33554432n net.core.rmem_default = 33554432n net.core.wmem_default = 33554432n"

您已经在每个"n"之后放置了一个" "。这就是问题所在
将每个"n "替换为"n",如果可以的话。

相关内容

  • 没有找到相关文章

最新更新