Я использую марионетку для распространения ключей SSH, например:
ssh_authorized_key { "alice@foo.com":
ensure => present,
key => 'xxxx',
type => 'ssh-rsa',
user => 'deploy',
}
В конечном итоге файл ~ / .ssh / authorized_keys содержит комбинацию ключей из нескольких классов, что является желаемым результатом. Однако, если ключ добавлен вручную в $ HOME / .ssh / authorized_keys, Puppet оставит его на месте. Есть ли способ всегда удалить любой ключ, который не был явно определен в манифесте?
У меня марионетка 2.7.1.
Вместо того, чтобы использовать ssh_authorized_key
ресурсов, я решил определить authorized_keys
ресурс, который принимает список всех ключей SSH для одного пользователя. Определение выглядит так:
define authorized_keys ($sshkeys, $ensure = "present", $home = '') {
# This line allows default homedir based on $title variable.
# If $home is empty, the default is used.
$homedir = $home ? {'' => "/home/${title}", default => $home}
file {
"${homedir}/.ssh":
ensure => "directory",
owner => $title,
group => $title,
mode => 700,
require => User[$title];
"${homedir}/.ssh/authorized_keys":
ensure => $ensure,
owner => $ensure ? {'present' => $title, default => undef },
group => $ensure ? {'present' => $title, default => undef },
mode => 600,
require => File["${homedir}/.ssh"],
content => template("authorized_keys.erb");
}
}
$ssh_keys
Параметр принимает все необходимые ключи в виде списка. В authorized_keys.erb
шаблон выглядит так:
# NOTICE: This file is autogenerated by Puppet and should not be modified
<% sshkeys.each do |key| -%>
<%= key %>
<% end -%>
user {'mikko':
...
}
authorized_keys {'mikko':
sshkeys => [
'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ mikko@domain.tld',
'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
],
}
Добавить SSH-ключи условно (например, в разных классах) также легко благодаря Puppet's +>
оператор:
Authorized_keys <| title == 'mikko' |> {
sshkeys +> 'ssh-rsa ASDFASDFASDFASDF mikko@somewhere-else.tld'
}
С помощью этого метода у пользователя никогда не будет ключей, которые явно не указаны в конфигурации Puppet. Строка ключа используется в authorized_keys в неизменном виде, поэтому добавление параметров и ограничений тривиально.
Я был бы рад услышать, если другие успешно использовали этот метод!
Начиная с Puppet 3.6, теперь можно очистить неуправляемые авторизованные ключи SSH через user
тип. Например,
user { 'nick':
ensure => present,
purge_ssh_keys => true,
}
Вы можете сделать это с помощью Ресурсы метатип. НАПРИМЕР.
resources { 'ssh_authorized_key': noop => true, purge => true, }
Настройка noop => true,
предотвращает удаление. Вместо этого марионетка сообщит, что будет удалено. Если это то, что вы хотите, удалите нет заявление.
Идеальный синтаксис для выполнения операций с неуправляемыми ресурсами: под обсуждением.
РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, этот ответ не работает.
В Puppet Forge был опубликован модуль под лицензией Apache версии 2.0, которая предлагает эту возможность.
Однако вместо шаблонов он использует Puppet concat.
https://github.com/nightfly19/puppet-ssh_keys/tree/master/manifests
Вместо того, чтобы передавать массив ключей в качестве параметра, вы определяете отдельные записи для каждого ключа.
Отличный от Микко подход, но тот же результат.