te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>powershell - Terraform pass generated value as variable to User_Data - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

powershell - Terraform pass generated value as variable to User_Data - Stack Overflow

programmeradmin4浏览0评论

When deploying a Windows EC2 instance with Terraform, I want to create a user using the User_Data template. I am also passing a random_password variable to the template. In the main.tf I have:

resource "random_password" "password" {
  length           = 16
  special          = true
}

resource "aws_instance" "webserver" {
  ami                         = data.aws_ami.WindowsServer2025.image_id
  instance_type               = "t3.micro"
  key_name                    = "deployer"
  subnet_id                   = aws_subnet.public_sn1.id
  associate_public_ip_address = true
  security_groups             = [aws_security_group.web_server_sg.id]
  user_data                   = templatefile("New_User.tftpl", { MYPASSWORD = random_password.password.result })

}

For my New_User.tftpl I have:

<powershell>
New-LocalUser -Name User123 -Password  (${MYPASSWORD} | ConvertTo-SecureString -AsPlainText -Force)
Add-LocalGroupMember -Group "Administrators" -Member "User123"
</powershell>

... the account is not created. Any idea where it might have gone wrong? thank you.

Solved:

Stupid, just missing quotes:

New-LocalUser -Name User123 -Password  ("${MYPASSWORD}" | ConvertTo-SecureString -AsPlainText -Force)

When deploying a Windows EC2 instance with Terraform, I want to create a user using the User_Data template. I am also passing a random_password variable to the template. In the main.tf I have:

resource "random_password" "password" {
  length           = 16
  special          = true
}

resource "aws_instance" "webserver" {
  ami                         = data.aws_ami.WindowsServer2025.image_id
  instance_type               = "t3.micro"
  key_name                    = "deployer"
  subnet_id                   = aws_subnet.public_sn1.id
  associate_public_ip_address = true
  security_groups             = [aws_security_group.web_server_sg.id]
  user_data                   = templatefile("New_User.tftpl", { MYPASSWORD = random_password.password.result })

}

For my New_User.tftpl I have:

<powershell>
New-LocalUser -Name User123 -Password  (${MYPASSWORD} | ConvertTo-SecureString -AsPlainText -Force)
Add-LocalGroupMember -Group "Administrators" -Member "User123"
</powershell>

... the account is not created. Any idea where it might have gone wrong? thank you.

Solved:

Stupid, just missing quotes:

New-LocalUser -Name User123 -Password  ("${MYPASSWORD}" | ConvertTo-SecureString -AsPlainText -Force)
Share Improve this question edited 2 days ago mklement0 439k68 gold badges701 silver badges912 bronze badges asked Feb 17 at 22:10 kfkenshinkfkenshin 293 bronze badges 2
  • You should not put any sensitive data in user data like passwords. The user data is not encrypted and will be readable inside and outside the ec2 instance. – Chris Doyle Commented Feb 18 at 7:20
  • Glad you found a solution, but, in general, it's better to post it in the form of an answer post (which you can later self-accept in order to readily signal to future readers that you've found an effective solution). In the case at hand, I'm hoping my answer will do. – mklement0 Commented 2 days ago
Add a comment  | 

1 Answer 1

Reset to default 0

You've found a solution yourself, but let me add an explanation, point out pitfalls, and offer an alternative:


When you use interpolation in a Terraform string template (such as ${MYPASSWORD} in your case), the referenced value is (a) stringified, if necessary, and (b) embedded as-is in the string.

Therefore, in order to make your PowerShell command see the value of ${MYPASSWORD} as a string literal, you must quote it to satisfy PowerShell's syntax requirements:

  • While using "...", i.e. an expandable (interpolating) string, is an option, note that it makes the Terraform-interpolated value subject to another round of interpolation by PowerShell, so that, say, a verbatim password value such as &#$foo! would cause PowerShell to expand variable reference $foo, resulting in undesired modification of the value.

  • Using '...', i.e. a verbatim string, avoids this problem.

With either quoting style, using a regular, inline PowerShell string literal, you must ensure that the Terraform-interpolated value doesn't itself contain the specific quoting characters being used (" or ').

If you cannot ensure that, use a here-string literal instead (@'<newline>...<newline>'@ for the verbatim form):

<powershell>
New-LocalUser -Name User123 -Password (
@'
${MYPASSWORD}
'@ | ConvertTo-SecureString -AsPlainText -Force)
Add-LocalGroupMember -Group "Administrators" -Member "User123"
</powershell>

Note that the closing delimiter of a here-string, '@ in the case of a verbatim here-string, must be at the very start of the line in order to be recognized as such.

发布评论

评论列表(0)

  1. 暂无评论