我的 cloud-init 中有一个非常简单的 stansa,
write_files:
- path: /home/ecarroll/.zshrc
content: |
source ~/powerlevel10k/powerlevel10k.zsh-theme
owner: ecarroll:ecarroll
permissions: '0644'
defer: true
该defer
标志记录在Cloud Init: Write Flags文档中,
defer: (boolean) 推迟写入文件直到“最终”阶段,在创建用户和安装包之后。默认值:
False
.
但是当我如上所述使用它时,我得到
schema.py[WARNING]: Invalid config: write_files.0: Additional properties are not allowed ('defer' was unexpected)
util.py[DEBUG]: Writing to /home/ecarroll/.zshrc - wb: [644] 47 bytes
handlers.py[DEBUG]: finish: init-network/config-write-files: FAIL: running config-write-files with frequency once-per-instance
util.py[WARNING]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed
util.py[DEBUG]: Running module write-files (<module 'cloudinit.config.cc_write_files' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py'>) failed
我需要的实际原因defer
在跟踪中找到。这是因为我需要将文件 chown'd 给ecarroll
cloud-init 尚未创建的用户(),
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1380, in chownbyname
uid = pwd.getpwnam(user).pw_uid
KeyError: "getpwnam(): name not found: 'ecarroll'"
我在 Ubuntu 20.04.4 LTS 上。
您需要更新到 cloud-init v21.4,这是将 defer 属性添加到 write_files 的版本。
检查您正在运行的版本
cloud-init -v
, 与head -n 1 /var/log/cloud-init.log
见上面布雷特的回答如果这两个不一致,您可能需要查看为什么日志文件中的 cloud-init 版本与二进制文件中的版本冲突?
下面显示什么?
如果没有 defer 语句,我在 Ubuntu 20.04 cloud-init 22.1 上看到了类似的异常:
如果我添加延迟,它会按预期工作:
请注意,我的日志中不存在“其他属性”警告。此警告表明您在 cloud-config 中使用了 jsonschema 验证器不知道的密钥。在这种情况下,这表明正在运行的版本早于
defer
关键字。请注意,在您报告的回溯中,
getpwname
位于第 1380 行。20.04 上最新的 cloud-init 版本是21.2 版本。
到21.3 版,该调用
getpwname
已被推回第 1429 行。根据以上信息,我假设 cloud-init 运行的版本不支持
defer
,后来升级到 21.4。如果您想尝试重新运行所有 cloud-init 阶段,您始终可以尝试 a
cloud-init clean --logs
然后重新启动。这应该删除 cloud-init 工件。您可能会发现上述lxc
命令有助于在云中运行之前在本地试用模块。