如何在 Autoinstall / Cloud-Init 中运行复杂的管道命令?

如何在 Autoinstall / Cloud-Init 中运行复杂的管道命令?

在 cloud-init user-data runcmd 或 autoinstall late-commands 中,我都需要将此命令作为 LUKS 加密卷的 Clevis + Tang 初始化的一部分来运行:

echo '<secret>' | clevis luks bind -d /dev/sda2 tang '{"url": "http://<ip-tangserver>" , "adv": "/tmp/adv.jws" }'

问题是,我很难确定使用 runcmd 或 late-commands 是否真的可以实现这一点,如果可以,我如何以符合 YAML 的方式执行此操作,例如:

runcmd:
  - echo 'some-luks-temp-passwd' | clevis luks bind -d /dev/vda3 tang '{"url": "http://192.168.122.150" , "adv": "/tmp/adv.jws" }'

上面括住整个字符串似乎也不起作用,yamllint 仍然显示语法错误:

runcmd:
  - "echo 'some-luks-temp-passwd' | clevis luks bind -d /dev/vda3 tang '{"url": "http://192.168.122.150" , "adv": "/tmp/adv.jws" }'"

谢谢!

答案1

您可以使用YAML 多行语法。我不确定您当前的语法有什么问题,但这里有一个autoinstall使用 json、管道、输出重定向和 Heredoc 的多行语法代码片段。

#cloud-config
runcmd:
  - |
    echo '{"foo":"FOO" , "bar" : "BAR"}' > /run/cmd.log
    cat <<EOF | xxd >> /run/cmd.log
    {
      "foo": "FOO",
      "bar": "BAR"
    }
    EOF

FWIW,这是结果/run/cmd.log文件

root@ubuntu-server:/# cat /run/cmd.log
{"foo":"FOO" , "bar" : "BAR"}
00000000: 7b0a 2020 2266 6f6f 223a 2022 464f 4f22  {.  "foo": "FOO"
00000010: 2c0a 2020 2262 6172 223a 2022 4241 5222  ,.  "bar": "BAR"
00000020: 0a7d 0a                                  .}.

相关内容