希望有比我更有木偶经验的人能用我正在尝试的配置给我一些建议。
我使用saz/ssh作为这个模块。
我的目标
- 使用此模块创建一个默认的ssh配置,该配置被推送到所有redhat 7/8服务器
- 允许在单个服务器的基础上,通过hiera覆盖单个ssh选项
为了实现#1,我创建了自己的"模块",它声明了ssh::server类,并定义了我的选项。我认为这被称为类资源类声明。(为了可读性,缩短了代码(
#
class profiles::sshd::config {
class { 'ssh::server':
validate_sshd_file => true,
storeconfigs_enabled => false,
options => {
'Port' => [22],
'AddressFamily' => 'any',
'ListenAddress' => '0.0.0.0',
'Protocol' => '2',
'HostKey' => ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key','/etc/ssh/ssh_host_ed25519_key'],
'RekeyLimit' => 'default none',
'SyslogFacility' => 'AUTHPRIV',
'LogLevel' => 'INFO',
}
}
}
然后,我将这个"模块"包含在我的基础中。这很好,直到我想在单个服务器的基础上覆盖这些选项中的任何一个。我不能让希拉去上班。
申报
ssh::server::options:
Port: [2222]
例如,在服务器的fqdnyaml文件中,它什么也不做。如果我直接包含ssh::server模块,而不是通过我自己的类,那么hiera将覆盖工作。
我已经尝试了hiera重写的各种语法,但从未在puppet运行中获得任何输出,除非我直接使用了该类。例如,我尝试过:
ssh::server:options:
profiles::sshd::config:
profiles::sshd::config::ssh::server:
profiles::sshd::config::options:
profiles::sshd::config::ssh::server::options:
有没有更好的方法可以让我随心所欲,或者有人可以帮助我如何以这种方式声明hiera覆盖?
任何帮助都将是非常有用的
为了实现#1,我创建了自己的"模块">
。。。在其中,一个名为profile::sshd::config
的类。。。
,它声明ssh::server类,并定义我的选项。我认为这被称为类资源类声明。
是的,您已经编写了类似资源的类声明。这通常是个坏主意。有几个原因,但其中之一是。。。
[when]我想在单个服务器上覆盖这些选项中的任何一个我不能让希拉去上班。
通过类似资源的类声明指定的类参数值优先于通过任何其他可用方式指定的值,包括Hiera数据。您无法覆盖它们。
你有两个主要的选择:
-
为包装类的每个想要自定义的参数提供自己的参数。使用这些来初始化包装类:
class profiles::sshd::config( Boolean $validate_sshd_file = true, Boolean $storeconfigs_enabled = false, Hash $options = { ... }, ) { class { 'ssh::server': validate_sshd_file => $validate_sshd_file, storeconfigs_enabled => $storeconfigs_enabled, options => $options, } }
假设您随后通过类似include的声明来声明类
profiles::sshd::config
,您可以通过Hiera自定义其参数。但请注意 -
如果您更改为类
ssh::server
的类似include的声明,那么您既可以通过Hiera为其定义默认参数,也可以通过Hiera.自定义其参数。
还有一条中间道路:给定类似资源的ssh::server
声明,您可以使用Hiera自定义声明中指定的参数以外的任何和所有参数。因此,如果有一些参数您希望避免可用于自定义,那么您可以考虑(仅(通过类资源声明显式地声明它们,其余的则依赖于Hiera。但是,请注意,这仍然会让您面临类资源声明的其他一些问题(这将是一个单独的问题(。