Я пытаюсь создать сертификат TLS для аутентификации сервера в Docker в системе Terraformed. Чтобы создать сертификат сервера TLS, я сделал следующее
resource "tls_private_key" "master-1" {
algorithm = "RSA"
rsa_bits = "2048"
}
resource "tls_cert_request" "master-1" {
key_algorithm = "RSA"
private_key_pem = "${tls_private_key.master-1.private_key_pem}"
subject {
common_name = "${aws_instance.master-1.public_dns}"
}
dns_names = [
"${aws_instance.master-1.public_dns}",
"${aws_instance.master-1.private_dns}",
]
ip_addresses = [
"${aws_instance.master-1.public_ip}",
"${aws_instance.master-1.private_ip}",
]
}
resource "tls_locally_signed_cert" "master-1" {
ca_key_algorithm = "RSA"
cert_request_pem = "${tls_cert_request.master-1.cert_request_pem}"
ca_private_key_pem = "${tls_private_key.devops.private_key_pem}"
ca_cert_pem = "${tls_self_signed_cert.devops.cert_pem}"
validity_period_hours = 8760
allowed_uses = [
"server_auth",
"digital_signature",
"key_encipherment",
]
}
в resource "tls_cert_request" "master-1"
раздел я добавил ссылки на master-1
aws_instance
В данном случае у меня есть следующий провайдер, который использует значения из подписанного сертификата
provisioner "remote-exec" {
inline = [
"echo ${tls_self_signed_cert.devops.cert_pem} > /tmp/ca.pem",
"echo ${tls_locally_signed_cert.master-1.cert_pem} > /tmp/cert.pem",
"echo ${tls_private_key.master-1.private_key_pem} > /tmp/key.pem",
]
}
Я знаю, что технически это цикл, и когда я terraform plam
это ошибка с
Error: Error asking for user input: 1 error(s) occurred:
* Cycle: aws_instance.master-1, tls_cert_request.master-1, tls_locally_signed_cert.master-1
Поэтому я хотел спросить, есть ли способ избежать этого, кроме использования openssl и создания TLS в сценарии обеспечения?
Это то, что я сделал для своей среды Vagrant, которую собираюсь перенести на терраформирование.
mkdir -p /var/lib/docker
openssl genrsa -out /var/lib/docker/key.pem 4096 2> /dev/null
openssl req -subj "/CN=$(hostname)" -sha256 -new -key /var/lib/docker/key.pem -out /tmp/server.csr
echo subjectAltName = DNS:$(hostname),IP:$(hostname -I | awk '{print $1}'),IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> /tmp/extfile.cnf
openssl x509 -req -days 365 -sha256 -in /tmp/server.csr -CA /vagrant/ca/ca.pem -CAkey /vagrant/ca/ca-key.pem -CAcreateserial -out /var/lib/docker/cert.pem -extfile extfile.cnf -passin file:/vagrant/ca/passphrase
rm /tmp/server.csr /tmp/extfile.cnf
Использовать null_resource
для развертывания сертификатов вместо этого в AWS_instance.
resource "null_resource" "master" {
connection {
type = "ssh"
host = "${aws_instance.master-1.0.public_ip}"
user = "fedora"
timeout = "15m"
}
provisioner "remote-exec" {
inline = [
"echo ${tls_self_signed_cert.devops.cert_pem} > /tmp/ca.pem",
"echo ${tls_locally_signed_cert.master-1.cert_pem} > /tmp/cert.pem",
"echo ${tls_private_key.master-1.private_key_pem} > /tmp/key.pem",
]
}
}