有没有办法在配置时使用云配置来配置 lxd 容器?

有没有办法在配置时使用云配置来配置 lxd 容器?

具体来说,使用 CLI 工具,而不是 openstack。

我正在研究使用 lxd 的本地开发设置可能是什么样子,但是在配置新容器时却一无所获。

是否有任何惯用的(或其他)方法来配置 lxd 容器?我是否应该寻找一些更不可变的东西,例如 docker 镜像?

谢谢。任何资源或指示都将不胜感激。

答案1

因此,您可以通过多种方式执行此操作,或者直接针对容器:

lxc init ubuntu: CONTAINER
lxc config set CONTAINER user.user-data - < cloud-init-config.yml
lxc start CONTAINER

或者更短一点:

lxc launch ubuntu: CONTAINER --config=user.user-data="$(cat cloud-init-config.yml)"

或者通过个人资料:

lxc profile create dev
lxc profile set dev user.user-data - < cloud-init-config.yml
lxc launch ubuntu: CONTAINER -p default -p dev

答案2

我的问题比原帖者更具体一些,但我花了一段时间才弄清楚我做错了什么。我想在这里发布它,以帮助其他遇到类似问题的人。

我想要为 Ubuntu 16.04 上托管的 LXC/LXD Ubuntu 16.04 容器设置静态网络。我首先尝试了 Stéphane写道但它不起作用。我最终只得到了默认的 DHCP 尝试容器和本地 IPv6 链接,因为我的配置中没有提供 DHCP。

我最初的 YAML 看起来类似于以下内容(取自云初始化文档)。

network:
  version: 1
  config:
    - type: physical
      name: eth0
      subnets:
        - type: static
          address: 192.168.23.14/27
          gateway: 192.168.23.1
          dns_nameservers:
            - 192.168.23.2
            - 8.8.8.8
          dns_search:
            - exemplary.maas

我正在按照上面描述的方式加载它user.user-data

lxc config set CONTAINER user.user-data - < CONTAINER.cloud-init-config.yml

直到我找到 Stéphane 的文档LXC/LXD 源我意识到我需要将该值加载到user.network-config

所以我的最终 YAML 看起来像这样。

version: 1
config:
  - type: physical
    name: eth0
    subnets:
      - type: static
        address: 192.168.23.14/27
        gateway: 192.168.23.1
        dns_nameservers:
          - 192.168.23.2
          - 8.8.8.8
        dns_search:
          - exemplary.maas

然后我将其加载到user.network-config

lxc config set CONTAINER user.network-config - < CONTAINER.network-config.yaml

似乎我需要为每个容器保留两个不同的文件:一个用于加载网络设置user.network-config;另一个用于加载其他配置,user.user-data除非我能找到一种方法来使用一个文件来处理所有内容。


我发现的另一个对我来说并不明显的问题是尝试自动配置非网络组件。

lxc config set CONTAINER user.user-data - < CONTAINER.user-data.yaml

使用上述命令应用的以下 YAML(尽管使用起来看起来正确lxc config show CONTAINER)并未在我的容器内创建任何东西。

write_files:
  - content: |
    # My new /etc/foo.bar file

    Foo
    Bar

    path: /etc/foo.bar

线索隐藏在用户数据输入格式,第 5 项:云配置数据内容如下:

"#cloud-config"或开头"Content-Type: text/cloud-config" 此内容为“云配置”数据。请参阅示例,了解受支持的配置格式的注释示例。

我认为这份文档不够清晰。我无法使用“Content-Type: text/cloud-config”格式让任何东西工作,但我确实发现如果你#cloud-config在第一行输入,YAML 就会被解析。我只能假设有些事情不太对劲,要么是我的理解,要么是某人的编程。对我来说,你明确加载为键值的 YAMLuser.user-data应该用作云配置数据以外的任何东西,这是没有意义的。如果不是云配置,为什么有人会这样做,因此为什么注释(甚至不使用正常的 shebang 语法)会必需的

因此,抛开废话不说,有效的语法user.user-data是:

#cloud-config

write_files:
  - content: |
      # My new /etc/foo.bar file

      Foo
      Bar

    path: /etc/foo.bar

答案3

我今天使用的一个班轮,它将其设置为新容器的默认配置文件:

echo -e "#cloud-config\nssh_authorized_keys:\n - $(cat ~/.ssh/id_rsa.pub)" | lxc profile set default user.user-data -

这个将它设置在现有的容器中,但要注意它不适用于已经启动的容器,因为 SSH 密钥的东西只能在第一次启动时完成:

echo -e "#cloud-config\nssh_authorized_keys:\n - $(cat ~/.ssh/id_rsa.pub)" | lxc config set CONTAINER_NAME user.user-data -

相关内容