生成cloud init yaml中的IP列表



我试图从一个yaml云init内生成一个ip列表,但不断失败。
这是我想做的

- path: /etc/hosts
owner: root:root
permissions: '0644'
defer: true
append: true
content: |
%{for i in range(10,19) ~}10.0.10.${i} compute-${i-9}%{endfor ~}

但是我得到错误:

调用未知函数;没有名为"range"的函数

我也试图传递一个字符串列表,并做

%{for str in ${iplst} ~} ${str} %{endfor ~}

但是这里我得到

Error: Incorrect attribute value type  
│  
│   on modules/nfsdbs/nfsdb.tf line 19, in data "template_file" "config":  
│   19:   vars = {  
│   20:     ...  
│   30:     iplst = "${var.ip_list}"  
│   31:     ...  
│   33:   }  
│     ├────────────────  
│     │ count.index is a number  
│     │ var.aws_access_key_id is a string  
│     │ var.aws_region is a string  
│     │ var.aws_secret_access_key is a string  
│     │ var.aws_session_token is a string  
│     │ var.hostname_prefix is a string  
│     │ var.ip_list is a list of string  
│     │ var.slurmdb_password is a string  
│     │ var.ssh_private_key is a string  
│     │ var.ssh_public_key is a string  
│     │ var.username is a string  
│  
│ Inappropriate value for attribute "vars": element "iplst": string required.  

根据问题中的要求,可以使用templatefile内置函数[1]来实现。模板化的文件应该如下所示:

- path: /etc/hosts
owner: root:root
permissions: '0644'
defer: true
append: true
content: |
%{for i in range(10,19) ~}
10.0.10.${i} ${format("compute-%d", i - 9)}
%{endfor ~}

然后,出于演示目的,使用local_file资源,plan的输出如下:

Terraform will perform the following actions:
# local_file.cloud_init will be created
+ resource "local_file" "cloud_init" {
+ content              = <<-EOT
- path: /etc/hosts
owner: root:root
permissions: '0644'
defer: true
append: true
content: |
10.0.10.10 compute-1
10.0.10.11 compute-2
10.0.10.12 compute-3
10.0.10.13 compute-4
10.0.10.14 compute-5
10.0.10.15 compute-6
10.0.10.16 compute-7
10.0.10.17 compute-8
10.0.10.18 compute-9
EOT
+ directory_permission = "0777"
+ file_permission      = "0777"
+ filename             = "./cloud.init.yml"
+ id                   = (known after apply)
}

最后,如果您想使用local_file资源,下面是产生上述输出的代码:

resource "local_file" "cloud_init" {
content  = templatefile("${path.root}/cloud.init.yml.tpl", {})
filename = "${path.module}/cloud.init.yml"
}

当然,由于问题没有显示您试图传递给template_file数据源的所有变量,因此上述对templatefile函数的调用可以在不添加任何变量的情况下工作,但是您必须对其进行调整以使用所有必要的变量。


[1] https://developer.hashicorp.com/terraform/language/functions/templatefile

相关内容

  • 没有找到相关文章

最新更新