我正在尝试使用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'),
}
这将确保两个实例都已启动并正在运行。请注意,user_data => template('configure.erb')
一旦创建实例,便会引用实例上执行的模板脚本。如果我只知道决策所依据的数据,则可以在此处设置主机名(或任何我想设置的名称)。我可以在实例描述中添加标签,但是configure.erb
据我所知,这在脚本中是无法读取的。
无论如何,设置主机名只是我解决根本问题的想法。可能还有其他更方便的方法。我想要的只是使这两个实例代表the主节点的不同节点类型的一种方式。
问题是如何使用来设置新实例,以便它将从特定类加载其配置
让我尝试解释我认为您正在尝试解决的问题
您已有一个脚本,该脚本使用aws-puppet模块在AWS上设置EC2虚拟主机。该模块调用AWS API来实际制作EC2虚拟主机。但是它们仅包含“内置”在API调用中使用的AMI文件中的配置。典型的AMI文件可能是Centos基本映像。在此阶段,可以通过“用户数据脚本”进行进一步配置。但让我们假设这是一个shell脚本,难以测试和维护,因此不包含复杂的设置
因此,需要进一步的配置,软件包的安装和设置。为了使这种设置发生,木偶有第二个活动阶段,使用完全不同的清单(问题中没有详细介绍)
第二阶段由新的EC2虚拟主机独立控制,该虚拟主机附加到木偶主机上。所以我假设您正在做的是:
这里有一些有关如何通过EC2主机的两阶段配置来实现此方案的想法
在创建时,创建一个自定义事实“角色”。像这样在/etc/facter/facts.d/role.yaml中制作文件
role: webserver
可以通过在用户数据脚本中添加这样的命令来创建实例,从而进行设置
echo 'role: webserver' > /etc/facter/facts.d/role.yaml
只要在木偶启动之前设置了此“角色”,它将正常工作。
我假设您有一组带有清单的模块,也许还有模块路径中与角色同名的文件子目录
接下来,将您的site.pp更改为类似
include "$role"
模块中的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
然后,我可能会有一个/etc/puppet/environments/production/hiera/role/webserver.yaml文件,其中显示
classes:
- webserver
- yum_repos
- logstash
- java8
然后site.pp的末尾说
hiera_include('classes')
它从modules_include文件加载所有相关的“类”定义
这样做的优点是每个角色可以加载多个类,而代码重复更少
yaml配置的“全局”部分适用于环境中所有内容加载的类,例如admin user ssh keys
这是一个示例,说明如何使用定义的类型作为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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句