如何使用基于puppet的引导在EC2实例中设置主机名

Joh*_*han 11 puppet amazon-ec2 amazon-web-services puppetlabs-aws

我正在尝试使用EC2实例在AWS中构建一个木偶管理基础架构(非企业).使用puppetlabs-aws模块我可以通过方便的方式创建机器.接下来是在每个节点上进行本地设置,最重要的是设置唯一的主机名.我怎样才能做到这一点?

我知道的一种方法是通过user_data参数提供脚本.这将是很好的,但为了可用,我需要能够参数化该脚本,以避免为每个代理重复一次脚本.

是否有意义?我真的很感激一种实现这一目标的便捷方式,因为我想以编程方式启动新实例.任何建议都将被考虑.

更新

举一个我的问题的例子,考虑我的配置木偶清单的这个片段:

ec2_instance { 'backend':
  ensure => present,
  name => 'backend',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  user_data => template('configure.erb'),
}

ec2_instance { 'webfront':
  ensure => present,
  name => 'webfront',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  user_data => template('configure.erb'),
}
Run Code Online (Sandbox Code Playgroud)

这将确保两个实例启动并运行.请注意user_data => template('configure.erb')引用模板脚本,该脚本在创建后在实例上执行.如果我只知道决定依据的数据,我可以在这里设置主机名(或我想要的任何东西).我可以在实例描述中添加标签,但configure.erb据我所知,从脚本中无法读取.

无论如何,设置主机名只是我解决根本问题的想法.可能还有其他更方便的方法.我想要的只是让这两个实例代表木偶大师的不同节点类型的方法.

Vor*_*ung 3

问题是如何设置一个新实例,以便它从特定类加载其配置

让我尝试解释一下我认为您正在尝试解决的问题

我想在这里回答什么

您有一个使用 aws-puppet 模块在 AWS 上设置 EC2 虚拟主机的现有脚本。该模块调用AWS API来实际创建EC2虚拟主机。但它们仅包含 API 调用中使用的 AMI 文件“内置”的配置。典型的 AMI 文件可能是 Centos 基础映像。在此阶段可以通过“用户数据脚本”进行进一步配置。但我们假设这是一个 shell 脚本,难以测试和维护,因此不包含复杂的设置

因此需要进一步配置、安装软件包和设置。为了实现此设置,木偶有第二阶段的活动,使用完全不同的清单(问题中未详细说明)

第二阶段由新的 EC2 虚拟主机控制,该虚拟主机以其自身的权限连接到 puppet master。所以我假设你正在做的是:

  • 第 1 阶段,制作 EC2 主机
  • 第 2 阶段,当他们从 puppet 中自行配置时

使用角色的基本答案

这里有一些关于如何使用 EC2 主机的两阶段配置来实现此场景的一些想法

在创建时创建一个自定义事实“角色”。像这样在 /etc/facter/facts.d/role.yaml 中创建一个文件

role: webserver
Run Code Online (Sandbox Code Playgroud)

可以通过将这样的命令添加到用户数据脚本来创建实例来进行设置

echo 'role: webserver' > /etc/facter/facts.d/role.yaml
Run Code Online (Sandbox Code Playgroud)

只要在木偶启动之前设置这个“角色”,它就能正常工作。

我假设您有一组带有清单的模块,并且模块路径中可能有与角色同名的文件子目录

接下来,更改您的 site.pp 内容,如下所示

include "$role"
Run Code Online (Sandbox Code Playgroud)

模块中的 init.pp 将启动并执行正确的操作,安装软件包、配置文件等!

这个想法在这里有更详细的解释https://puppetlabs.com/presentations/designing-puppet-rolesprofiles-pattern


另一种方法

上面是一个非常粗略的方法,我还没有测试过!我们的设置有角色,但通过 hiera 配置加载它们。heira 配置看起来有点像这样

---
:backends:
  - yaml
:hierarchy:
    - role/%{::role}
    - global
:yaml:
  :datadir: /etc/puppet/environments/production/hiera
Run Code Online (Sandbox Code Playgroud)

然后我可能有一个 /etc/puppet/environments/production/hiera/role/webserver.yaml 文件,其中写着

classes:
  - webserver
  - yum_repos
  - logstash
  - java8
Run Code Online (Sandbox Code Playgroud)

site.pp 的末尾说

hiera_include('classes')
Run Code Online (Sandbox Code Playgroud)

它从 module_include 文件加载所有相关的“类”定义

这样做的优点是每个角色可以加载多个类,并且代码重复更少

yaml 配置的“全局”部分适用于环境中所有内容加载的类,例如管理员用户 ssh 密钥


定义类型示例

下面是一个示例,说明如何使用定义的类型作为 ec2_instance 的包装器将“myrole”传递到模板中。我还没有测试过这个,我没有安装 aws puppet 的东西

define my_instance( 
  $ensure = present,
  $region = 'us-west-2',
  $image_id = 'ami-f0091d91',
  $instance_type = 't2.micro',
  $key_name= 'mykey',
  $security_groups = ['provision-sg'],
  $myrole = 'webserver'
  )
{
ec2_instance { $title :
  ensure => $ensure,
  name => $title,
  region => $region,
  image_id => $image_id,
  instance_type => $instance_type,
  key_name => $key,
  security_groups => $security_groups,
  user_data => template('configure.erb'),
}
}

$instance_data={
  'backend' =>
  {
  ensure => present,
  name => 'backend',
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  myrole => 'voodooswamp'
},
  'webfront'=>
  {
  ensure => present,
  region => 'us-west-2',
  image_id => 'ami-f0091d91',
  instance_type => 't2.micro',
  key_name => 'mykey',
  security_groups => ['provision-sg'],
  myrole => 'humanfly'
  }
}


create_resources(my_instance, $instance_data)
Run Code Online (Sandbox Code Playgroud)