如何使用Puppet正确导出资源

时间:2017-01-16 17:06:38

标签: puppet

我一直在思考如何解决 Puppet 4 的问题。

以下是我的案例:

我有一个模块" Cassandra",我有3台机器

  • Cluster1(主机名: CassandraCluster1
  • Cluster2(主机名: CassandraCluster1
  • Cluster3(主机名: CassandraCluster1

我想收集数组中三个群集的主机名,因此我可以将它们传递给cassandra配置文件(我将其用作模板epp):

cassandra.yaml.epp

- seeds: "<%= $cluster::hostnames %>&#34;

所以解决方案是我想出的导出资源:)

我一整天都在玩,但不知道如何弥补这项工作。这是我尝试过的:

在每个集群上我添加此代码以收集主机名:

 @@file {"${hostname}":
        content => 'epp(puppet://modules/cassandra/cassandra.yaml.epp)',
 }
  # Collect:
File <<| |>>

但我不确定这是不是一个好主意?!

2 个答案:

答案 0 :(得分:0)

我找到了一个我现在正在使用的临时解决方案:

我有一个角色,我将添加到每台机器中。我正在使用puppetdbquery模块从puppetdb中检索主机。

然后在puppet代码上我使用此查询来查找具有附加角色的节点

$hosts = query_nodes("role=apache")

答案 1 :(得分:0)

在一定程度上,问题在于如何使用导出的资源创建所需的文件,理解收集的导出的资源会导致将它们添加到目标节点的目录中这一点很重要。导出和收集资源不仅是一项数据传输工作。您的示例导出了多个File资源;收集这些文件将导致在目标服务器上管理相同数量的单独文件(如果碰巧遇到资源标题冲突,则将导致重复的资源错误)。

很长一段时间以来,基于多个节点贡献的片段构建文件的通常方法是使用the puppetlabs/concat module,每个贡献节点都导出concat::fragment资源。例如:

@@concat::fragment { "${hostname} Cassandra seed":
  target  => '/path/to/file',
  content => " ${hostname}",
  order   => '10',
  tag     => 'cassandra'
}

这些将被收集到目标节点的目录中,并与在那里声明的相应concat资源一起使用:

concat { '/path/to/file': 
  ensure => 'present',
  # ...
}

concat::fragment { "Cassandra seed start":
  target  => '/path/to/file',
  content => ' - seeds: "'
  order   => '05',
}

Concat::Fragment <<| tag == 'cassandra' |>>

concat::fragment { "Cassandra seed tail":
  target  => '/path/to/file',
  content => '"'
  order   => '15',
}

这仍然可以正常工作,但是如您在自己的答案中所示,依靠查询puppetdb变得越来越普遍。