
Я использую 2 модуля. Один — это пользовательский модуль VPC, а другой — модуль для запуска экземпляра Jenkins EC2.
Вы не можете использовать depends_on
модули with, но модуль Jenkins полагается на определенные выходные данные модуля VPC, например...
jenkins_elb_subnets_ids = ["${module.vpc.public_subnets_ids[0]}", "${module.vpc.public_subnets_ids[1]}"]
jenkins_instance_subnets_ids = ["${module.vpc.private_subnets_ids[0]}", "${module.vpc.private_subnets_ids[1]}"]
vpc_id = "${module.vpc.vpc_id}"
vpc_cidr = "${var.vpc_cidr}"
Это по-прежнему не мешает запуску экземпляра Jenkins EC2 еще до создания шлюзов NAT.
�[0m�[1mmodule.jenkins.aws_launch_configuration.jenkins_lc: Creation complete after 5s (ID: devops-jenkins-lc-20180309131935169800000002)�[0m�[0m
�[0m�[1mmodule.jenkins.aws_autoscaling_group.jenkins_asg: Creating...�[0m
arn: "" => "<computed>"
default_cooldown: "" => "<computed>"
desired_capacity: "" => "1"
force_delete: "" => "false"
health_check_grace_period: "" => "300"
health_check_type: "" => "EC2"
launch_configuration: "" => "devops-jenkins-lc-20180309131935169800000002"
load_balancers.#: "" => "1"
load_balancers.2235174564: "" => "devops-jenkins-elb"
max_size: "" => "1"
metrics_granularity: "" => "1Minute"
min_size: "" => "1"
name: "" => "devops-jenkins-lc-20180309131935169800000002"
protect_from_scale_in: "" => "false"
tags.#: "" => "4"
tags.0.%: "" => "3"
tags.0.key: "" => "Name"
tags.0.propagate_at_launch: "" => "1"
tags.0.value: "" => "devops-jenkins"
tags.1.%: "" => "3"
tags.1.key: "" => "BackupDisable"
tags.1.propagate_at_launch: "" => "1"
tags.1.value: "" => "No"
tags.2.%: "" => "3"
tags.2.key: "" => "Environment"
tags.2.propagate_at_launch: "" => "1"
tags.2.value: "" => "dev"
tags.3.%: "" => "3"
tags.3.key: "" => "AppComponent"
tags.3.propagate_at_launch: "" => "1"
tags.3.value: "" => "Jenkins-master"
target_group_arns.#: "" => "<computed>"
vpc_zone_identifier.#: "" => "2"
vpc_zone_identifier.3355635847: "" => "subnet-4f13e705"
vpc_zone_identifier.3554579391: "" => "subnet-8e92b2d3"
wait_for_capacity_timeout: "" => "0"�[0m
�[0m�[1mmodule.jenkins.aws_autoscaling_group.jenkins_asg: Creation complete after 1s (ID: devops-jenkins-lc-20180309131935169800000002)�[0m�[0m
�[0m�[1mmodule.vpc.aws_vpn_gateway.transit_vgw: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_route53_zone.main: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_nat_gateway.private_nat_gw.1: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_nat_gateway.private_nat_gw.0: Still creating... (10s elapsed)�[0m�[0m
В результате Дженкинс не может подняться должным образом.
Cannot find a valid baseurl for repo: amzn-main/latest
Could not retrieve mirrorlist http://repo.us-east-1.amazonaws.com/latest/main/mirror.list error was
12: Timeout on http://repo.us-east-1.amazonaws.com/latest/main/mirror.list: (28, 'Connection timed out after 5001 milliseconds')
Mar 09 13:19:55 cloud-init[2581]: util.py[WARNING]: Failed to install packages: ['git', 'aws-cfn-bootstrap', 'docker', 'jq-libs', 'jq', 'perl-Test-Simple.noarch', 'perl-YAML.noarch', 'gcc', 'amazon-ssm-agent.rpm', 'perl-Switch', 'perl-DateTime', 'perl-Sys-Syslog', 'perl-LWP-Protocol-https', 'perl-Test-Simple.noarch', 'perl-YAML.noarch']
Теперь у Terraform есть "официальный" модуль VPC от команды AWS. Я посмотрел его код, и, похоже, он ничего не делает для смягчения этого? Но с 90 тыс. развертываний и всего 36 проблемами... похоже, что это не их проблема. Я сам не тестировал его, потому что использовать его не вариант, но это может означать, что проблема в моих модулях.
Редактировать: Это не сработало @sysadmin1138 Я попробовал это...
resource "aws_autoscaling_group" "jenkins_asg" {
depends_on = ["module.vpc.aws_nat_gateway.private_nat_gw.1", "module.vpc.aws_nat_gateway.private_nat_gw.0"]
и получил эту ошибку
Initializing the backend...
Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Error: aws_autoscaling_group.jenkins_asg: resource depends on non-existent module 'vpc.aws_nat_gateway.private_nat_gw.1'
Error: aws_autoscaling_group.jenkins_asg: resource depends on non-existent module 'vpc.aws_nat_gateway.private_nat_gw.0'
Редактировать2:
Я попытался добавить вывод public_ip из шлюза NAT в модуле VPC в качестве ввода в модуль Jenkins. Надеясь, что это задержит модуль Jenkins до тех пор, пока шлюз NAT не будет запущен и готов. Это не сработало. Я заметил, что с Terraform и модулями, если вы не используете переменную где-то, например, в пользовательских данных Jenkins, то переменная полностью игнорируется. Недостаточно иметь ее в качестве ввода в модуль, она должна быть вводом в ресурс в этом модуле. Побочным эффектом является то, что как вычисляемое значение оно будет пытаться воссоздать ваш ресурс каждый раз.
решение1
Спасибо jbardinhttps://github.com/hashicorp/terraform/issues/14056
Чтобы исправить это, вам нужно использовать вывод из вашего модуля VPC. Вы можете использовать атрибут, aws_nat_gateway
но public_ip
поскольку у меня был создан маршрут после, aws_nat_gateway
я использовал его вместо этого. Затем я создал фиктивную переменную и фиктивный ресурс в моем модуле Jenkins.
resource "null_resource" "dummy" {
provisioner "local-exec" {
command = "echo ${var.dummy}"
}
}
Убедитесь, что вы назначили эту dummy
переменную выбранному вами выходу. Также она должна быть строкой.dummy = "${join(",", module.vpc.private_nat_gw_routes)}"
После этого я использовал его depends_on = ["null_resource.dummy"]
на своем ресурсе ASG. Это заставило этот ресурс ждать, пока не будут созданы шлюз NAT + маршруты, но не имеет неприятного побочного эффекта повторного создания ресурса каждый раз.
No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed
решение2
Вы не сможете использовать его depends_on
на модуле, но я почти уверен, что вы все равно сможете использовать его на фактическом ресурсе шлюза NAT, который создает модуль. В зависимости от вашей версии terraform, получить его может быть так же просто, как использовать terraform state list
и копаться в нем, или вручную искать его в вашем файле состояния terraform.
Однако, кажется,эта поддержка пока отсутствует в серии 11.x. Будущие версии Terraform могут, поскольку член команды HashiCorp предлагает способ предоставить то, что здесь явно необходимо.
Суть проблемы в том, что он depends_on
запускается на этапе компиляции до того, как модули будут развернуты в ресурсы, что делает их непригодными для таргетинга с помощью этого параметра.