Назад | Перейти на главную страницу

Автоматическое обновление главных сертификатов марионетки для нового сертификата

Я собираюсь настроить несколько узлов без сохранения состояния.

Каждому узлу предоставляется один и тот же файл образа ОС. Он получает имя хоста с сервера DHCP / DNS во время загрузки.

Следующим шагом будет получение конфигурации сервера ... Я планирую использовать марионетку для этой части ....

НО на этом этапе у узла нет правильного сертификата, поскольку это общий образ ОС. В первый раз, когда узел виден в сети, это работает нормально, потому что я могу использовать autosign.conf, чтобы разрешить подпись и проверку сертификата.

Что мне нужно сделать, чтобы решить случай, когда узел уже был замечен в сети, поэтому у мастера марионетки есть сертификат для него ... Однако сертификат сервера НЕ будет соответствовать вновь созданному сертификату на узле.

Я пробовал вставить

allow_duplicate_certs = true

в puppet.conf

НО вроде не работает. Я ищу правильные настройки? Есть ли лучший / правильный способ решить эту проблему?

Обычный способ справиться с такими вещами (особенно в средах, подобных EC2) - использовать UUID для сертификатов клиентов вместо имен хостов. Я нашел разумное руководство по процессу на Куклы меня"s"Использование UUID для имен сертификатов агента", но суть процесса такова:

  1. Установить uuidgen
  2. Бегать uuidgen чтобы получить UUID.
  3. редактировать puppet.conf и добавить certname = <UUID> к [agent] раздел.
  4. Продолжайте процесс развертывания Puppet как обычно.

Этот процесс можно без особого труда написать по сценарию.

Я использую внутренние имена хостов EC2 в качестве имени хоста (т.е. ip-X-X-X-X), а также в качестве имени сертификата.

И я использую мастер для создания экземпляров EC2. И с мастер hooks, я убеждаюсь, что если сертификат с тем же именем «ip-X-X-X-X» существует на главном сервере, он удаляется до создания экземпляра.

Перед удалением я также переименовал хост в foreman в "ip-X-X-X-X-" из любого понятного имени, которое я ему дал.

Это также означает, что я не вижу понятных имен в списке хостов, но меня это устраивает, поскольку я использую группы хостов и могу использовать плагин «столбец», чтобы увидеть поле комментария в foreman, где я храню понятную информацию.

Не идеальная ситуация, но пока работает для меня.

Возможно, это не идеальное решение, но вот что я делал перед тем, как перейти на солончак:

При развертывании новой коробки EC2 (я использую ткань для этого, все это делается на puppetmaster):

1) На PuppetMaster (сертификат и имя хоста компьютера уже были известны; соглашение об именах):

local('sudo puppetca -c {}' .format(cert_name));

local('sudo puppetca -g {}' .format(cert_name));

Это решит упомянутую вами проблему старого сертификата.

После этого скопируйте следующие файлы в новую развернутую коробку с помощью scp:

1) /var/lib/puppet/ssl/ca/signed/signed-cert_name.pem

2) /var/lib/puppet/ssl/private_keys/private-cert_name.pem

3) /var/lib/puppet/ssl/certs/ca.pem

Код ткани для вышесказанного:

local("sudo cp /var/lib/puppet/ssl/ca/signed/{}.pem /tmp/signed-{}.pem" .format(cert_name,cert_name))
local("sudo chown ubuntu:ubuntu /tmp/signed-{}.pem" .format(cert_name))
local("sudo cp /var/lib/puppet/ssl/private_keys/{}.pem /tmp/private-{}.pem" .format(cert_name,cert_name))
local("sudo chown ubuntu:ubuntu /tmp/private-{}.pem" .format(cert_name))
local("sudo cp /var/lib/puppet/ssl/certs/ca.pem /tmp/ca.pem")   
local("sudo chown ubuntu:ubuntu /tmp/ca.pem")
put("/tmp/signed-{}.pem" .format(cert_name),  "/home/ubuntu/signed-{}.pem" .format(cert_name))
put("/tmp/private-{}.pem" .format(cert_name) , "/home/ubuntu/private-{}.pem" .format(cert_name))
put("/tmp/ca.pem" , "/home/ubuntu/ca.pem")

Теперь в новом окне запустите следующее (у меня был простой сценарий bash, который делал это, и fqdn был переданным параметром):

sudo chown root:root /home/ubuntu/ca.pem /home/ubuntu/signed-$fqdn.pem /home/ubuntu/private-$fqdn.pem
sudo chmod 600 /home/ubuntu/private-$fqdn.pem
sudo mkdir -p /var/lib/puppet/ssl/certs/ /var/lib/puppet/ssl/ca/signed/ /var/lib/puppet/ssl/private_keys/
sudo mv /home/ubuntu/ca.pem /var/lib/puppet/ssl/certs/ca.pem
sudo mv /home/ubuntu/signed-$fqdn.pem /var/lib/puppet/ssl/ca/signed/$fqdn.pem
sudo mv /home/ubuntu/private-$fqdn.pem /var/lib/puppet/ssl/private_keys/$fqdn.pem

Надеюсь, это было немного полезно.

примечание: local и put - операции Fabric