Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Terraform 5 базис


Terraform 5 базис

Завершаем серию статей:
http://snakeproject.ru/rubric/article.php?art=е1_21082024
http://snakeproject.ru/rubric/article.php?art=terraform_05092024
http://snakeproject.ru/rubric/article.php?art=terraform_13092024
https://snakeproject.ru/rubric/article.php?art=t_17092024

Часть кода дублироваться не будет

Доусовершенствуем предыдущую статью, прикрутим рандомные пароли

# cat variables.tf
variable "do_token" {}
variable "aws_access_key" {}
variable "aws_secret_key" {}

variable "ssh_public_key_" {
    default     = "~/.ssh/id_rsa.pub"
    description = "My key"
}

variable "ssh_private_key" {
    default     = "~/.ssh/id_rsa"
    description = "My private key"
}

variable "instance_count" {
  default = "2"
}

# cat resources.tf
resource "digitalocean_volume" "t5" {
  count                   = var.instance_count
  region                  = "nyc1"
  name                    = "vol-${count.index + 1}"
  size                    = 5
  initial_filesystem_type = "ext4"
  description             = "test_5gb_volume"
}

resource "digitalocean_ssh_key" "local_ssh_pkey" {
  name       = "ssh_public_key_"
  public_key = file(var.ssh_public_key_)
}

resource "random_password" "my_password" {
  count = var.instance_count
  length  = 12
  special = true
  override_special = "_%@"
}

resource "digitalocean_droplet" "foobar" {
  count      = var.instance_count
  name       = "serv-${count.index + 1}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  ssh_keys   = [digitalocean_ssh_key.local_ssh_pkey.id]
  volume_ids = ["${element(digitalocean_volume.t5.*.id, count.index)}"]
  connection {
      user = "root"
      type = "ssh"
      private_key = file(var.ssh_private_key)
      timeout = "2m"
      host = self.ipv4_address
  }
  provisioner "remote-exec" {
    inline = [
          "usermod --password '${random_password.my_password[count.index].result}' root"
      ]
  }
}

locals {
  vps_ip = digitalocean_droplet.foobar[*].ipv4_address
}

data "aws_route53_zone" "zone" {
  name = "domain.ru"
}

resource "aws_route53_record" "record" {
  for_each = toset(local.vps_ip)
  zone_id = data.aws_route53_zone.zone.id
  name    = "serv-${index(local.vps_ip, each.value) + 1}"
  type    = "A"
  ttl     = "300"
  records = [each.value]
}

output "my_password" {
  sensitive = true
  value = random_password.my_password[*].result
}

Выведем созданные пароли:
#terraform output -json my_password

 

Вывод чувствительного значения sensitive Terraform

Если вы не знаете, что это такое, в принципе, вы можете объявить переменную как чувствительную, и terraform предотвратит появление этих данных в CLI и выводе журнала. Но будьте осторожны — данные по-прежнему сохраняются в файле состояния terraform в виде открытого текста, поэтому убедитесь, что вы защищаете и ограничиваете доступ к файлам состояния terraform.

 

Метод 1: необработанный вывод Terraform

Если у вас есть выходное значение, основанное на чувствительной переменной или атрибуте, вы получите сообщение об ошибке, если не добавите объявление: sensitive = true.

Эта ошибка заставляет вас явно объявить вывод, основанный на чувствительной переменной или атрибуте.

output "db_password" {
  value     = aws_db_instance.default.password
  sensitive = true   # this is required to output sensitive values
}

Однако даже после добавления sensitive = true к выходным данным значение все равно будет замаскировано с помощью <sensitive>.

Однако есть способ вывести значение в виде открытого текста. Давайте рассмотрим пример.

Объявите переменную как sensitive и попробуйте вывести ее как выходные данные:

variable "mysecretvar" {
  type      = string
  sensitive = true
}

output "mysecretvar" {
    value = var.mysecretvar
}

Выполнение apply или plan для этого кода приведет к ошибке типа:

To reduce the risk of accidentally exporting sensitive data that was intended to be only internal, Terraform requires that any root module output containing sensitive data be explicitly marked as sensitive, to confirm your intent.

If you do intend to export this data, annotate the output value as sensitive by adding the following argument:
sensitive = true

Давайте исправим ошибку, добавив sensitive = true к выводу:

variable "mysecretvar" {
  type      = string
  sensitive = true
}

output "mysecretvar" {
  value     = var.mysecretvar
  sensitive = true
}

Ошибка исчезла, но значение по-прежнему не отображается в виде открытого текста:

terraform output
mysecretvar = <sensitive>

Вывести вывод в виде открытого текста terraform с флагом -raw:

terraform output -raw mysecretvar
secret-data

 

Метод 2: Функция nonsensitive()

Функция nonsensitive(), как следует из названия, предотвращает маскировку и раскрывает ваши конфиденциальные данные.

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

Пожалуйста, убедитесь, что вы знаете о последствиях для безопасности вывода вашего конфиденциального значения в виде открытого текста.

Это очень просто использовать — вы просто предоставляете выходное значение функции и удаляете объявление конфиденциальности:

variable "mysecretvar" {
  type      = string
  sensitive = true
}

output "mysecretvar" {
  value     = nonsensitive(var.mysecretvar)
}

Теперь наши выходные данные обрабатываются так же, как и любые другие неконфиденциальные выходные данные:

terraform output
mysecretvar = "secret-data"

 

Крайний кусок текста переведен отсюда

 

Итоговый пример

Мы применим файл шаблонов и запись в локальный файл

В файле шаблнов data.tmpl будет пример вывода списка и словаря
Будет применяться цикл for

Из конструкции local_file записи вывода в локальный файл out.txt
Список будет с выводом индекса записи ${index} через указание templatefile в файл data.tmpl

В выводах out есть чувствительные переменные, помечены sensitive
Можно вывести с помощью команды terraform output -json my_password

Переменная proj_settings - словарь с настройками для проекта

provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}
provider "digitalocean" {
  token = var.do_token
}
provider "aws" {
    access_key  = var.aws_access_key
    secret_key  = var.aws_secret_key
    region = var.aws_region
}


data.tmpl
%{ for index,pass in passes ~}
${index + 1}: ${pass}
%{ endfor ~}
%{ for dns,details in records ~}
${dns}: ${details.fqdn}
%{ endfor ~}


variables.tf
variable "do_token" {}
variable "aws_access_key" {}
variable "aws_secret_key" {}

variable "local_ssh_key_path" {
    default     = "~/.ssh/id_rsa.pub"
}

variable "local_ssh_private_key_path" {
    default     = "~/.ssh/id_rsa"
}

variable "instance_count" {
  default = "2"
}

variable "proj_settings" {
  type        = map(any)
  default     = {
    prefix      = "lb",
    your_login  = "your_login"
  }
}


resources.tf
resource "digitalocean_volume" "vol_5" {
  count                   = var.instance_count
  region                  = "nyc1"
  name                    = "vol-${count.index + 1}"
  size                    = 5
  initial_filesystem_type = "ext4"
  description             = "test_5gb_volume"
}

resource "digitalocean_ssh_key" "local_ssh_pkey" {
  name       = "local_ssh_key_path"
  public_key = file(var.local_ssh_key_path)
}

resource "random_password" "my_password" {
  count = var.instance_count
  length  = 16
  special = true
  override_special = "_%@"
}

resource "digitalocean_droplet" "foobar" {
  count      = var.instance_count
  name       = "${var.proj_settings.your_login}-${var.proj_settings.prefix}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  ssh_keys   = [digitalocean_ssh_key.local_ssh_pkey.id]
  volume_ids = ["${element(digitalocean_volume.vol_5.*.id, count.index)}"]
  connection {
      user = "root"
      type = "ssh"
      private_key = file(var.local_ssh_private_key_path)
      timeout = "2m"
      host = self.ipv4_address
  }
  provisioner "remote-exec" {
    inline = [
          "usermod --password '${random_password.my_password[count.index].result}' root"
      ]
  }
}

locals {
  vps_ip = digitalocean_droplet.foobar[*].ipv4_address
}

data "aws_route53_zone" "zone" {
  name = "domain.ru"
}

resource "aws_route53_record" "record" {
  for_each = toset(local.vps_ip)
  zone_id = data.aws_route53_zone.zone.id
  name    = "${var.proj_settings.your_login}-${var.proj_settings.prefix}${index(local.vps_ip, each.value) + 1}"
  type    = "A"
  ttl     = "300"
  records = [each.value]
}

resource "local_file" "out" {
  filename = "${path.module}/out.txt"
  content = templatefile("${path.module}/data.tmpl",
    {
      passes  = random_password.my_password[*].result
      records = { 
        for dns, details in aws_route53_record.record:
        dns => ({"fqdn" = details.fqdn , "records" = details.records})
       }
    }
  )
}

output "records_out" {
  value = {
    for dns, details in aws_route53_record.record:
      dns => ({"fqdn" = details.fqdn, "records" = details.records})
  }
}

output "pass_out" {
  sensitive = true
  value = random_password.my_password[*].result
}

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект