如何使用 Puppet ENC 定义多个 /etc/hosts 条目?

如何使用 Puppet ENC 定义多个 /etc/hosts 条目?

我正在为我的 Puppet 基础架构编写外部节点分类器,并且需要/etc/hosts在每个节点上操作文件。以下内容(由于键重复)是无效的 YAML:

---
  host:
    name: www1.example.com
    host_aliases: www1
    ip: 1.2.3.4
  host:
    name: www2.example.com
    host_aliases: www2
    ip: 1.2.3.5

我懂了这个相关答案,其代码如下:

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';
}

然而,

  1. 我暂时还不清楚这里到底发生了什么。
  2. 我在任何地方都找不到关于此内容的文档。
  3. 因为这些(看起来不像)类参数 - 并且因为上面的#1 和#2 - 我也不清楚如何将其转换为 YAML。

一个简单的猜测是:

'host':
  'www1':
    'ip': 1.2.3.4
  'www2':
    'ip': 1.2.3.5

但是由于上述第 2 点,我不太愿意在生产中继续使用这种方法。我的问题是:

在哪里可以找到有关以这种方式使用主机类的文档?

或者失败了

我还可以用什么其他方式来管理/etc/hostsENC 中的多个条目?

注意:这些定义用于在云服务 API 上快速配置临时多节点集群,以用于开发和测试目的,因此,尽管我并不完全不愿意探索基于 DNS(或其他替代)的解决方案,但/etc/hosts以这种方式进行管理(如果可能)是一种很多更简单的解决方案,具有更少的活动部件。


解决方案:这里发布供参考的是我的最终代码:

class my_hosts(
  $hosts = {
    'localhost.localdomain' => {
      'ensure'       => 'present',
      'name'         => 'localhost.localdomain',
      'host_aliases' => 'localhost',
      'ip'           => '127.0.0.1',
    },
  },
  ) {

  create_resources host, $hosts

}

然后我的 ENC YAML 看起来像这样:

classes:
  my_hosts:
    hosts:
      www1.example.com:
        ensure: present
        name: www1.example.com
        host_aliases: www1
        ip: 10.0.0.101
      www2.example.com:
        ensure: present
        name: www2.example.com
        host_aliases: www2
        ip: 10.0.0.102

答案1

广告 1 和 2:

host {
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';
}

只是一个缩写符号为了

host { 'front-01':
  ip => '192.168.1.103',
}
host { 'front-02':
  ip => '192.168.1.106',
}

广告 3:

当您有如下 YAML 数据条目时:

custom_hosts:
  www1:
    ip: 1.2.3.4
  www2:
    ip: 1.2.3.5
    comment: other attributes work also
  www3:
    name: testserver
    ip: 1.2.3.6

你可以将其加载到 Puppet 哈希中,然后从中创建资源

$custom_hosts = hiera('custom_hosts',{})
create_resources(host, $custom_hosts)

这会产生与以下相同的结果:

host { 'www1':
  ip => '1.2.3.4',
}
host { 'www2':
  ip      => '1.2.3.5',
  comment => 'other attributes work also',
}
host { 'www3':
  name => 'testserver',
  ip   => '1.2.3.6',
}

因此这些行应该写入 /etc/hosts:

1.2.3.4 www1
1.2.3.5 www2 # other attributes work also
1.2.3.6 testserver

相关内容