cloud-init.logにwrite_files.0が表示されます。他の属性は許可されていません(「遅延」は予期しないことです)。

cloud-init.logにwrite_files.0が表示されます。他の属性は許可されていません(「遅延」は予期しないことです)。

クラウド初期化には非常に単純なスタンザがあります。

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追跡で見つけることができます。ecarrollcloud-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キーワードより前のバージョンであることを示します。

報告したトレースバックはgetpwname1380行にあります。

20.04の最新バージョンのcloud-initは次のとおりです。バージョン 21.2

渡すバージョン 21.3、通話がgetpwname1429回行に再プッシュされました。

上記の情報に基づいて、cloud-initがサポートされていないバージョンで実行されており、deferその後21.4にアップグレードされたとします。

すべてのcloud-initステップを再実行するには、いつでも試してcloud-init clean --logsから再起動してください。これにより、cloud-initアーティファクトが削除されます。lxc上記のコマンドは、クラウドでモジュールを実行する前にローカルでモジュールを試すのに役立ちます。

関連情報