在 Puppet 中向 /etc/hosts 文件添加一段文本的最佳方法是什么?

在 Puppet 中向 /etc/hosts 文件添加一段文本的最佳方法是什么?

我还想保留手动编辑 hosts 文件的能力,至少是前 10 行。

#Public IP's - eth0
192.168.1.103   front-01
192.168.1.106   front-02

#Private IP's - eth1
192.169.40.201  priv0-0
192.169.40.202  priv0-1
192.169.40.207  priv1-0
192.169.40.208  priv1-1

#Virtual IP's - eth0:1
192.169.50.202  vip-01
192.169.50.205  vip-02

将这些主机条目放在 /etc/hosts 的底部是完美的。最好的方法是什么?有没有比编写 8 行主机清单更好的方法?

# create a simple hostname and ip host entry
host { 'front-01':
    ip => '192.168.1.103',
}

可能有些服务器组需要在其 /etc/hosts 中使用不同的 IP /主机名。我会使用模板,但这意味着人们无法再在其 /etc/hosts 中进行手动更改,因为这些更改会被模板覆盖。

答案1

老实说,使用host资源是最简单的方法。你只需要定义你想让 Puppet 控制的主机,你仍然可以手动编辑文件的其余部分(即使 Puppet 删除了那个告诉你不要这样做的标题)。

augeas模块对于主机文件来说是过度的,因为它只是复制了资源的功能host(尽管它没有添加“不要编辑此文件”标题)。

如果你真的想要更复杂的东西,或者想要精细地控制文件中行的位置,请使用concat 模块使用其中一个片段的本地源。文档中有一个此类示例(使用 motd 文件)concat

但实际上,只需使用host您想要从 Puppet 定义的主机资源,并编辑本地主机文件以满足您的其他需要。

还请注意,您可以在 Puppet 中非常紧凑地编写主机定义:

host {
  # Public IPs - eth0
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';

  # Private IPs - eth1
  'priv0-0': ip => '192.169.40.201';
  'priv0-1': ip => '192.169.40.202';
  'priv1-0': ip => '192.169.40.207';
  'priv1-1': ip => '192.169.40.208';

  # Virtual IPs - eth0:1
  'vip-01': ip => '192.169.50.202';
  'vip-02': ip => '192.169.50.205';
}

答案2

使用 puppet 内置的 augeaus 功能。您需要类似

augeas {
  context => "files/etc/hosts"
  changes => [
    "set <ip address> <name>",
  ],
}

答案3

除了主机资源类型之外,您可能还会选择在 /etc/hosts 文件中使用 augeas,用于重复的 IP 地址行。

hosts 资源类型非常乐意允许具有相同 IP 地址的线路。(谷歌搜索;在哪些极其模糊的情况下这可能是一个好主意。)

但是如果您不希望 /etc/hosts 文件中出现重复的 IP 地址,那么 augeas 可以帮助您。但 hosts 对此没有帮助。

答案4

仅一种方法,无需代码:

使用模板或其他任何可以更新文件/etc/hosts.puppet并带有明确开始和结束行的方法

###PUPPETSTART###
## Users: Lines between START and END will be deleted, put your own entries below 

192.168.0.1 host1
###PUPPETEND###

并有一个 shell 脚本作为依赖项,从中剪切出此段/etc/hosts并将其替换为的内容/etc/hosts.puppet

请注意,当用户编辑文件并且 puppet 运行更改该文件时,会出现竞争条件。或者,指示用户编辑一个文件/etc/hosts.user,并/etc/hosts在其中一个文件更改时从两个文件中构建文件。

相关内容