Обновление пароля принципов обслуживания с помощью Terraform в зависимости от того, когда он истекает
Настройка принципа обслуживания с помощью пароля в первый раз работает отлично, однако, я хочу, чтобы срок действия пароля истек, и если срок действия пароля истекает, генерируется новый и обновляет принцип обслуживания с ним, я не Я абсолютно уверен, как делать условия в Terraform, так как я все еще довольно новичок в Terraform, документы не говорят об обновлении принципа обслуживания, только создавая его, и нет никакого объекта данных для извлечения, когда срок его действия истекает
Пока у меня есть это (полное раскрытие, это часть большей терраформной базы, с которой я помогаю):
resource "azuread_application" "current" {
name = "test"
}
resource "azuread_service_principal" "current" {
application_id = "${azuread_application.current.application_id}"
}
resource "random_string" "password" {
length = 64
special = true
}
resource "azuread_service_principal_password" "current" {
service_principal_id = "${azuread_service_principal.current.id}"
value = "${random_string.password.result}"
end_date_relative = "2160h" # valid for 90 days
}
Поскольку пароль действителен только в течение 90 дней, я хочу запустить terraform apply непосредственно перед его истечением и обновить пароль
Обновление 1:
Похоже, что если вы действительно измените ресурс azuread_service_principal_password
, это будет считаться изменением в дереве зависимостей и воссоздает ресурс, к которому вы прикрепили принцип обслуживания, что означает, что нет способа сохранить состояние в учетные данные принципов обслуживания в Terraform, если они должны быть обновлены
Обновление 2:
Я пытался сделать следующее, однако недостатком этого является то, что он запускается каждый раз, когда вы запускаете terraform apply:
скрипт terraform:
resource "azuread_application" "current" {
name = "${var.metadata_name}"
}
resource "azuread_service_principal" "current" {
application_id = "${azuread_application.current.application_id}"
}
resource "random_string" "password" {
length = 64
special = true
}
resource "azuread_service_principal_password" "current" {
service_principal_id = "${azuread_service_principal.current.id}"
value = "${random_string.password.result}"
end_date_relative = "2160h" # valid for 90 days
}
resource "null_resource" "password_updater" {
# Updates everytime you run terraform apply so it will run this script everytime
triggers {
timestamp = "${timestamp()}"
}
provisioner "local-exec" {
command = "sh ${path.module}/update_service_password.sh ${azuread_service_principal.current.id} ${var.resource_group} ${azurerm_kubernetes_cluster.current.name}"
}
}
сценарий:
#!/bin/sh
service_principle_id=$1
resource_group=$2
cluster_name=$3
# get service password expiration
expiration=$(az ad sp list --filter="objectId eq '$service_principle_id'" | jq '.[].passwordCredentials' | jq '.[].endDate' | cut -d'T' -f 1 | cut -d'"' -f 2)
# Format date for condition
now=$(date +%Y%m%d%H%M%S)
expiration_date=$(date -d "$expiration - 30 days" +%Y%m%d%H%M%S)
# Compare today with expiration date
if [ ${now} -ge ${expiration_date} ];
then
# IF expiration date in the next 30 days rest password
sp_id=$(az aks show -g ${resource_group} -n ${cluster_name} --query servicePrincipalProfile.clientId -o tsv)
service_principle_secret=$(az ad sp credential reset --name ${sp_id} --end-date $(date -d "+ 90 days" +%Y-%m-%d) --query password -o tsv)
# Update cluster with new password
az aks update-credentials \
--resource-group ${resource_group} \
--name ${cluster_name} \
--reset-service-principal \
--service-principal ${sp_id} \
--client-secret ${service_principle_secret}
fi