টেরফর্ম - গণনা সহ নেস্টেড লুপগুলি ব্যবহার করুন


19

আমি টেরেফর্মে নেস্টেড লুপটি ব্যবহার করার চেষ্টা করছি। আমার দুটি তালিকার ভেরিয়েবল রয়েছে list_of_allowed_accountsএবং list_of_imagesএবং তালিকাটির উপরে পুনরাবৃত্তি করতে হবে list_of_imagesএবং তারপরে তালিকার উপরে পুনরাবৃত্তি হবে list_of_allowed_accounts

এখানে আমার পোড়ামাটির কোড।

variable "list_of_allowed_accounts" {
  type    = "list"
  default = ["111111111", "2222222"]
}

variable "list_of_images" {
  type    = "list"
  default = ["alpine", "java", "jenkins"]
}

data "template_file" "ecr_policy_allowed_accounts" {
  template = "${file("${path.module}/ecr_policy.tpl")}"

  vars {
    count = "${length(var.list_of_allowed_accounts)}"
    account_id = "${element(var.list_of_allowed_accounts, count.index)}"
  }
}

resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
  count = "${length(var.list_of_images)}"
  repository = "${element(aws_ecr_repository.images.*.id, count.index)}"
  count = "${length(var.list_of_allowed_accounts)}"
  policy = "${data.template_file.ecr_policy_allowed_accounts.rendered}"
}

এটি আমি যা করার চেষ্টা করছি তার একটি বাশ সমতুল্য।

for image in alpine java jenkins
do 
  for account_id in 111111111 2222222
  do 
    // call template here using variable 'account_id' and 'image'
  done
done

উত্তর:


34

এই ধরণের নেস্টেড পুনরাবৃত্তির জন্য টেরাফর্মের সরাসরি সমর্থন নেই তবে আমরা কয়েকটি গাণিতিক দিয়ে এটি জাল করতে পারি।

variable "list_of_allowed_accounts" {
  type = "list"
  default = ["1111", "2222"]
}

variable "list_of_images" {
  type = "list"
  default = ["alpine", "java", "jenkins"]
}

data "template_file" "ecr_policy_allowed_accounts" {
  count = "${length(var.list_of_allowed_accounts) * length(var.list_of_images)}"

  template = "${file("${path.module}/ecr_policy.tpl")}"

  vars {
    account_id = "${var.list_of_allowed_accounts[count.index / length(var.list_of_images)]}"
    image      = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  }
}

resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
  count = "${data.template_file.ecr_policy_allowed_accounts.count}"

  repository = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  policy = "${data.template_file.ecr_policy_allowed_accounts.*.rendered[count.index]}"
}

যেহেতু আমরা অ্যাকাউন্ট এবং চিত্রের প্রতিটি সংমিশ্রনের জন্য একটি নীতি টেম্পলেট তৈরি করতে চাই, countতাই template_fileডেটা ব্লকের অন হ'ল দুটি মিলিয়ে। তারপরে আমরা count.indexপ্রতিটি তালিকার পৃথক সূচকগুলিতে ফিরে পেতে বিভাগ এবং মডুলো ক্রিয়াকলাপগুলি ব্যবহার করতে পারি ।

আপনার নীতি টেমপ্লেটের একটি অনুলিপি না থাকায় আমি কেবল একটি স্থানধারক ব্যবহার করেছি; এই কনফিগারেশন এইভাবে নিম্নলিখিত পরিকল্পনা দিয়েছে:

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.0
    policy:     "policy allowing 1111 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.1
    policy:     "policy allowing 1111 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.2
    policy:     "policy allowing 1111 to access jenkins"
    repository: "jenkins"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.3
    policy:     "policy allowing 2222 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.4
    policy:     "policy allowing 2222 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.5
    policy:     "policy allowing 2222 to access jenkins"
    repository: "jenkins"

প্রতিটি নীতিমালা উদাহরণ সমস্ত অ্যাকাউন্টের আইডি এবং চিত্রের আলাদা জুড়ে প্রযোজ্য।


2
আপনি যদি কনফিগারেশনটি প্রসারিত করতে চান, যেমন কোনও নতুন অ্যাকাউন্ট বা / এবং একটি চিত্র যুক্ত করতে চান তবে আপনার সংস্থানগুলি বিভিন্ন সূচকে মানচিত্র দেবে, তবে মুছে ফেলা এবং পুনরায় তৈরি করা যদি সমস্যা না হয় তবে এটি ঠিক আছে।
বালাজস

1
@ জাস্টিন-গ্রোটের তার উত্তরে একটি বক্তব্য রয়েছে: টেরাপেরফর্ম ০.০২ তে আপনার যে কোনও জায়গায় বিভাজন করার সময় মেঝে ফাংশনটি ব্যবহার করতে হবে, না হলে আপনি আংশিক সূচকগুলি সম্পর্কে একটি ত্রুটি পাবেন। account_id = var.list_of_allowed_accounts[floor(count.index / length(var.list_of_images))]
chriscatfr

7

এখানে উত্তরগুলি কাজ করে (আমি প্রাথমিকভাবে সেগুলি ব্যবহার করেছিলাম) তবে আমার মনে হয় টেরাফর্মের সেটপ্রডাক্ট ফাংশনটি ব্যবহার করে আমার আরও ভাল সমাধান রয়েছে । আমি ইন্টারভিউজ এর আশেপাশে ব্যবহৃত এর অনেকগুলি উদাহরণ দেখিনি, তবে সেট প্রোডাক্ট দুটি সেট নেয় (বা আরও গুরুত্বপূর্ণভাবে দুটি তালিকা) এবং ইনপুটগুলির প্রতিটি ক্রমবর্ধনের সাথে সেটগুলির একটি তালিকা তৈরি করে। আমার ক্ষেত্রে আমি এসএসএম প্যারামিটার তৈরি করছি:

variable "list1" {
  type    = "list"
  default = ["outer1", "outer2"]
}

variable "list2" {
  type    = "list"
  default = ["inner1", "inner2", "inner3"]
}

locals {
  product = "${setproduct(var.list1, var.list2)}"
}

resource "aws_ssm_parameter" "params" {
  count     = "${length(var.list1) * length(var.list2)}"
  name      = "/${element(local.product, count.index)[0]}/${element(local.product, count.index)[1]}"
  type      = "String"
  value     = "somevalue"
  overwrite = false
  lifecycle { ignore_changes = ["value"] }
}

এটি নামের এসএসএম প্যারামিটার তৈরি করে:

/outer1/inner1
/outer1/inner2
/outer1/inner3
/outer2/inner1
/outer2/inner2
/outer2/inner3

আমার উইম্পি সামান্য মস্তিষ্ক অন্যান্য উত্তরগুলির মধ্যে মডুলো যাদুটির তুলনায় এটি আরও সহজ করে পার্স করতে পারে!


আমি আপনার সমাধান চেষ্টা করব। আমি এটা অনেক ভাল বলে মনে করি। তবে আপনি কেন গণনার ${length(var.list1) * length(var.list2)}পরিবর্তে ব্যবহার করবেন ${length(local.product)}?
chriscatfr

আমি পর্যন্ত আমার গ্রাহক v0.12 :( আশ্চর্যের কিছু নেই ব্যবহার কেন আপনি অনেক উৎস খুঁজে পাইনি শুরু অপেক্ষা করতে হবে।
chriscatfr

কোনও কারণ নেই, ${length(local.product)}সম্ভবত আরও বেশি করে তোলে। এছাড়াও, আমি মোটামুটিভাবে নিশ্চিত হয়েছি যে setproduct()প্রাক-০.১২-এর পূর্ববর্তী উপস্থিতি (লিঙ্কযুক্ত পৃষ্ঠার শীর্ষে থাকা বার্তাটি তাদের 0.11 ডক্সের জন্য কেবল একটি সাধারণ সতর্কতা, আমি মনে করি?)
কাইল

4

এফওয়াইআই যদি কেউ গুগল থেকে এখানে আসে, আপনি যদি টেরেমফর্ম ০.০২ ব্যবহার করে থাকেন তবে আপনার যে কোনও জায়গায় বিভাজন করার সময় আপনার মেঝে ফাংশনটি ব্যবহার করতে হবে, না হলে আপনি আংশিক সূচকগুলি সম্পর্কে একটি ত্রুটি পাবেন।

অ্যাকাউন্ট_আইডি = ভেরি.লিস্ট_এফ_নিলয়েড_এক অ্যাকাউন্টস [ ফ্লোর (কাউন্ট.ইন্ডেক্স / দৈর্ঘ্য (var.list_of_images))]]


আমি গণিতের পদ্ধতির চেষ্টা করার আগে এই রত্নটি আবিষ্কার করার জন্য SO পৃষ্ঠায় নীচে পড়তে চাই। এভাবেই আমি মেঝেতে কাজ করতে পেরেছি (count.index / 8)। পোস্ট করার জন্য ধন্যবাদ।
বাইটজেঙ্কি

@ কাইলের সমাধান থেকে 0.12 সেট প্রোডাক্ট () সহ সহজ মনে হচ্ছে।
chriscatfr

আপনি Terraform 0.12 করছেন, তাহলে তাহলে কেন নতুন যোগ ব্যবহার করবেন for, for_eachএবং / অথবা গতিশীল নেস্টেড ব্লক ভাষা নির্মান বিভ্রান্তিকর কিছু বাস্তবায়ন করতে একটু কম?
ট্রিনিট্রনএক্স

0

মূলত সমস্যাটি "টেমপ্লেট_ফাইলে" ডেটাতে থাকে, আপনার অ্যাকাউন্টের গণনাটি যেভাবে মনে হয় সেট করে সেট করা যায় না যেহেতু আপনার ক্ষেত্রে গণনাটি কেবলমাত্র অন্যরকম যা কখনই বৃদ্ধি / পরিবর্তন হয় না। আপনার প্রশ্নটি ঠিক কী তা দেখতে আমি মিস করছি তাই কেবল বলছি।


0

@ মার্টিন অ্যাটকিনস প্রদত্ত উত্তরে আমার মন্তব্য যুক্ত করার মতো পর্যাপ্ত খ্যাতি পয়েন্ট নেই , তাই আমি তার উত্তরটি সামান্য সংশোধন করে পোস্ট করছি, যা টেরফর্ম ইস্যু 20567 এর আশেপাশে কাজ করে

variable "list_of_allowed_accounts" {
  type = "list"
  default = ["1111", "2222"]
}

variable "list_of_images" {
  type = "list"
  default = ["alpine", "java", "jenkins"]
}

# workaround for TF issue https://github.com/hashicorp/terraform/issues/20567
locals {
  policy_count = "${length(var.list_of_allowed_accounts) * length(var.list_of_images)}"
}

data "template_file" "ecr_policy_allowed_accounts" {
  count = "${local.policy_count}"

  template = "${file("${path.module}/ecr_policy.tpl")}"

  vars {
    account_id = "${var.list_of_allowed_accounts[count.index / length(var.list_of_images)]}"
    image      = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  }
}

resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
  count = "${local.policy_count}"

  repository = "${var.list_of_images[count.index % length(var.list_of_images)]}"
  policy = "${data.template_file.ecr_policy_allowed_accounts.*.rendered[count.index]}"
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.