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

ben*_*rtz 10 lxc

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

我正在查看带有 lxd 的本地开发设置可能是什么样子,但在配置新容器时却空手而归。

是否有任何惯用(或其他)方式来配置 lxd 容器?我应该看看像 docker 图像这样更不可变的东西吗?

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

stg*_*ber 16

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

lxc init ubuntu: CONTAINER
lxc config set CONTAINER user.user-data - < cloud-init-config.yml
lxc start CONTAINER
Run Code Online (Sandbox Code Playgroud)

或者更短:

lxc launch ubuntu: CONTAINER --config=user.user-data="$(cat cloud-init-config.yml)"
Run Code Online (Sandbox Code Playgroud)

或通过个人资料:

lxc profile create dev
lxc profile set dev user.user-data - < cloud-init-config.yml
lxc launch ubuntu: CONTAINER -p default -p dev
Run Code Online (Sandbox Code Playgroud)


Sam*_*mer 5

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

\n\n

我想要在 Ubuntu 16.04 上托管的 LXC/LXD Ubuntu 16.04 容器的静态网络设置。我开始尝试 St\xc3\xa9phane写的内容,但它不起作用。我最终得到的只是带有本地 IPv6 链接的默认 DHCP 尝试容器,因为我的配置中没有提供 DHCP 服务。

\n\n

我最初的 YAML 看起来类似于以下内容(取自cloud-init文档)。

\n\n
network:\n  version: 1\n  config:\n    - type: physical\n      name: eth0\n      subnets:\n        - type: static\n          address: 192.168.23.14/27\n          gateway: 192.168.23.1\n          dns_nameservers:\n            - 192.168.23.2\n            - 8.8.8.8\n          dns_search:\n            - exemplary.maas\n
Run Code Online (Sandbox Code Playgroud)\n\n

我将其加载到user.user-data如上所述。

\n\n
lxc config set CONTAINER user.user-data - < CONTAINER.cloud-init-config.yml\n
Run Code Online (Sandbox Code Playgroud)\n\n

直到我在LXC/LXD 源中找到 St\xc3\xa9phane\ 的文档,我才意识到需要将该值加载到user.network-config.

\n\n

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

\n\n
version: 1\nconfig:\n  - type: physical\n    name: eth0\n    subnets:\n      - type: static\n        address: 192.168.23.14/27\n        gateway: 192.168.23.1\n        dns_nameservers:\n          - 192.168.23.2\n          - 8.8.8.8\n        dns_search:\n          - exemplary.maas\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我把它加载进去user.network-config

\n\n
lxc config set CONTAINER user.network-config - < CONTAINER.network-config.yaml\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

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

\n\n
lxc config set CONTAINER user.user-data - < CONTAINER.user-data.yaml\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
write_files:\n  - content: |\n    # My new /etc/foo.bar file\n\n    Foo\n    Bar\n\n    path: /etc/foo.bar\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

"#cloud-config"以or开头"Content-Type: text/cloud-config"\n 该内容是“cloud-config”数据。请参阅示例以获取支持的配置格式的注释示例。

\n
\n\n

我认为这个文档不是很清楚。我无法使用“Content-Type: text/cloud-config”表单进行任何操作,但我确实发现如果您放在#cloud-config第一行,YAML 就会被解析。我只能假设有些事情不太正确,要么是我的理解,要么是某人的编程。对我来说,将您显式加载为键值的 YAMLuser.user-data用作云配置数据以外的任何内容是没有意义的。如果不是云配置,为什么有人会这样做,因此为什么需要注释(甚至不使用正常的 shebang 语法

\n\n

所以,撇开废话不谈,有效的语法user.user-data是:

\n\n
#cloud-config\n\nwrite_files:\n  - content: |\n      # My new /etc/foo.bar file\n\n      Foo\n      Bar\n\n    path: /etc/foo.bar\n
Run Code Online (Sandbox Code Playgroud)\n