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据我所知,从脚本中无法读取.
无论如何,设置主机名只是我解决根本问题的想法.可能还有其他更方便的方法.我想要的只是让这两个实例代表木偶大师的不同节点类型的方法.
问题是如何设置一个新实例,以便它从特定类加载其配置
让我尝试解释一下我认为您正在尝试解决的问题
您有一个使用 aws-puppet 模块在 AWS 上设置 EC2 虚拟主机的现有脚本。该模块调用AWS API来实际创建EC2虚拟主机。但它们仅包含 API 调用中使用的 AMI 文件“内置”的配置。典型的 AMI 文件可能是 Centos 基础映像。在此阶段可以通过“用户数据脚本”进行进一步配置。但我们假设这是一个 shell 脚本,难以测试和维护,因此不包含复杂的设置
因此需要进一步配置、安装软件包和设置。为了实现此设置,木偶有第二阶段的活动,使用完全不同的清单(问题中未详细说明)
第二阶段由新的 EC2 虚拟主机控制,该虚拟主机以其自身的权限连接到 puppet master。所以我假设你正在做的是:
这里有一些关于如何使用 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)
| 归档时间: |
|
| 查看次数: |
954 次 |
| 最近记录: |