2016-09-27 11 views
2

Если Terraform скрипт использует модуль, который имеет выходы, можно получить доступ к этим выходам модуля при помощи опции -module для terraform output команды:Возможно ли получить доступ к состоянию модуля в файле удаленного состояния терракота?

$ terraform output --help 
Usage: terraform output [options] [NAME] 

    Reads an output variable from a Terraform state file and prints 
    the value. If NAME is not specified, all outputs are printed. 

Options: 

    -state=path  Path to the state file to read. Defaults to 
        "terraform.tfstate". 

    -no-color  If specified, output won't contain any color. 

    -module=name  If specified, returns the outputs for a 
        specific module 

    -json   If specified, machine readable output will be 
        printed in JSON format 

Если хранить этот файл состояние в S3 или некоторые таком, я может затем ссылаться на выходные данные основного сценария с помощью поставщика данных terraform_remote_state.

data "terraform_remote_state" "base_networking" { 
    backend = "s3" 
    config { 
    bucket = "${var.remote_state_bucket}" 
    region = "${var.remote_state_region}" 
    key = "${var.networking_remote_state_key}" 
    } 
} 

resource "aws_instance" "my_instance" { 
    subnets = "${data.terraform_remote_state.base_networking.vpc_id}" 
} 

Возможно ли получить доступ к выходу модуля, который также присутствует в файле состояния? Я ищу что-то вроде "${data.terraform_remote_state.base_networking.module.<module_name>.<output>}" или тому подобное.

+0

Я не уверен, я понимаю, что вы просите здесь. Можете ли вы представить пример файла Terraform, который будет создавать нужный результат и как вы хотите его использовать? Похоже, вы просто хотите получить доступ к выходам модулей из файла состояния TF, но ваш вопрос уже объясняет, как добраться до них, поэтому я думаю, что я что-то не понимаю. – ydaetskcoR

+0

В частности, у меня есть несколько сценариев terraform, где один является «базой», которая применяется перед всем остальным. Другие ссылаются на состояние, которое оно производит. Внутри этого базового сценария я использую модули модулей, и у них есть выходы, на которые ссылаются в главном скрипте. Я хотел бы получить доступ к выводам этих модулей в последующих зависимых сценариях. – dustyburwell

+0

Ответ [здесь] (http://stackoverflow.com/a/39785310/77040) показывает, насколько я настроен. Я просто хотел бы добиться этого без дополнительного шаблона. – dustyburwell

ответ

4

Да, вы можете получить доступ к выходу удаленного состояния из ваших собственных модулей. Вам просто нужно «размножать» выходы.

Например, предположим, что у вас есть что-то вроде этого, ваша base_networking инфраструктуры, которая содержит модуль для создания вашего VPC, и вы хотите, чтобы VPC ID быть доступным через удаленное состояние:

base_networking/ 
    main.tf 
    outputs.tf 
    vpc/ 
    main.tf 
    outputs.tf 

В base_networking/main.tf вы создать VPC с помощью base_networking/vpc модуля:

module "vpc" { 
    source = "./vpc" 
    region = "${var.region}" 
    name = "${var.vpc_name}" 
    cidr = "${var.vpc_cidr}" 
} 

в base_networking/vpc/outputs.tf в модуле у вас есть id выход:

output "id" { 
    value = "${aws_vpc.vpc.id}" 
} 

В base_networking/outputs.tf вы также vpc_id модуль, который распространяется module.vpc.id:

output "vpc_id" { 
    value = "${module.vpc.id}" 

С, что теперь вы можете получить доступ к vpc_id используя что-то вроде:

data "terraform_remote_state" "base_networking" { 
    backend = "s3" 
    config { 
    bucket = "${var.remote_state_bucket}" 
    region = "${var.remote_state_region}" 
    key = "${var.networking_remote_state_key}" 
    } 
} 

[...] 

vpc_id = "${data.terraform_remote_state.base_networking.vpc_id}" 
+0

Да, я знаю, что вы можете настроить выходы, которые ссылаются на выходные данные модуля. Я надеюсь, что есть какой-то способ не добавить дополнительный дополнительный шаблон. Я хотел бы иметь возможность ссылаться на выходы модуля специально через 'remote_state' так же, как вы можете, используя командную строку. Единственное, что указывало мне на мысль, что это возможно, это то, что вы можете сделать это в CLI. – dustyburwell

+0

Очень хорошо, что это единственный способ добиться этого. И, если так, то :(, но понятно. – dustyburwell