クラウド初期化には非常に単純なスタンザがあります。
write_files:
- path: /home/ecarroll/.zshrc
content: |
source ~/powerlevel10k/powerlevel10k.zsh-theme
owner: ecarroll:ecarroll
permissions: '0644'
defer: true
このdefer
フラグは次に記録されます。クラウド初期化:サインを書く文書、
defer:(ブール値)ユーザーが作成され、パッケージがインストールされたら、「最終」ステップまでファイルの書き込みを延期します。基本:
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
追跡で見つけることができます。ecarroll
cloud-initがまだ作成していないユーザーにファイルをchown'する必要があるためです()
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を使用しています。
答え1
write_filesにdefer属性を追加するcloud-init v21.4に更新する必要があります。
実行しているバージョンを確認してください。
cloud-init -v
とhead -n 1 /var/log/cloud-init.log
上記のBrettの答えを参照してください。
これら2つが同意しない場合は、確認してみることもできます。ログファイルのcloud-initバージョンがバイナリのバージョンと競合するのはなぜですか?
答え2
以下は何を示していますか?
head -n 1 /var/log/cloud-init.log
defer 文がない場合、Ubuntu 20.04 cloud-init 22.1 でも同様の例外が表示されます。
arc~ cat ~/my-user-data
#cloud-config
users:
- default
- name: ecarroll
write_files:
- path: /home/ecarroll/.zshrc
content: |
test content
owner: ecarroll:ecarroll
permissions: '0644'
arc~ lxc init ubuntu:focal ecarroll -c user.user-data="$(cat ~/my-user-data)"
Creating ecarroll
arc~ lxc start ecarroll
arc~ lxc exec ecarroll -- grep -A12 Traceback /var/log/cloud-init.log
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1430, in chownbyname
uid = pwd.getpwnam(user).pw_uid
KeyError: "getpwnam(): name not found: 'ecarroll'"
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 976, in _run_modules
ran, _r = cc.run(run_name, mod.handle, func_args,
File "/usr/lib/python3/dist-packages/cloudinit/cloud.py", line 54, in run
return self._runners.run(name, functor, args, freq, clear_on_fail)
File "/usr/lib/python3/dist-packages/cloudinit/helpers.py", line 186, in run
results = functor(*args)
File "/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py", line 205, in handle
write_files(name, filtered_files)
File "/usr/lib/python3/dist-packages/cloudinit/config/cc_write_files.py", line 245, in write_files
util.chownbyname(path, u, g)
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1434, in chownbyname
raise OSError("Unknown user or group: %s" % (e)) from e
arc~ lxc exec ecarroll -- grep "Additional properties" /var/log/cloud-init.log
arc~ lxc stop ecarroll && lxc rm ecarroll
遅延を追加すると、期待どおりに機能します。
arc~ cat ~/my-user-data
#cloud-config
users:
- default
- name: ecarroll
write_files:
- path: /home/ecarroll/.zshrc
content: |
test content
owner: ecarroll:ecarroll
permissions: '0644'
defer: true
arc~ lxc init ubuntu:focal ecarroll -c user.user-data="$(cat ~/my-user-data)"
Creating ecarroll
arc~ lxc start ecarroll
arc~ lxc exec ecarroll -- grep -A12 Traceback /var/log/cloud-init.log
arc~ lxc exec ecarroll -- grep -A12 "Additional properties" /var/log/cloud-init.log
arc~ lxc shell ecarroll
root@ecarroll:~# cat /home/ecarroll/.zshrc
test content
root@ecarroll:~# exit
logout
arc~ lxc stop ecarroll && lxc rm ecarroll
私のログには「その他の属性」警告はありません。この警告は、jsonschemaバリデータで未知のクラウド設定のキーを使用していることを示します。この場合、実行中のバージョンがdefer
キーワードより前のバージョンであることを示します。
報告したトレースバックはgetpwname
1380行にあります。
20.04の最新バージョンのcloud-initは次のとおりです。バージョン 21.2。
渡すバージョン 21.3、通話がgetpwname
1429回行に再プッシュされました。
上記の情報に基づいて、cloud-initがサポートされていないバージョンで実行されており、defer
その後21.4にアップグレードされたとします。
すべてのcloud-initステップを再実行するには、いつでも試してcloud-init clean --logs
から再起動してください。これにより、cloud-initアーティファクトが削除されます。lxc
上記のコマンドは、クラウドでモジュールを実行する前にローカルでモジュールを試すのに役立ちます。