如何将云配置传递给 LXD?

如何将云配置传递给 LXD?

我访问过无数网站,包括这个,试图弄清楚如何让 LXD 在启动 LXD 容器时运行云配置。有些地方建议设置配置文件(没有用)。其他一些地方建议将 YAML 文件重定向到 lxc 命令(没有用),还有一些地方建议使用该--config选项并以这种方式传递文件(没有用)。有些地方说我必须添加#cloud-config到我的配置中,有些地方则不费心。有些甚至建议使用 XML 文件。我显然遗漏了一些其他人默认会做的关键信息,但我不知道它是什么。

我更新的“简单示例”尝试安装树并尝试触摸/run/cloud-config-did-run:

lxc delete -f x

cat << EOF >config.yml
#cloud-config
output: {all: '| tee -a /var/log/my-cloud-init-output.log'}
package_update: true
package_upgrade: true
package_reboot_if_required: true
packages:
  - tree
runcmd:
  - touch /run/cloud-config-did-run
EOF

lxc launch ubuntu: x --config=user.user-data="$(cat config.yml)"
sleep 5
lxc exec x -- bash -c "ls /run"
lxc exec x -- bash -c "tree /etc"

输出确实被定向到/var/log/my-cloud-init-output.log,因此它正在被处理,但是除了指令之外没有其他任何output东西运行(日志甚至没有提到任何其他正在运行的东西,或者任何错误 - 只有标准 SSH 密钥生成器的东西)。

也许缩进是错误的?或者配置在错误的子树中?或者缺少一些魔法值?LXD 的某个版本出了问题?(我正在运行 4.20 版本)。到目前为止,我已经这样做了 10 个小时,无论我做什么,我的云配置都会被完全忽略(没有错误,没有日志,没有任何运行记录,没有任何我指示它做任何事情的记录 - 除了显然内置的标准 ssh keygen 内容)。有人可以将上述内容转换为一个工作示例,只要我将其粘贴到 shell 中,它就能保证运行吗?

答案1

关于 cloud-config 的可用(非)信息确实很麻烦。而且文档仍然很糟糕。但首先要说的是:
我完全按照你的代码尝试了,并且成功了(软件包升级 +/run/cloud-config-did-run工作正常)。测试了Ubuntu 20.0422.04

但我致力于LXD 5.1。因此这可能是重要的关键区别。


一些可能有用的评论:

  • 我配置了一个简单的输出来区分 init、config、final 阶段以及其中的标准日志和错误。这使得调试更容易。

    output:
      init: ["> /tmp/cloud-init.log", "> /tmp/cloud-init.err"]
      config: [ "> /tmp/cloud-init-config.log", "> /tmp/cloud-init-config.err" ]
      final: [ "> /tmp/cloud-init-final.log", "> /tmp/cloud-init-final.err" ]
    
  • 一旦我触发lxc launch命令
    ,我就会使用 切换到容器中lxc shell x
    使用cloud-init status --wait我会查看一切是否正常(“完成”)或失败。
    如果失败,/tmp/*.err这就是你的朋友

  • 到目前为止,我从未遇到过写入的问题/tmp。Cloud-init 在过去的某个地方更改了执行顺序。这可能已经解决了问题。

  • 无用的知识:package_update包括在package_upgrade

  • #cloud-config是必需的。我尝试过不使用它,但没有用。YAML 被完全忽略了

  • 有关云配置格式:它是 YAML(文件扩展名无关紧要)。我认为除了 MIME 多部分存档之外,没有其他任何东西可以适用于 LXD

  • MIME 多部分档案与 LXD 配合使用,这是重用不同配置代码的好方法。它易于使用,但文档似乎很简陋。下面是一个与 shell 脚本一起
    使用的小示例:config.yml

    cat << EOF >test.sh
    #!/usr/bin/env bash
    touch /run/here-we-go-with-a-shellscript
    EOF
    
    cloud-init devel make-mime -a config.yml:cloud-config -a test.sh:x-shellscript-per-once > newconfig
    lxc launch ubuntu:j f --config=user.user-data="$(cat /root/newconfig)"
    lxc shell f
    cloud-init status --wait
    ls /run
    

    使用 MIME 多部分档案的一个好的起点可能是这个cloudinit 文档页面

  • 我们测试时,带有云配置的 LXD 配置文件可以工作,但我们不使用它

我希望这能有所帮助。如果您感兴趣,我可以添加一个更大的 cloud-init yaml,我们测试了它在反向代理后面设置典型 Web 容器。

相关内容