Size: a a a

2020 February 26

i

inqfen in terraform_ru
Ivan
А кто нибудь упаковывал деплой терраформом в CI?

Как правильно после деплоя инфраструктуры сохранить куда то tfstate для дальнейшего использования? Я собрал его как артефакт, а как сохранить его в репозиторий не понимаю
Бэкенд в с3 или ещё где
источник

A

Andor in terraform_ru
https://gist.github.com/Andor/01b3c211e68a1892947acb09237582bf
я вот так примерно запускаю терраформ в гитлабе
источник
2020 February 27

N

Nikolai in terraform_ru
привет всем хочу вытянуть дату
data "external" "rancher_api_key" {
 program = ["/bin/bash", "-xe", "${path.module}/scripts/get_token.sh.tpl"]
 query = {
   rancher_master_host = openstack_compute_instance_v2.rancher_master[0].access_ip_v4,
   init_pass = local.init_pass,
   new_pass = local.new_pass,
 }
}


get_token.sh.tpl:

function parse_input() {
 eval "$(jq -r '@sh "export HOST=\(.rancher_master_host)"')"
 eval "$(jq -r '@sh "export INIT_PASS=\(.init_pass)"')"
 eval "$(jq -r '@sh "export NEW_PASS=\(.new_pass)"')"
#  eval "$(jq -r '@sh "export HOST=\(.rancher_master_host) && export INIT_PASS=\(.init_pass) && export NEW_PASS=\(.new_pass)"')"
}
function return_token() {
...
 jq -n --arg apikey $APIKEY '{"apikey":$apikey}'
}

parse_input && \
sleep 2 && \
return_token


на выходе получаю ошибку
Error: failed to execute "/bin/bash": + parse_input
++ jq -r '@sh "export HOST=\(.rancher_master_host)"'
+ eval 'export HOST='\''172.27.104.14'\'''
++ export HOST=172.27.104.14
++ HOST=172.27.104.14
++ jq -r '@sh "export INIT_PASS=\(.init_pass)"'
+ eval ''
++ jq -r '@sh "export NEW_PASS=\(.new_pass)"'
+ eval ''
+ sleep 2
+ return_token
...


почему так выходит, что он первый параметр HOST парсит, а последующие нет ?
источник

N

Nikolai in terraform_ru
что я делаю не так ?
источник

A

Andor in terraform_ru
это тебе в чят про баш надо
источник

N

Nikolai in terraform_ru
:(
источник

IM

Iurii Medvedev in terraform_ru
Ivan
А кто нибудь упаковывал деплой терраформом в CI?

Как правильно после деплоя инфраструктуры сохранить куда то tfstate для дальнейшего использования? Я собрал его как артефакт, а как сохранить его в репозиторий не понимаю
Бекенд заюзать
источник

s

stempher in terraform_ru
Подскажите плиз, если встраивать деплой терраформом в ci, то получается для каждого сервиса/приложения надо хранить отдельный стейт? Как это лучше организовать - не хотелось делать 100500 бакетов для каждого приложения
источник

YA

Yury Alexandrov in terraform_ru
можно в одном бакете хранить
источник

YA

Yury Alexandrov in terraform_ru
terraform {
 backend "s3" {
   bucket = "mybucket"
   key    = "path/to/my/key"
   region = "us-east-1"
 }
}
источник

YA

Yury Alexandrov in terraform_ru
key меняете и все
источник

s

stempher in terraform_ru
Yury Alexandrov
key меняете и все
Спасибо, попробую
источник

KT

Kirill Temnov in terraform_ru
Привет коллеги!
Подскажете пожалуйста как подружить базу с приложением на Amazon?

Поднимаю модули:

module "vpc" {
 source  = "terraform-aws-modules/vpc/aws"
 version = "~> v2.0"

 name = "my-${terraform.workspace}-vpc"
 cidr = var.vpc_cidr

 private_subnets = var.vpc_private_subnets # ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
 public_subnets  = var.vpc_public_subnets  # ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

 enable_nat_gateway = true
 enable_vpn_gateway = true

 ...
}


module "database" {
 source  = "terraform-aws-modules/rds/aws"
 version = "~> 2.0"

 engine            = "postgres"

 # DB subnet group
 subnet_ids = module.vpc.private_subnets
 ...
}


data "aws_eks_cluster" "cluster" {
 name = module.my-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
 name = module.my-cluster.cluster_id
}

provider "kubernetes" {
 host                   = data.aws_eks_cluster.cluster.endpoint
 cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
 token                  = data.aws_eks_cluster_auth.cluster.token
 load_config_file       = false
}

module "my-cluster" {
 source          = "terraform-aws-modules/eks/aws"
 cluster_name    = "my-cluster-${terraform.workspace}"
 cluster_version = "1.14"
 subnets         = module.vpc.private_subnets
 vpc_id          = module.vpc.vpc_id

 worker_groups = [
   {
     instance_type = var.worker_instance_type
     asg_max_size  = var.max_workers
   }
 ]

 tags = {
   Environment = terraform.workspace
 }

}


В кластере поднимаю приложение в  pod и он не видит базу.
Стучусь по адресу module.database.this_db_instance_address - ответа нет никакого, просто висит.
источник

PS

Paul Shevtsov in terraform_ru
Простой вопрос: есть задача на первом сервере из списка подставлять одну SG а на всех остальных - другую. Как это правильно сделать? Пробую конструкцию вида -                                                                                                                                vpc_security_group_ids = count > 0 ? [aws_security_group.sg1.id] : [aws_security_group.sg2.id                                                                                   - не проходит.
источник

A

Andor in terraform_ru
что значит "не проходит"?
источник

PS

Paul Shevtsov in terraform_ru
Andor
что значит "не проходит"?
Нашел ошибку - надо писать так -                                                                                                                                                          vpc_security_group_ids = [ count.index > 0 ? aws_security_group.sg1.id : aws_security_group.sg2.id ]
источник

A

Andor in terraform_ru
может удобнее сделать два разных ресурса?
источник

PS

Paul Shevtsov in terraform_ru
Andor
может удобнее сделать два разных ресурса?
Да захотелось так извратиться. :)  Хотя наверно зерно истины в ваших словах есть.
источник

KT

Kirill Temnov in terraform_ru
Kirill Temnov
Привет коллеги!
Подскажете пожалуйста как подружить базу с приложением на Amazon?

Поднимаю модули:

module "vpc" {
 source  = "terraform-aws-modules/vpc/aws"
 version = "~> v2.0"

 name = "my-${terraform.workspace}-vpc"
 cidr = var.vpc_cidr

 private_subnets = var.vpc_private_subnets # ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
 public_subnets  = var.vpc_public_subnets  # ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

 enable_nat_gateway = true
 enable_vpn_gateway = true

 ...
}


module "database" {
 source  = "terraform-aws-modules/rds/aws"
 version = "~> 2.0"

 engine            = "postgres"

 # DB subnet group
 subnet_ids = module.vpc.private_subnets
 ...
}


data "aws_eks_cluster" "cluster" {
 name = module.my-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
 name = module.my-cluster.cluster_id
}

provider "kubernetes" {
 host                   = data.aws_eks_cluster.cluster.endpoint
 cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
 token                  = data.aws_eks_cluster_auth.cluster.token
 load_config_file       = false
}

module "my-cluster" {
 source          = "terraform-aws-modules/eks/aws"
 cluster_name    = "my-cluster-${terraform.workspace}"
 cluster_version = "1.14"
 subnets         = module.vpc.private_subnets
 vpc_id          = module.vpc.vpc_id

 worker_groups = [
   {
     instance_type = var.worker_instance_type
     asg_max_size  = var.max_workers
   }
 ]

 tags = {
   Environment = terraform.workspace
 }

}


В кластере поднимаю приложение в  pod и он не видит базу.
Стучусь по адресу module.database.this_db_instance_address - ответа нет никакого, просто висит.
Нужно отдельно создать Security Group, прописать туда порты и приаттачить к базе и кластеру.
источник

IV

Igor Varauka in terraform_ru
Привет! Перестал загружаться бэкенд Meta.Backend: backend *gcs.Backend does not support operations, so wrapping it in a local backend.
Полный лог
Initializing the backend...
2020/02/27 13:57:06 [TRACE] Meta.Backend: built configuration for "gcs" backend with hash value 2562856246
2020/02/27 13:57:06 [TRACE] Preserving existing state lineage "d1d4beea-5752-3659-7bd9-629cc90067d9"
2020/02/27 13:57:06 [TRACE] Preserving existing state lineage "d1d4beea-5752-3659-7bd9-629cc90067d9"
2020/02/27 13:57:06 [INFO] state modified during read or write. incrementing serial number
2020/02/27 13:57:06 [TRACE] Meta.Backend: working directory was previously initialized for "gcs" backend
2020/02/27 13:57:06 [TRACE] Meta.Backend: using already-initialized, unchanged "gcs" backend configuration
2020/02/27 13:57:07 [TRACE] Meta.Backend: instantiated backend of type *gcs.Backend
2020/02/27 13:57:07 [DEBUG] checking for provider in "."
2020/02/27 13:57:07 [DEBUG] checking for provider in "/usr/local/Cellar/tfenv/1.0.2/versions/0.12.20"
2020/02/27 13:57:07 [DEBUG] checking for provider in ".terraform/plugins/darwin_amd64"
2020/02/27 13:57:07 [DEBUG] found provider "terraform-provider-google-beta_v3.9.0_x5"
2020/02/27 13:57:07 [DEBUG] found provider "terraform-provider-google_v3.9.0_x5"
2020/02/27 13:57:07 [DEBUG] checking for provider in "/Users/.terraform.d/plugins"
2020/02/27 13:57:07 [DEBUG] checking for provider in "/Users/.terraform.d/plugins/darwin_amd64"
2020/02/27 13:57:07 [DEBUG] found valid plugin: "google-beta", "3.9.0", "/Users/tf/staging/.terraform/plugins/darwin_amd64/terraform-provider-google-beta_v3.9.0_x5"
2020/02/27 13:57:07 [DEBUG] found valid plugin: "google", "3.9.0", "/Users/tf/staging/.terraform/plugins/darwin_amd64/terraform-provider-google_v3.9.0_x5"
2020/02/27 13:57:07 [DEBUG] checking for provisioner in "."
2020/02/27 13:57:07 [DEBUG] checking for provisioner in "/usr/local/Cellar/tfenv/1.0.2/versions/0.12.20"
2020/02/27 13:57:07 [DEBUG] checking for provisioner in ".terraform/plugins/darwin_amd64"
2020/02/27 13:57:07 [DEBUG] checking for provisioner in "/Users/.terraform.d/plugins"
2020/02/27 13:57:07 [DEBUG] checking for provisioner in "/Users/.terraform.d/plugins/darwin_amd64"
2020/02/27 13:57:07 [TRACE] Meta.Backend: backend *gcs.Backend does not support operations, so wrapping it in a local backend
источник